Index: .gitignore
===================================================================
--- .gitignore	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ .gitignore	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -34,2 +34,7 @@
 # generated by bison and lex from cfa.yy and lex.ll, respectively
 src/Parser/parser.output
+
+# generated by xfig for user manual
+doc/user/Cdecl.tex
+doc/user/pointer1.tex
+doc/user/pointer2.tex
Index: INSTALL
===================================================================
--- INSTALL	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ INSTALL	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -3,6 +3,6 @@
 
 Cforall is built using GNU Make and the GNU Autoconf system.  It also requires
-g++ version 4, bison and flex.  On systems where GNU Make is the default make
-it may suffice to build the system by entering the commands
+g++ version >= 4.6, bison and flex.  On systems where GNU Make is the default
+make, the system is built by entering the commands:
 
 	./configure
@@ -17,9 +17,9 @@
 
 --prefix=/some/directory controls the path prefix common to all installed
-  cfa-cc components.  Some components will be installed in /some/directory/bin,
+  cfa-cc components.  Some components are installed in /some/directory/bin,
   others in /some/directory/lib.  If unspecified, this defaults to /usr/local.
-  If you wish to use (a subdirectory of) your home directory, ${HOME}/some/dir 
-  works, but it is important not to put quotes around the directory path; 
-  Cforall may appear to build, but the installed version may not work properly.
+  To use (a subdirectory of) your home directory, ${HOME}/some/dir works, but
+  it is important not to put quotes around the directory path; Cforall may
+  appear to build, but the installed version may not work properly.
 
 --with-backend-compiler=PROGRAM specifies the installed path of gcc.  It
Index: Jenkins/FullBuild
===================================================================
--- Jenkins/FullBuild	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ Jenkins/FullBuild	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -14,8 +14,13 @@
 			  name: 'buildArchitecture', 			\
 			  value: arch]					\
-		]
+		],								\
+		propagate: false
 
 	echo(result.result)
-	echo(result.absoluteUrl)
+
+	if(result.result != 'SUCCESS') {
+		sh("wget -q -O - ${result.absoluteUrl}/consoleText")
+		error(result.result)
+	}
 }
 
@@ -32,4 +37,6 @@
 		checkout scm
 
+		collect_git_info()
+
 		//parse git logs to find what changed
 		sh "git remote > ${out_dir}/GIT_REMOTE"
@@ -41,5 +48,22 @@
 		}
 
-		sh "git push DoLang ${gitRefNewValue}:master"
+		//sh "GIT_SSH_COMMAND=\"ssh -v\" git push DoLang ${gitRefNewValue}:master"
+		echo('BUILD NOT PUSH SINCE DO-LANG SERVER WAS DOWN')
+}
+
+//Helper routine to collect information about the git history
+def collect_git_info() {
+
+	//create the temporary output directory in case it doesn't already exist
+	def out_dir = pwd tmp: true
+	sh "mkdir -p ${out_dir}"
+
+	//parse git logs to find what changed
+	dir("../Cforall_Full_Build@script") {
+		sh "git reflog > ${out_dir}/GIT_COMMIT"
+	}
+	git_reflog = readFile("${out_dir}/GIT_COMMIT")
+	gitRefOldValue = (git_reflog =~ /moving from (.+) to (.+)/)[0][1]
+	gitRefNewValue = (git_reflog =~ /moving from (.+) to (.+)/)[0][2]
 }
 
@@ -49,4 +73,6 @@
 
 node ('master') {
+	def err = null
+
 	try {
 		//Prevent the build from exceeding 30 minutes
@@ -78,12 +104,14 @@
 	//attach the build log to the email
 	catch (Exception caughtError) {
+		echo('error caught')
+
 		//rethrow error later
 		err = caughtError
 
 		//Store the result of the build log
-		currentBuild.result = "${status_prefix} FAILURE".trim()
+		currentBuild.result = 'FAILURE'
 
 		//Send email to notify the failure
-		promote_email(currentBuild.result)
+		promote_failure_email()
 	}
 
@@ -100,5 +128,7 @@
 
 //Email notification on a full build failure
-def promote_email(String status) {
+def promote_failure_email() {
+	echo('notifying users')
+
 	//Since tokenizer doesn't work, figure stuff out from the environnement variables and command line
 	//Configurations for email format
@@ -113,5 +143,5 @@
 - Status --------------------------------------------------------------
 
-PROMOTE FAILURE - ${status}
+PROMOTE FAILURE
 """
 
Index: doc/LaTeXmacros/common.tex
===================================================================
--- doc/LaTeXmacros/common.tex	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ doc/LaTeXmacros/common.tex	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -11,18 +11,16 @@
 %% Created On       : Sat Apr  9 10:06:17 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Tue Jul 12 20:37:57 2016
-%% Update Count     : 206
+%% Last Modified On : Sun Aug 14 08:27:29 2016
+%% Update Count     : 231
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 \setlength{\textheight}{9in}
 %\oddsidemargin 0.0in
-\renewcommand{\topfraction}{0.8}	% float must be greater than X of the page before it is forced onto its own page
-\renewcommand{\bottomfraction}{0.8}	% float must be greater than X of the page before it is forced onto its own page
+\renewcommand{\topfraction}{0.8}		% float must be greater than X of the page before it is forced onto its own page
+\renewcommand{\bottomfraction}{0.8}		% float must be greater than X of the page before it is forced onto its own page
 \renewcommand{\floatpagefraction}{0.8}	% float must be greater than X of the page before it is forced onto its own page
-\renewcommand{\textfraction}{0.0}	% the entire page maybe devoted to floats with no text on the page at all
-
-\lefthyphenmin=4
+\renewcommand{\textfraction}{0.0}		% the entire page maybe devoted to floats with no text on the page at all
+
+\lefthyphenmin=4						% hyphen only after 4 characters
 \righthyphenmin=4
 
@@ -38,8 +36,9 @@
 % Names used in the document.
 
-\newcommand{\CFA}{C$\mathbf\forall$\xspace}              % set language symbolic name
-\newcommand{\CFL}{Cforall\xspace}                        % set language text name
+\newcommand{\CFA}{C$\mathbf\forall$\xspace} % set language symbolic name
+\newcommand{\CFL}{Cforall\xspace}		% set language text name
 \newcommand{\CC}{\rm C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name
-\def\c11{ISO/IEC C} % C11 name (cannot have numbers in latex command name)
+\newcommand{\CCeleven}{\rm C\kern-.1em\hbox{+\kern-.25em+}11\xspace} % C++11 symbolic name
+\newcommand{\Celeven}{C11\xspace}		% C11 symbolic name
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -51,5 +50,5 @@
 \setlength{\parindentlnth}{\parindent}
 
-\newlength{\gcolumnposn}
+\newlength{\gcolumnposn}				% temporary hack because lstlisting does handle tabs correctly
 \newlength{\columnposn}
 \setlength{\gcolumnposn}{2.5in}
@@ -62,6 +61,6 @@
 %\patchcmd{\lsthk@TextStyle}{\let\lst@DefEsc\@empty}{}{}{\errmessage{failed to patch}}
 
-\usepackage{pslatex}									% reduce size of san serif font
-\usepackage{relsize}                                    % must be after change to small or selects old size
+\usepackage{pslatex}					% reduce size of san serif font
+\usepackage{relsize}					% must be after change to small or selects old size
 
 % reduce size of chapter/section titles
@@ -119,12 +118,13 @@
 
 % inline text and lowercase index: \Index{inline and lowercase index text}
+\newcommand{\Index}{\@ifstar\@sIndex\@Index}
 % inline text and as-in index: \Index[as-is index text]{inline text}
+\newcommand{\@Index}[2][\@empty]{\lowercase{\def\temp{#2}}#2\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi}
 % inline text but index with different as-is text: \Index[index text]{inline text}
-\newcommand{\Index}{\@ifstar\@sIndex\@Index}
-\newcommand{\@Index}[2][\@empty]{\lowercase{\def\temp{#2}}#2\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi}
 \newcommand{\@sIndex}[2][\@empty]{#2\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi}
 
-% cannot use ©
+% inline text and code index (cannot use ©)
 \newcommand{\Indexc}[1]{\lstinline$#1$\index{#1@\lstinline$#1$}}
+% code index (cannot use ©)
 \newcommand{\indexc}[1]{\index{#1@\lstinline$#1$}}
 
@@ -136,4 +136,25 @@
 \newcommand{\@newterm}[2][\@empty]{\lowercase{\def\temp{#2}}{\newtermFontInline{#2}}\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi}
 \newcommand{\@snewterm}[2][\@empty]{{\newtermFontInline{#2}}\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi}
+
+% Latin abbreviation
+\newcommand{\abbrevFont}{\textit}	% set empty for no italics
+\newcommand*{\eg}{%
+	\@ifnextchar{,}{\abbrevFont{e}.\abbrevFont{g}.}%
+		{\@ifnextchar{:}{\abbrevFont{e}.\abbrevFont{g}.}%
+			{\abbrevFont{e}.\abbrevFont{g}.,\xspace}}%
+}%
+\newcommand*{\ie}{%
+	\@ifnextchar{,}{\abbrevFont{i}.\abbrevFont{e}.}%
+		{\@ifnextchar{:}{\abbrevFont{i}.\abbrevFont{e}.}%
+			{\abbrevFont{i}.\abbrevFont{e}.,\xspace}}%
+}%
+\newcommand*{\etc}{%
+	\@ifnextchar{.}{\abbrevFont{etc}}%
+        {\abbrevFont{etc}.\xspace}%
+}%
+\newcommand{\etal}{%
+	\@ifnextchar{.}{\abbrevFont{et~al}}%
+	        {\abbrevFont{et al}.\xspace}%
+}%
 \makeatother
 
@@ -144,4 +165,5 @@
 	\endlist
 }% quote2
+
 \newenvironment{rationale}{%
   \begin{quote2}\noindent$\Box$\enspace
@@ -187,5 +209,5 @@
 \newcommand{\VPageref}[2][page]{\ifx#1\@empty\else{#1}\nobreakspace\fi\pageref{#2}}
 
-% Go programming language
+% Go programming language: https://github.com/julienc91/listings-golang/blob/master/listings-golang.sty
 \lstdefinelanguage{Golang}{
 	morekeywords=[1]{package,import,func,type,struct,return,defer,panic, recover,select,var,const,iota,},%
@@ -203,9 +225,9 @@
 }
 
-% CFA programming language, based on ANSI C
+% CFA programming language, based on ANSI C (with some gcc additions)
 \lstdefinelanguage{CFA}[ANSI]{C}{
 	morekeywords={_Alignas,_Alignof,__alignof,__alignof__,asm,__asm,__asm__,_At,_Atomic,__attribute,__attribute__,auto,
 		_Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__,
-		fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,
+		fallthrough,fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,
 		_Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,},
 }%
@@ -214,18 +236,18 @@
 language=CFA,
 columns=fullflexible,
-basicstyle=\linespread{0.9}\sf,
-stringstyle=\tt,
-tabsize=4,
-xleftmargin=\parindentlnth,
-extendedchars=true,
-escapechar=§,
-mathescape=true,
-keepspaces=true,
-showstringspaces=false,
-showlines=true,
-aboveskip=4pt,
+basicstyle=\linespread{0.9}\sf,			% reduce line spacing and use sanserif font
+stringstyle=\tt,						% use typewriter font
+tabsize=4,								% 4 space tabbing
+xleftmargin=\parindentlnth,				% indent code to paragraph indentation
+extendedchars=true,						% allow ASCII characters in the range 128-255
+escapechar=§,							% escape to latex in CFA code
+mathescape=true,						% allow $...$ LaTeX math escapes in code
+%keepspaces=true,						% 
+showstringspaces=false,					% do not show spaces with cup
+showlines=true,							% show blank lines at end of code
+aboveskip=4pt,							% spacing above/below code block
 belowskip=3pt,
-moredelim=**[is][\color{red}]{®}{®}, % red highlighting
-moredelim=**[is][\color{blue}]{ß}{ß}, % blue highlighting
+moredelim=**[is][\color{red}]{®}{®},	% red highlighting
+moredelim=**[is][\color{blue}]{ß}{ß},	% blue highlighting
 moredelim=**[is][\color{OliveGreen}]{¢}{¢}, % green highlighting
 moredelim=[is][\lstset{keywords={}}]{¶}{¶}, % temporarily turn off keywords
@@ -233,5 +255,5 @@
 literate={-}{\raisebox{-0.15ex}{\texttt{-}}}1 {^}{\raisebox{0.6ex}{$\scriptscriptstyle\land\,$}}1
 	{~}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}}1 {_}{\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}1 {`}{\ttfamily\upshape\hspace*{-0.1ex}`}1
-	{<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2 {...}{$\dots$}2,
+	{<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2,
 }%
 
@@ -241,5 +263,5 @@
 \renewcommand\thebibliography[1]{
   \Oldthebibliography{#1}
-  \setlength{\parskip}{0pt}			% reduce vertical spacing between references
+  \setlength{\parskip}{0pt}				% reduce vertical spacing between references
   \setlength{\itemsep}{5pt plus 0.3ex}
 }%
Index: doc/aaron_comp_II/.gitignore
===================================================================
--- doc/aaron_comp_II/.gitignore	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
+++ doc/aaron_comp_II/.gitignore	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -0,0 +1,14 @@
+# generated by latex
+*.aux
+*.bbl
+*.blg
+*.brf
+*.dvi
+*.idx
+*.ilg
+*.ind
+*.log
+*.out
+*.pdf
+*.ps
+*.toc
Index: doc/aaron_comp_II/Makefile
===================================================================
--- doc/aaron_comp_II/Makefile	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
+++ doc/aaron_comp_II/Makefile	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -0,0 +1,78 @@
+## Define the appropriate configuration variables.
+
+TeXLIB = .:../LaTeXmacros:../LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/:
+LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error
+BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
+
+## Define the text source files.
+
+SOURCES = ${addsuffix .tex, \
+comp_II \
+}
+
+FIGURES = ${addsuffix .tex, \
+}
+
+PICTURES = ${addsuffix .pstex, \
+}
+
+PROGRAMS = ${addsuffix .tex, \
+}
+
+GRAPHS = ${addsuffix .tex, \
+}
+
+## Define the documents that need to be made.
+
+DOCUMENT = comp_II.pdf
+
+# Directives #
+
+all : ${DOCUMENT}
+
+clean :
+	rm -f *.bbl *.aux *.dvi *.idx *.ilg *.ind *.brf *.out *.log *.toc *.blg *.pstex_t *.cf \
+		${FIGURES} ${PICTURES} ${PROGRAMS} ${GRAPHS} ${basename ${DOCUMENT}}.ps ${DOCUMENT}
+
+# File Dependencies #
+
+${DOCUMENT} : ${basename ${DOCUMENT}}.ps
+	ps2pdf $<
+
+${basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi
+	dvips $< -o $@
+
+${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \
+		../LaTeXmacros/common.tex ../LaTeXmacros/indexstyle ../bibliography/cfa.bib
+	# Conditionally create an empty *.ind (index) file for inclusion until makeindex is run.
+	if [ ! -r ${basename $@}.ind ] ; then touch ${basename $@}.ind ; fi
+	# Must have *.aux file containing citations for bibtex
+	if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename $@}.tex ; fi
+	-${BibTeX} ${basename $@}
+	# Some citations reference others so run steps again to resolve these citations
+	${LaTeX} ${basename $@}.tex
+	-${BibTeX} ${basename $@}
+	# Make index from *.aux entries and input index at end of document
+	makeindex -s ../LaTeXmacros/indexstyle ${basename $@}.idx
+	${LaTeX} ${basename $@}.tex
+	# Run again to get index title into table of contents
+	${LaTeX} ${basename $@}.tex
+
+predefined :
+	sed -f predefined.sed ${basename ${DOCUMENT}}.tex > ${basename $@}.cf
+
+## Define the default recipes.
+
+%.tex : %.fig
+	fig2dev -L eepic $< > $@
+
+%.ps : %.fig
+	fig2dev -L ps $< > $@
+
+%.pstex : %.fig
+	fig2dev -L pstex $< > $@
+	fig2dev -L pstex_t -p $@ $< > $@_t
+
+# Local Variables: #
+# compile-command: "make" #
+# End: #
Index: doc/aaron_comp_II/comp_II.tex
===================================================================
--- doc/aaron_comp_II/comp_II.tex	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
+++ doc/aaron_comp_II/comp_II.tex	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -0,0 +1,603 @@
+% inline code ©...© (copyright symbol) emacs: C-q M-)
+% red highlighting ®...® (registered trademark symbol) emacs: C-q M-.
+% blue highlighting ß...ß (sharp s symbol) emacs: C-q M-_
+% green highlighting ¢...¢ (cent symbol) emacs: C-q M-"
+% LaTex escape §...§ (section symbol) emacs: C-q M-'
+% keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^
+% math escape $...$ (dollar symbol)
+
+\documentclass[twoside,11pt]{article}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Latex packages used in the document (copied from CFA user manual).
+\usepackage[T1]{fontenc}                                % allow Latin1 (extended ASCII) characters
+\usepackage{textcomp}
+\usepackage[latin1]{inputenc}
+\usepackage{fullpage,times,comment}
+\usepackage{epic,eepic}
+\usepackage{upquote}									% switch curled `'" to straight
+\usepackage{calc}
+\usepackage{xspace}
+\usepackage{graphicx}
+\usepackage{varioref}									% extended references
+\usepackage{listings}									% format program code
+\usepackage[flushmargin]{footmisc}						% support label/reference in footnote
+\usepackage{latexsym}                                   % \Box glyph
+\usepackage{mathptmx}                                   % better math font with "times"
+\usepackage[usenames]{color}
+\usepackage[pagewise]{lineno}
+\renewcommand{\linenumberfont}{\scriptsize\sffamily}
+\input{common}                                          % bespoke macros used in the document
+\usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref}
+\usepackage{breakurl}
+\renewcommand{\UrlFont}{\small\sf}
+
+\setlength{\topmargin}{-0.45in}							% move running title into header
+\setlength{\headsep}{0.25in}
+
+\usepackage{caption}
+\usepackage{subcaption}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newsavebox{\LstBox}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\title{
+\Huge \vspace*{1in} Efficient Type Resolution in \CFA \\
+\huge \vspace*{0.25in} PhD Comprehensive II Research Proposal
+\vspace*{1in}
+}
+
+\author{
+\huge Aaron Moss \\
+\Large \vspace*{0.1in} \texttt{a3moss@uwaterloo.ca} \\
+\Large Cheriton School of Computer Science \\
+\Large University of Waterloo
+}
+
+\date{
+\today
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newcommand{\bigO}[1]{O\!\left( #1 \right)}
+
+\begin{document}
+\pagestyle{headings}
+% changed after setting pagestyle
+\renewcommand{\sectionmark}[1]{\markboth{\thesection\quad #1}{\thesection\quad #1}}
+\renewcommand{\subsectionmark}[1]{\markboth{\thesubsection\quad #1}{\thesubsection\quad #1}}
+\pagenumbering{roman}
+\linenumbers                                            % comment out to turn off line numbering
+
+\maketitle
+\thispagestyle{empty}
+
+\clearpage
+\thispagestyle{plain}
+\pdfbookmark[1]{Contents}{section}
+\tableofcontents
+
+\clearpage
+\thispagestyle{plain}
+\pagenumbering{arabic}
+
+\section{Introduction}
+
+\CFA\footnote{Pronounced ``C-for-all'', and written \CFA or \CFL.} is an evolutionary modernization of the C programming language currently being designed and built at the University of Waterloo by a team led by Peter Buhr. 
+\CFA both fixes existing design problems and adds multiple new features to C, including name overloading, user-defined operators, parametric-polymorphic routines, and type constructors and destructors, among others. 
+The new features make \CFA significantly more powerful and expressive than C, but impose a significant compile-time cost, particularly in the expression resolver, which must evaluate the typing rules of a much more complex type-system.
+
+The primary goal of this research project is to develop a sufficiently performant expression resolution algorithm, experimentally validate its performance, and integrate it into CFA, the \CFA reference compiler.
+Secondary goals of this project include the development of various new language features for \CFA: parametric-polymorphic (``generic'') types have already been designed and implemented, and reference types and user-defined conversions are under design consideration. 
+An experimental performance-testing architecture for resolution algorithms is under development to determine the relative performance of different expression resolution algorithms, as well as the compile-time cost of adding various new features to the \CFA type-system. 
+More broadly, this research should provide valuable data for implementers of compilers for other programming languages with similarly powerful static type-systems.
+
+\section{\CFA}
+
+To make the scope of the proposed expression resolution problem more explicit, it is necessary to define the features of both C and \CFA (both current and proposed) that affect this algorithm. 
+In some cases the interactions of multiple features make expression resolution a significantly more complex problem than any individual feature would; in other cases a feature that does not by itself add any complexity to expression resolution triggers previously rare edge cases more frequently.
+
+It is important to note that \CFA is not an object-oriented language.
+\CFA does have a system of (possibly implicit) type conversions derived from C's type conversions; while these conversions may be thought of as something like an inheritance hierarchy the underlying semantics are significantly different and such an analogy is loose at best. 
+Particularly, \CFA has no concept of ``subclass'', and thus no need to integrate an inheritance-based form of polymorphism with its parametric and overloading-based polymorphism. 
+The graph structure of the \CFA type conversions is also markedly different than an inheritance graph; it has neither a top nor a bottom type, and does not satisfy the lattice properties typical of inheritance graphs.
+
+\subsection{Polymorphic Functions}
+The most significant feature \CFA adds is parametric-polymorphic functions. 
+Such functions are written using a ©forall© clause (which gives the language its name):
+\begin{lstlisting}
+®forall(otype T)®
+T identity(T x) {
+    return x;
+}
+
+int forty_two = identity(42); // T is bound to int, forty_two == 42
+\end{lstlisting}
+The ©identity© function above can be applied to any complete object type (or ``©otype©''). 
+The type variable ©T© is transformed into a set of additional implicit parameters to ©identity© which encode sufficient information about ©T© to create and return a variable of that type. 
+The current \CFA implementation passes the size and alignment of the type represented by an ©otype© parameter, as well as an assignment operator, constructor, copy constructor and destructor. 
+Here, the runtime cost of polymorphism is spread over each polymorphic call, due to passing more arguments to polymorphic functions; preliminary experiments have shown this overhead to be similar to \CC virtual function calls. 
+Determining if packaging all polymorphic arguments to a function into a virtual function table would reduce the runtime overhead of polymorphic calls is an open research question. 
+
+Since bare polymorphic types do not provide a great range of available operations, \CFA also provides a \emph{type assertion} mechanism to provide further information about a type:
+\begin{lstlisting}
+forall(otype T ®| { T twice(T); }®)
+T four_times(T x) {
+    return twice( twice(x) );
+}
+
+double twice(double d) { return d * 2.0; } // (1)
+
+double magic = four_times(10.5); // T is bound to double, uses (1) to satisfy type assertion
+\end{lstlisting}
+These type assertions may be either variable or function declarations that depend on a polymorphic type variable. 
+©four_times© can only be called with an argument for which there exists a function named ©twice© that can take that argument and return another value of the same type; a pointer to the appropriate ©twice© function is passed as an additional implicit parameter to the call to ©four_times©.
+
+Monomorphic specializations of polymorphic functions can themselves be used to satisfy type assertions. 
+For instance, ©twice© could have been defined using the \CFA syntax for operator overloading as:
+\begin{lstlisting}
+forall(otype S | { ®S ?+?(S, S);® })
+S twice(S x) { return x + x; }  // (2)
+\end{lstlisting} 
+This version of ©twice© works for any type ©S© that has an addition operator defined for it, and it could have been used to satisfy the type assertion on ©four_times©. 
+The compiler accomplishes this by creating a wrapper function calling ©twice // (2)© with ©S© bound to ©double©, then providing this wrapper function to ©four_times©\footnote{©twice // (2)© could also have had a type parameter named ©T©; \CFA specifies renaming of the type parameters, which would avoid the name conflict with the type variable ©T© of ©four_times©.}. 
+
+Finding appropriate functions to satisfy type assertions is essentially a recursive case of expression resolution, as it takes a name (that of the type assertion) and attempts to match it to a suitable declaration in the current scope. 
+If a polymorphic function can be used to satisfy one of its own type assertions, this recursion may not terminate, as it is possible that function is examined as a candidate for its own type assertion unboundedly repeatedly. 
+To avoid infinite loops, the current CFA compiler imposes a fixed limit on the possible depth of recursion, similar to that employed by most \CC compilers for template expansion; this restriction means that there are some semantically well-typed expressions that cannot be resolved by CFA. 
+One area of potential improvement this project proposes to investigate is the possibility of using the compiler's knowledge of the current set of declarations to more precicely determine when further type assertion satisfaction recursion does not produce a well-typed expression.
+
+\subsubsection{Traits}
+\CFA provides \emph{traits} as a means to name a group of type assertions, as in the example below:
+\begin{lstlisting}
+®trait has_magnitude(otype T)® {
+    bool ?<?(T, T);        // comparison operator for T
+    T -?(T);               // negation operator for T
+    void ?{}(T*, zero_t);  // constructor from 0 literal
+};
+
+forall(otype M | has_magnitude(M))
+M abs( M m ) {
+    M zero = 0;  // uses zero_t constructor from trait
+    return m < zero ? -m : m;
+}
+
+forall(otype M | has_magnitude(M))
+M max_magnitude( M a, M b ) {
+    M aa = abs(a), ab = abs(b);
+    return aa < ab ? b : a; 
+}
+\end{lstlisting}
+
+Semantically, traits are simply a named lists of type assertions, but they may be used for many of the same purposes that interfaces in Java or abstract base classes in \CC are used for.
+Unlike Java interfaces or \CC base classes, \CFA types do not explicitly state any inheritance relationship to traits they satisfy; this can be considered a form of structural inheritance, similar to interface implementation in Go, as opposed to the nominal inheritance model of Java and \CC. 
+Nominal inheritance can be simulated with traits using marker variables or functions:
+\begin{lstlisting}
+trait nominal(otype T) {
+    ®T is_nominal;®
+};
+
+int is_nominal;  // int now satisfies the nominal trait
+{
+    char is_nominal; // char satisfies the nominal trait
+}
+// char no longer satisfies the nominal trait here  
+\end{lstlisting}
+
+Traits, however, are significantly more powerful than nominal-inheritance interfaces; firstly, due to the scoping rules of the declarations which satisfy a trait's type assertions, a type may not satisfy a trait everywhere that the type is declared, as with ©char© and the ©nominal© trait above. 
+Secondly, traits may be used to declare a relationship between multiple types, a property which may be difficult or impossible to represent in nominal-inheritance type systems:
+\begin{lstlisting}
+trait pointer_like(®otype Ptr, otype El®) {
+    lvalue El *?(Ptr); // Ptr can be dereferenced into a modifiable value of type El
+}
+
+struct list {
+    int value;
+    list *next;  // may omit "struct" on type names
+};
+
+typedef list* list_iterator;
+
+lvalue int *?( list_iterator it ) {
+    return it->value;
+}
+\end{lstlisting}
+
+In the example above, ©(list_iterator, int)© satisfies ©pointer_like© by the given function, and ©(list_iterator, list)© also satisfies ©pointer_like© by the built-in pointer dereference operator. 
+While a nominal-inheritance system with associated types could model one of those two relationships by making ©El© an associated type of ©Ptr© in the ©pointer_like© implementation, few such systems could model both relationships simultaneously.
+
+The flexibility of \CFA's implicit trait satisfaction mechanism provides programmers with a great deal of power, but also blocks some optimization approaches for expression resolution. 
+The ability of types to begin to or cease to satisfy traits when declarations go into or out of scope makes caching of trait satisfaction judgements difficult, and the ability of traits to take multiple type parameters could lead to a combinatorial explosion of work in any attempt to pre-compute trait satisfaction relationships. 
+On the other hand, the addition of a nominal inheritance mechanism to \CFA's type system or replacement of \CFA's trait satisfaction system with a more object-oriented inheritance model and investigation of possible expression resolution optimizations for such a system may be an interesting avenue of further research.
+
+\subsection{Name Overloading}
+In C, no more than one variable or function in the same scope may share the same name\footnote{Technically, C has multiple separated namespaces, one holding ©struct©, ©union©, and ©enum© tags, one holding labels, one holding typedef names, variable, function, and enumerator identifiers, and one for each ©struct© or ©union© type holding the field names.}, and variable or function declarations in inner scopes with the same name as a declaration in an outer scope hide the outer declaration. 
+This makes finding the proper declaration to match to a variable expression or function application a simple matter of symbol table lookup, which can be easily and efficiently implemented. 
+\CFA, on the other hand, allows overloading of variable and function names, so long as the overloaded declarations do not have the same type, avoiding the multiplication of variable and function names for different types common in the C standard library, as in the following example:
+\begin{lstlisting}
+#include <limits.h>
+
+int max(int a, int b) { return a < b ? b : a; }  // (1)
+double max(double a, double b) { return a < b ? b : a; }  // (2)
+
+int max = INT_MAX;     // (3)
+double max = DBL_MAX;  // (4)
+
+max(7, -max);   // uses (1) and (3), by matching int type of 7 
+max(max, 3.14); // uses (2) and (4), by matching double type of 3.14
+
+max(max, -max);  // ERROR: ambiguous
+int m = max(max, -max); // uses (1) and (3) twice, by return type
+\end{lstlisting}
+
+The presence of name overloading in \CFA means that simple table lookup is insufficient to match identifiers to declarations, and a type matching algorithm must be part of expression resolution.
+
+\subsection{Implicit Conversions}
+In addition to the multiple interpretations of an expression produced by name overloading, \CFA also supports all of the implicit conversions present in C, producing further candidate interpretations for expressions. 
+C does not have a traditionally-defined inheritance hierarchy of types, but the C standard's rules for the ``usual arithmetic conversions'' define which of the built-in types are implicitly convertable to which other types, and the relative cost of any pair of such conversions from a single source type. 
+\CFA adds to the usual arithmetic conversions rules for determining the cost of binding a polymorphic type variable in a function call; such bindings are cheaper than any \emph{unsafe} (narrowing) conversion, \eg ©int© to ©char©, but more expensive than any \emph{safe} (widening) conversion, \eg ©int© to ©double©. 
+
+The expression resolution problem, then, is to find the unique minimal-cost interpretation of each expression in the program, where all identifiers must be matched to a declaration and implicit conversions or polymorphic bindings of the result of an expression may increase the cost of the expression. 
+Note that which subexpression interpretation is minimal-cost may require contextual information to disambiguate. 
+For instance, in the example in the previous subsection, ©max(max, -max)© cannot be unambiguously resolved, but ©int m = max(max, -max);© has a single minimal-cost resolution. 
+©int m = (int)max((double)max, -(double)max)© is also be a valid interpretation, but is not minimal-cost due to the unsafe cast from the ©double© result of ©max© to ©int© (the two ©double© casts function as type ascriptions selecting ©double max© rather than casts from ©int max© to ©double©, and as such are zero-cost).
+
+\subsubsection{User-generated Implicit Conversions}
+One possible additional feature to \CFA included in this research proposal is \emph{user-generated implicit conversions}. 
+Such a conversion system should be simple for programmers to utilize, and fit naturally with the existing design of implicit conversions in C; ideally it would also be sufficiently powerful to encode C's usual arithmetic conversions itself, so that \CFA only has one set of rules for conversions. 
+
+Ditchfield~\cite{Ditchfield:conversions} has laid out a framework for using polymorphic-conversion-constructor functions to create a directed acyclic graph (DAG) of conversions. 
+A monomorphic variant of these functions can be used to mark a conversion arc in the DAG as only usable as the final step in a conversion. 
+With these two types of conversion arcs, separate DAGs can be created for the safe and the unsafe conversions, and conversion cost can be represented as path length through the DAG. 
+\begin{figure}[h]
+\centering
+\includegraphics{conversion_dag}
+\caption{A portion of the implicit conversion DAG for built-in types.}
+\end{figure}
+As can be seen in the example DAG above, there are either safe or unsafe paths between each of the arithmetic types listed; the ``final'' arcs are important both to avoid creating cycles in the signed-unsigned conversions, and to disambiguate potential diamond conversions (\eg, if the ©int© to ©unsigned int© conversion was not marked final there would be two length-two paths from ©int© to ©unsigned long©, and it would be impossible to choose which one; however, since the ©unsigned int© to ©unsigned long© arc can not be traversed after the final ©int© to ©unsigned int© arc, there is a single unambiguous conversion path from ©int© to ©unsigned long©).
+
+Open research questions on this topic include:
+\begin{itemize}
+\item Can a conversion graph be generated that represents each allowable conversion in C with a unique minimal-length path such that the path lengths accurately represent the relative costs of the conversions?
+\item Can such a graph representation can be usefully augmented to include user-defined types as well as built-in types?
+\item Can the graph can be efficiently represented and used in the expression resolver?
+\end{itemize}
+
+\subsection{Constructors and Destructors}
+Rob Shluntz, a current member of the \CFA research team, has added constructors and destructors to \CFA. 
+Each type has an overridable default-generated zero-argument constructor, copy constructor, assignment operator, and destructor; for ©struct© types these functions each call their equivalents on each field of the ©struct©. 
+This affects expression resolution because an ©otype© type variable ©T© implicitly adds four type assertions, one for each of these four functions, so assertion resolution is pervasive in \CFA polymorphic functions, even those without any explicit type assertions. 
+The following example shows the implicitly-generated code in green:
+\begin{lstlisting}
+struct kv {
+    int key;
+    char *value;
+};
+
+¢void ?{}(kv *this) {
+    ?{}(&this->key);
+    ?{}(&this->value);
+}
+void ?{}(kv *this, kv that) {
+    ?{}(&this->key, that.key);
+    ?{}(&this->value, that.value);
+}
+kv ?=?(kv *this, kv that) {
+    ?=?(&this->key, that.key);
+    ?=?(&this->value, that.value);
+    return *this;
+}
+void ^?{}(kv *this) {
+    ^?{}(&this->key);
+    ^?{}(&this->value);
+}¢
+
+forall(otype T ¢| { void ?{}(T*); void ?{}(T*, T); T ?=?(T*, T); void ^?{}(T*); }¢)
+void foo(T);
+\end{lstlisting}
+
+\subsection{Generic Types}
+I have already added a generic type capability to \CFA, designed to efficiently and naturally integrate with \CFA's existing polymorphic functions. 
+A generic type can be declared by placing a ©forall© specifier on a ©struct© or ©union© declaration, and instantiated using a parenthesized list of types after the type name:
+\begin{lstlisting}
+forall(otype R, otype S) struct pair {
+    R first;
+    S second;
+};
+
+forall(otype T)
+T value( pair(const char*, T) *p ) { return p->second; }
+
+pair(const char*, int) p = { "magic", 42 };
+int magic = value( &p );
+\end{lstlisting}
+For \emph{concrete} generic types, that is, those where none of the type parameters depend on polymorphic type variables (like ©pair(const char*, int)© above), the struct is essentially template expanded to a new struct type; for \emph{polymorphic} generic types (such as ©pair(const char*, T)© above), member access is handled by a runtime calculation of the field offset, based on the size and alignment information of the polymorphic parameter type. 
+The default-generated constructors, destructor and assignment operator for a generic type are polymorphic functions with the same list of type parameters as the generic type definition.
+
+Aside from giving users the ability to create more parameterized types than just the built-in pointer, array and function types, the combination of generic types with polymorphic functions and implicit conversions makes the edge case where the resolver may enter an infinite loop much more common, as in the following code example: 
+\begin{lstlisting}
+forall(otype T) struct box { T x; };
+
+void f(void*); // (1)
+
+forall(otype S)
+void f(box(S)* b) { // (2)
+	f(®(void*)0®);
+}
+\end{lstlisting}
+
+The loop in the resolver happens as follows:
+\begin{itemize} 
+\item Since there is an implicit conversion from ©void*© to any pointer type, the highlighted expression can be interpreted as either a ©void*©, matching ©f // (1)©, or a ©box(S)*© for some type ©S©, matching ©f // (2)©.
+\item To determine the cost of the ©box(S)© interpretation, a type must be found for ©S© which satisfies the ©otype© implicit type assertions (assignment operator, default and copy constructors, and destructor); one option is ©box(S2)© for some type ©S2©.
+\item The assignment operator, default and copy constructors, and destructor of ©box(T)© are also polymorphic functions, each of which require the type parameter ©T© to have an assignment operator, default and copy constructors, and destructor. When choosing an interpretation for ©S2©, one option is ©box(S3)©, for some type ©S3©.
+\item The previous step repeats until stopped, with four times as much work performed at each step.
+\end{itemize}
+This problem can occur in any resolution context where a polymorphic function that can satisfy its own type assertions is required for a possible interpretation of an expression with no constraints on its type, and is thus not limited to combinations of generic types with ©void*© conversions, though constructors for generic types often satisfy their own assertions and a polymorphic conversion such as the ©void*© conversion to a polymorphic variable can create an expression with no constraints on its type. 
+As discussed above, the \CFA expression resolver must handle this possible infinite recursion somehow, and it occurs fairly naturally in code like the above that uses generic types. 
+
+\subsection{Tuple Types}
+\CFA adds \emph{tuple types} to C, a syntactic facility for referring to lists of values anonymously or with a single identifier. 
+An identifier may name a tuple, and a function may return one. 
+Particularly relevantly for resolution, a tuple may be implicitly \emph{destructured} into a list of values, as in the call to ©swap© below:
+\begin{lstlisting}
+[char, char] x = [ '!', '?' ];
+int x = 42;
+
+forall(otype T) [T, T] swap( T a, T b ) { return [b, a]; }
+
+x = swap( x ); // destructure [char, char] x into two elements of parameter list
+// cannot use int x for parameter, not enough arguments to swap
+\end{lstlisting}
+Tuple destructuring means that the mapping from the position of a subexpression in the argument list to the position of a paramter in the function declaration is not straightforward, as some arguments may be expandable to different numbers of parameters, like ©x© above.
+
+\subsection{Reference Types}
+I have been designing \emph{reference types} for \CFA, in collaboration with the rest of the \CFA research team. 
+Given some type ©T©, a ©T&© (``reference to ©T©'') is essentially an automatically dereferenced pointer; with these semantics most of the C standard's discussions of lvalues can be expressed in terms of references instead, with the benefit of being able to express the difference between the reference and non-reference version of a type in user code. 
+References preserve C's existing qualifier-dropping lvalue-to-rvalue conversion (\eg a ©const volatile int&© can be implicitly converted to a bare ©int©); the reference proposal also adds a rvalue-to-lvalue conversion to \CFA, implemented by storing the value in a new compiler-generated temporary and passing a reference to the temporary. 
+These two conversions can chain, producing a qualifier-dropping conversion for references, for instance converting a reference to a ©const int© into a reference to a non-©const int© by copying the originally refered to value into a fresh temporary and taking a reference to this temporary, as below:
+\begin{lstlisting} 
+const int magic = 42;
+
+void inc_print( int& x ) { printf("%d\n", ++x); }
+
+print_inc( magic ); // legal; implicitly generated code in green below:
+
+¢int tmp = magic;¢ // copies to safely strip const-qualifier
+¢print_inc( tmp );¢ // tmp is incremented, magic is unchanged
+\end{lstlisting}
+These reference conversions may also chain with the other implicit type conversions. 
+The main implication of this for expression resolution is the multiplication of available implicit conversions, though in a restricted context that may be able to be treated efficiently as a special case.
+
+\subsection{Special Literal Types}
+Another proposal currently under consideration for the \CFA type-system is assigning special types to the literal values ©0© and ©1©. 
+Implicit conversions from these types allow ©0© and ©1© to be considered as values of many different types, depending on context, allowing expression desugarings like ©if ( x ) {}© $\Rightarrow$ ©if ( x != 0 ) {}© to be implemented efficiently and precicely. 
+This approach is a generalization of C's existing behaviour of treating ©0© as either an integer zero or a null pointer constant, and treating either of those values as boolean false. 
+The main implication for expression resolution is that the frequently encountered expressions ©0© and ©1© may have a large number of valid interpretations.
+
+\subsection{Deleted Function Declarations}
+One final proposal for \CFA with an impact on the expression resolver is \emph{deleted function declarations}; in \CCeleven, a function declaration can be deleted as below:
+\begin{lstlisting}
+int somefn(char) = delete;
+\end{lstlisting}
+This feature is typically used in \CCeleven to make a type non-copyable by deleting its copy constructor and assignment operator, or forbidding some interpretations of a polymorphic function by specifically deleting the forbidden overloads. 
+To add a similar feature to \CFA would involve including the deleted function declarations in expression resolution along with the normal declarations, but producing a compiler error if the deleted function was the best resolution. 
+How conflicts should be handled between resolution of an expression to both a deleted and a non-deleted function is a small but open research question.
+
+\section{Expression Resolution}
+The expression resolution problem is determining an optimal match between some combination of argument interpretations and the parameter list of some overloaded instance of a function; the argument interpretations are produced by recursive invocations of expression resolution, where the base case is zero-argument functions (which are, for purposes of this discussion, semantically equivalent to named variables or constant literal expressions). 
+Assuming that the matching between a function's parameter list and a combination of argument interpretations can be done in $\bigO{p^k}$ time, where $p$ is the number of parameters and $k$ is some positive number, if there are $\bigO{i}$ valid interpretations for each subexpression, there will be $\bigO{i}$ candidate functions and $\bigO{i^p}$ possible argument combinations for each expression, so for a single recursive call expression resolution takes $\bigO{i^{p+1} \cdot p^k}$ time if it must compare all combinations, or $\bigO{i(p+1) \cdot p^k}$ time if argument-parameter matches can be chosen independently of each other. 
+Given these bounds, resolution of a single top-level expression tree of depth $d$ takes $\bigO{i^{p+1} \cdot p^{k \cdot d}}$ time under full-combination matching, or $\bigO{i(p+1) \cdot p^{k \cdot d}}$ time for independent-parameter matching\footnote{A call tree has leaves at depth $\bigO{d}$, and each internal node has $\bigO{p}$ fan-out, producing $\bigO{p^d}$ total recursive calls.}.
+
+Expression resolution is somewhat unavoidably exponential in $d$, the depth of the expression tree, and if arguments cannot be matched to parameters independently of each other, expression resolution is also exponential in $p$. 
+However, both $d$ and $p$ are fixed by the programmer, and generally bounded by reasonably small constants. 
+$k$, on the other hand, is mostly dependent on the representation of types in the system and the efficiency of type assertion checking; if a candidate argument combination can be compared to a function parameter list in linear time in the length of the list (\ie $k = 1$), then the $p^{k \cdot d}$ factor is linear in the input size of the source code for the expression, otherwise the resolution algorithm exibits sub-linear performance scaling on code containing more-deeply nested expressions.
+The number of valid interpretations of any subexpression, $i$, is bounded by the number of types in the system, which is possibly infinite, though practical resolution algorithms for \CFA must be able to place some finite bound on $i$, possibly at the expense of type-system completeness. 
+
+The research goal of this project is to develop a performant expression resolver for \CFA; this analysis suggests three primary areas of investigation to accomplish that end. 
+The first area of investigation is efficient argument-parameter matching; Bilson~\cite{Bilson03} mentions significant optimization opportunities available in the current literature to improve on the existing CFA compiler.
+%TODO: look up and lit review 
+The second area of investigation is minimizing dependencies between argument-parameter matches; the current CFA compiler attempts to match entire argument combinations against functions at once, potentially attempting to match the same argument against the same parameter multiple times. 
+Whether the feature set of \CFA admits an expression resolution algorithm where arguments can be matched to parameters independently of other arguments in the same function application is an area of open research; polymorphic type paramters produce enough of a cross-argument dependency that the problem is not trivial. 
+If cross-argument resolution dependencies cannot be completely eliminated, effective caching strategies to reduce duplicated work between equivalent argument-parameter matches in different combinations may mitigate the asymptotic defecits of the whole-combination matching approach. 
+The final area of investigation is heuristics and algorithmic approaches to reduce the number of argument interpretations considered in the common case; if argument-parameter matches cannot be made independent, even small reductions in $i$ should yield significant reductions in the $i^{p+1}$ resolver runtime factor. 
+
+The discussion below presents a number of largely orthagonal axes for expression resolution algorithm design to be investigated, noting prior work where applicable. 
+Though some of the proposed improvements to the expression resolution algorithm are based on heuristics rather than asymptoticly superior algorithms, it should be noted that programmers often employ idioms and other programming patterns to reduce the mental burden of producing correct code, and if these patterns can be identified and exploited by the compiler then the significant reduction in expression resolution time for common, idiomatic expressions should result in lower total compilation time even for code including difficult-to-resolve expressions that push the expression resolver to its theoretical worst case.
+
+\subsection{Argument-Parameter Matching}
+The first axis for consideration is argument-parameter matching direction --- whether the type matching for a candidate function to a set of candidate arguments is directed by the argument types or the parameter types. 
+For programming languages without implicit conversions, argument-parameter matching is essentially the entirety of the expression resolution problem, and is generally referred to as ``overload resolution'' in the literature.
+All expression resolution algorithms form a DAG of interpretations, some explicitly, some implicitly; in this DAG, arcs point from function-call interpretations to argument interpretations, as below:
+\begin{figure}[h]
+\centering
+\begin{subfigure}[h]{2in}
+\begin{lstlisting}
+int *p;  // $p_i$
+char *p; // $p_c$ 
+
+double *f(int*, int*); // $f_d$
+char *f(char*, int*); // $f_c$
+
+f( f( p, p ), p );
+\end{lstlisting}
+\end{subfigure}~\begin{subfigure}[h]{2in}
+\includegraphics{resolution_dag}
+\end{subfigure}
+\caption{Resolution DAG for a simple expression. Functions that do not have a valid argument matching are covered with an \textsf{X}.}\label{fig:res_dag}
+\end{figure}
+
+Note that some interpretations may be part of more than one super-interpretation, as with $p_i$ in the bottom row, while some valid subexpression interpretations, like $f_d$ in the middle row, are not used in any interpretation of their containing expression.
+
+\subsubsection{Argument-directed (Bottom-up)}
+Baker's algorithm for expression resolution~\cite{Baker82} pre-computes argument candidates, from the leaves of the expression tree up.
+For each candidate function, Baker attempts to match argument types to parameter types in sequence, failing if any parameter cannot be matched.
+
+Bilson~\cite{Bilson03} similarly pre-computes argument candidates in the original \CFA compiler, but then explicitly enumerates all possible argument combinations for a multi-parameter function; these argument combinations are matched to the parameter types of the candidate function as a unit rather than individual arguments.
+This approach is less efficient than Baker's approach, as the same argument may be compared to the same parameter many times, but allows a more straightforward handling of polymorphic type-binding and multiple return-types.
+It is possible the efficiency losses here relative to Baker could be significantly reduced by keeping a memoized cache of argument-parameter type comparisons and reading previously-seen argument-parameter matches from this cache rather than recomputing them.
+
+\subsubsection{Parameter-directed (Top-down)}
+Unlike Baker and Bilson, Cormack's algorithm~\cite{Cormack81} requests argument candidates that match the type of each parameter of each candidate function, from the top-level expression down; memoization of these requests is presented as an optimization.
+As presented, this algorithm requires the result of the expression to have a known type, though an algorithm based on Cormack's could reasonably request a candidate set of any return type, though such a set may be quite large.
+
+\subsubsection{Hybrid}
+This proposal includes the investigation of hybrid top-down/bottom-up argument-parameter matching.
+A reasonable hybrid approach might take a top-down approach when the expression to be matched has a fixed type, and a bottom-up approach in untyped contexts.
+This approach may involve switching from one type to another at different levels of the expression tree. 
+For instance:
+\begin{lstlisting}
+forall(otype T)
+int f(T x);  // (1)
+
+void* f(char y);  // (2)
+
+int x = f( f( '!' ) );
+\end{lstlisting}
+The outer call to ©f© must have a return type that is (implicitly convertable to) ©int©, so a top-down approach is used to select \textit{(1)} as the proper interpretation of ©f©. \textit{(1)}'s parameter ©x©, however, is an unbound type variable, and can thus take a value of any complete type, providing no guidance for the choice of candidate for the inner call to ©f©. The leaf expression ©'!'©, however, determines a zero-cost interpretation of the inner ©f© as \textit{(2)}, providing a minimal-cost expression resolution where ©T© is bound to ©void*©.
+
+Deciding when to switch between bottom-up and top-down resolution to minimize wasted work in a hybrid algorithm is a necessarily heuristic process, and though finding good heuristics for which subexpressions to swich matching strategies on is an open question, one reasonable approach might be to set a threshold $t$ for the number of candidate functions, and to use top-down resolution for any subexpression with fewer than $t$ candidate functions, to minimize the number of unmatchable argument interpretations computed, but to use bottom-up resolution for any subexpression with at least $t$ candidate functions, to reduce duplication in argument interpretation computation between the different candidate functions. 
+
+Ganzinger and Ripken~\cite{Ganzinger80} propose an approach (later refined by Pennello~\etal~\cite{Pennello80}) that uses a top-down filtering pass followed by a bottom-up filtering pass to reduce the number of candidate interpretations; they prove that for the Ada programming language a small number of such iterations is sufficient to converge to a solution for the expression resolution problem. 
+Persch~\etal~\cite{PW:overload} developed a similar two-pass approach where the bottom-up pass is followed by the top-down pass. 
+These algorithms differ from the hybrid approach under investigation in that they take multiple passes over the expression tree to yield a solution, and also in that they apply both filtering heuristics to all expression nodes; \CFA's polymorphic functions and implicit conversions make the approach of filtering out invalid types taken by all of these algorithms infeasible.
+
+\subsubsection{Common Subexpression Caching}
+With any of these argument-parameter approaches, it may be a useful optimization to cache the resolution results for common subexpressions; in Figure~\ref{fig:res_dag} this optimization would result in the list of interpretations $[p_c, p_i]$ for ©p© only being calculated once, and re-used for each of the three instances of ©p©.
+
+\subsection{Implicit Conversion Application}
+With the exception of Bilson, the authors mentioned above do not account for implicit conversions in their algorithms\footnote{Baker does briefly comment on an approach for handling implicit conversions, but does not provide an implementable algorithm.}; all assume that there is at most one valid interpretation of a given expression for each distinct type. 
+Integrating implicit conversion handling into the presented argument-parameter matching algorithms thus provides some choice of implementation approach.
+
+Inference of polymorphic type variables can be considered a form of implicit conversion application, where monomorphic types are implicitly converted to instances of some polymorphic type\footnote{This ``conversion'' may not be implemented in any explicit way at runtime, but does need to be handled by the expression resolver as an inexact match between argument and parameter types.}. 
+This form of implicit conversion is particularly common in functional languages; Haskell's type classes~\cite{typeclass} are a particularly well-studied variant of this inference. 
+However, type classes arguably do not allow name overloading, as (at least in the Haskell implmentation) identifiers belonging to type classes may not be overloaded in any other context than an implementation of that type class; this provides a single (possibly polymorphic) interpretation of any identifier, simplifing the expression resolution problem relative to \CFA. 
+\CC~\cite{ANSI98:C++} includes both name overloading and implicit conversions in its expression resolution specification, though unlike \CFA it does complete type-checking on a generated monomorphization of template functions, where \CFA simply checks a list of type constraints. 
+The upcoming Concepts standard~\cite{C++concepts} defines a system of type constraints similar in principle to \CFA's.
+Cormack and Wright~\cite{Cormack90} present an algorithm which integrates overload resolution with a polymorphic type inference approach very similar to \CFA's.
+However, their algorithm does not account for implicit conversions other than polymorphic type binding and their discussion of their overload resolution algorithm is not sufficiently detailed to classify it with the other argument-parameter matching approaches\footnote{Their overload resolution algorithm is possibly a variant of Ganzinger and Ripken~\cite{Ganzinger80} or Pennello~\etal~\cite{Pennello80}, modified to allow for polymorphic type binding.}.
+
+\subsubsection{On Parameters}
+Bilson does account for implicit conversions in his algorithm, but it is unclear if the approach is optimal. 
+His algorithm integrates checking for valid implicit conversions into the argument-parameter-matching step, essentially trading more expensive matching for a smaller number of argument interpretations. 
+This approach may result in the same subexpression being checked for a type match with the same type multiple times, though again memoization may mitigate this cost, and this approach does not generate implicit conversions that are not useful to match the containing function. 
+Calculating implicit conversions on parameters pairs naturally with a top-down approach to expression resolution, though it can also be used in a bottom-up approach, as Bilson demonstrates.
+
+\subsubsection{On Arguments}
+Another approach is to generate a set of possible implicit conversions for each set of interpretations of a given argument. 
+This approach has the benefit of detecting ambiguous interpretations of arguments at the level of the argument rather than its containing call, never finds more than one interpretation of the argument with a given type, and re-uses calculation of implicit conversions between function candidates. 
+On the other hand, this approach may unncessarily generate argument interpretations that never match any parameter, wasting work. 
+Further, in the presence of tuple types this approach may lead to a combinatorial explosion of argument interpretations considered, unless the tuple can be considered as a sequence of elements rather than a unified whole. 
+Calculating implicit conversions on arguments is a viable approach for bottom-up expression resolution, though it may be difficult to apply in a top-down approach due to the presence of a target type for the expression interpretation. 
+
+\subsection{Candidate Set Generation}
+All the algorithms discussed to this point generate the complete set of candidate argument interpretations before attempting to match the containing function call expression. 
+However, given that the top-level expression interpretation that is ultimately chosen is the minimal-cost valid interpretation, any consideration of non-minimal-cost interpretations is in some sense wasted work.
+Under the assumption that that programmers generally write function calls with relatively low-cost interpretations, a possible work-saving heuristic is to generate only the lowest-cost argument interpretations first, attempt to find a valid top-level interpretation using them, and only if that fails generate the next higher-cost argument interpretations.
+
+\subsubsection{Eager}
+Within the eager approach taken by the existing top-down and bottom-up algorithms, there are still variants to explore. 
+Cormack and Baker do not account for implict conversions, and thus do not account for the possibility of multiple valid interpretations with distinct costs; Bilson, on the other hand, sorts the list of interpretations to aid in finding minimal-cost interpretations. 
+Sorting the lists of argument or function call interpretations by cost at some point during resolution may provide useful opportunities to short-circuit expression evaluation when a minimal-cost interpretation is found, though it is unclear if this short-circuiting behaviour justifies the cost of the sort.
+
+\subsubsection{Lazy}
+In the presence of implicit conversions, many argument interpretations may match a given parameter by application of an appropriate implicit conversion. 
+However, if programmers actually use relatively few implicit conversions, then the ``on arguments'' approach to implicit conversions generates a large number of high-cost interpretations that may never be used. 
+Even if the ``on parameters'' approach to implicit conversions is used, eager generation of interpretations spends extra time attempting possibly expensive polymorphic or conversion-based matches in cases where an exact monomorphic interpretation exists. 
+
+The essence of the lazy approach to candidate set generation is to wrap the matching algorithm into the element generator of a lazy list, only generating as few elements at a time to ensure the next-smallest-cost interpretation has been generated. 
+Assuming argument interpretations are provided to the parameter matching algorithm in sorted order, a sorted list of function call interpretations can be produced by generating combinations of arguments sorted by total cost\footnote{I have already developed a lazy $n$-way combination generation algorithm to perform this task.}, then generating function call interpretations in the order suggested by this list. 
+The function call interpretation chosen may have costs of its own, for instance polymorphic type binding, so in some cases a number of argument combinations (any combination whose marginal cost does not exceed the cost of the function call interpretation itself) may need to be considered to determine the next-smallest-cost function call interpretation.
+Ideally, this candidate generation approach leads to very few unused candidates being generated (in the expected case where the programmer has, in fact, provided a validly-typable program), but it is an open question whether or not the overheads of lazy generation exceed the benefit produced from considering fewer interpretations.
+
+\subsubsection{Stepwise Lazy}
+As a compromise between the trade-offs of the eager and lazy approaches, I also propose to investigate a ``stepwise lazy'' approach, where all the interpretations for some ``step'' are eagerly generated, then the interpretations in the later steps are only generated on demand. 
+Under this approach the \CFA resolver could, for instance, try expression interpretations in the following order:
+\begin{enumerate}
+\item Interpretations with no polymorphic type binding or implicit conversions.
+\item Interpretations containing no polymorphic type binding and at least one safe implicit conversion.
+\item Interpretations containing polymorphic type binding, but only safe implicit conversions.
+\item Interpretations containing at least one unsafe implicit conversion.
+\end{enumerate} 
+If a valid expression interpretation is found in one step, it is guaranteed to be lower-cost than any interpretation in a later step (by the structure of \CFA interpretation costs), so no further steps need be considered.
+This approach may save significant amounts of work, especially given that the first steps avoid potentially expensive handling of implicit conversions and type assertion satisfaction entirely, and cover a large proportion of common monomorphic code.
+
+%\subsection{Parameter-Directed}
+%\textbf{TODO: Richard's algorithm isn't Baker (Cormack?), disentangle from this section \ldots}. 
+%The expression resolution algorithm used by the existing iteration of CFA is based on Baker's\cite{Baker82} algorithm for overload resolution in Ada. 
+%The essential idea of this algorithm is to first find the possible interpretations of the most deeply nested subexpressions, then to use these interpretations to recursively generate valid interpretations of their superexpressions. 
+%To simplify matters, the only expressions considered in this discussion of the algorithm are function application and literal expressions; other expression types can generally be considered to be variants of one of these for the purposes of the resolver, \eg variables are essentially zero-argument functions. 
+%If we consider expressions as graph nodes with arcs connecting them to their subexpressions, these expressions form a DAG, generated by the algorithm from the bottom up.
+%Literal expressions are represented by leaf nodes, annotated with the type of the expression, while a function application will have a reference to the function declaration chosen, as well as arcs to the interpretation nodes for its argument expressions; functions are annotated with their return type (or types, in the case of multiple return values).
+%
+%\textbf{TODO: Figure}
+%
+%Baker's algorithm was designed to account for name overloading; Richard Bilson\cite{Bilson03} extended this algorithm to also handle polymorphic functions, implicit conversions and multiple return types when designing the original \CFA compiler. 
+%The core of the algorithm is a function which Baker refers to as $gen\_calls$. 
+%$gen\_calls$ takes as arguments the name of a function $f$ and a list containing the set of possible subexpression interpretations $S_j$ for each argument of the function and returns a set of possible interpretations of calling that function on those arguments. 
+%The subexpression interpretations are generally either singleton sets generated by the single valid interpretation of a literal expression, or the results of a previous call to $gen\_calls$. 
+%If there are no valid interpretations of an expression, the set returned by $gen\_calls$ will be empty, at which point resolution can cease, since each subexpression must have at least one valid interpretation to produce an interpretation of the whole expression. 
+%On the other hand, if for some type $T$ there is more than one valid interpretation of an expression with type $T$, all interpretations of that expression with type $T$ can be collapsed into a single \emph{ambiguous expression} of type $T$, since the only way to disambiguate expressions is by their return types. 
+%If a subexpression interpretation is ambiguous, than any expression interpretation containing it will also be ambiguous. 
+%In the variant of this algorithm including implicit conversions, the interpretation of an expression as type $T$ is ambiguous only if there is more than one \emph{minimal-cost} interpretation of the expression as type $T$, as cheaper expressions are always chosen in preference to more expensive ones.
+%
+%Given this description of the behaviour of $gen\_calls$, its implementation is quite straightforward: for each function declaration $f_i$ matching the name of the function, consider each of the parameter types $p_j$ of $f_i$, attempting to match the type of an element of $S_j$ to $p_j$ (this may include checking of implicit conversions).
+%If no such element can be found, there is no valid interpretation of the expression using $f_i$, while if more than one such (minimal-cost) element is found than an ambiguous interpretation with the result type of $f_i$ is produced. 
+%In the \CFA variant, which includes polymorphic functions, it is possible that a single polymorphic function definition $f_i$ can produce multiple valid interpretations by different choices of type variable bindings; these interpretations are unambiguous so long as the return type of $f_i$ is different for each type binding. 
+%If all the parameters $p_j$ of $f_i$ can be uniquely matched to a candidate interpretation, then a valid interpretation based on $f_i$ and those $p_j$ is produced. 
+%$gen\_calls$ collects the produced interpretations for each $f_i$ and returns them; a top level expression is invalid if this list is empty, ambiguous if there is more than one (minimal-cost) result, or if this single result is ambiguous, and valid otherwise.
+%
+%In this implementation, resolution of a single top-level expression takes time $O(\ldots)$, where \ldots. \textbf{TODO:} \textit{Look at 2.3.1 in Richard's thesis when working out complexity; I think he does get the Baker algorithm wrong on combinations though, maybe\ldots}
+%
+%\textbf{TODO: Basic Lit Review} \textit{Look at 2.4 in Richard's thesis for any possible more-recent citations of Baker\ldots} \textit{Look back at Baker's related work for other papers that look similar to what you're doing, then check their citations as well\ldots} \textit{Look at Richard's citations in 2.3.2 w.r.t. type data structures\ldots}
+%\textit{CormackWright90 seems to describe a solution for the same problem, mostly focused on how to find the implicit parameters}
+
+\section{Proposal}
+Baker~\cite{Baker82} discussed various expression resolution algorithms that can handle name overloading, but left experimental comparison of those algorithms to future work; Bilson~\cite{Bilson03} described one extension of Baker's algorithm to handle implicit conversions, but did not fully explore the space of algorithmic approaches to handle both overloaded names and implicit conversions. 
+This project is intended to experimentally test a number of expression resolution algorithms that are powerful enough to handle the \CFA type-system, including both name overloading and implicit conversions. 
+This comparison closes Baker's open research question, as well as potentially improving Bilson's \CFA compiler.
+
+Rather than testing all of these algorithms in-place in the \CFA compiler, a resolver prototype is being developed which acts on a simplified input language encapsulating the essential details of the \CFA type-system\footnote{Note this simplified input language is not a usable programming language.}. 
+Multiple variants of this resolver prototype will be implemented, each encapsulating a different expression resolution variant, sharing as much code as feasible. 
+These variants will be instrumented to test runtime performance, and run on a variety of input files; the input files may be generated programmatically or from exisiting code in \CFA or similar languages.
+These experimental results should make it possible to determine the algorithm likely to be most performant in practical use, and replace CFA's existing expression resolver. 
+
+The experimental results will also provide some empirical sense of the compile-time cost of various language features by comparing the results of the most performant resolver variant that supports a feature with the most performant resolver variant that does not support that feature, a useful capability to guide language design. 
+As an example, there are currently multiple open proposals for how implicit conversions should interact with polymorphic type binding in \CFA, each with distinct levels of expressive power; if the resolver prototype is modified to support each proposal, the optimal algorithm for each proposal can be compared, providing an empirical demonstration of the trade-off between expressive power and compiler runtime. 
+
+This proposed project should provide valuable data on how to implement a performant compiler for modern programming languages such as \CFA with powerful static type-systems, specifically targeting the feature interaction between name overloading and implicit conversions. 
+This work is not limited in applicability to \CFA, but may also be useful for supporting efficient compilation of the upcoming Concepts standard~\cite{C++concepts} for \CC template constraints, for instance. 
+
+\appendix
+\section{Completion Timeline}
+The following is a preliminary estimate of the time necessary to complete the major components of this research project:
+\begin{center}
+\begin{tabular}{ | r @{--} l | p{4in} | }
+\hline       May 2015 & April 2016   & Project familiarization and generic types design and implementation. \\
+\hline       May 2016 & April 2017   & Design and implement resolver prototype and run performance experiments. \\
+\hline       May 2017 & August 2017  & Integrate new language features and best-performing resolver prototype into CFA. \\
+\hline September 2017 & January 2018 & Thesis writing and defense. \\
+\hline
+\end{tabular}
+\end{center}
+
+\addcontentsline{toc}{section}{\refname}
+\bibliographystyle{plain}
+\bibliography{cfa}
+
+%\addcontentsline{toc}{section}{\indexname} % add index name to table of contents
+%\begin{theindex}
+%Italic page numbers give the location of the main entry for the referenced term.
+%Plain page numbers denote uses of the indexed term.
+%Entries for grammar non-terminals are italicized.
+%A typewriter font is used for grammar terminals and program identifiers.
+%\indexspace
+%\input{comp_II.ind}
+%\end{theindex}
+
+\end{document}
Index: doc/bibliography/cfa.bib
===================================================================
--- doc/bibliography/cfa.bib	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ doc/bibliography/cfa.bib	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -832,4 +832,15 @@
     address	= {http://www.iso.org},
     year	= 2012,
+}
+
+@manual{C++Concepts,
+	keywords = {ISO/IEC TS 19217:2015},
+	contributer = {a3moss@uwaterloo.ca},
+	key = {C++ Concepts},
+	title = {Information technology -- Programming languages -- {C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}} Extensions for concepts},
+	organization = {International Standard ISO/IEC TS 19217:2015},
+	publisher = {International Standard Organization},
+	address = {http://www.iso.org},
+	year = 2015
 }
 
@@ -1623,4 +1634,15 @@
     year	= 1974,
 }
+
+@unpublished{Ditchfield:conversions,
+	contributer = {a3moss@uwaterloo.ca},
+	author = {Glen Ditchfield},
+	title = {Conversions for {Cforall}},
+	note = {\href{http://plg.uwaterloo.ca/~cforall/Conversions/index.html}{http://\-plg.uwaterloo.ca/\-\textasciitilde cforall/\-Conversions/\-index.html}},
+	month = {Nov},
+	year = {2002},
+	urldate = {28 July 2016},
+}
+
 
 @techreport{Dijkstra65,
@@ -4663,4 +4685,23 @@
 }
 
+@article{Ganzinger80,
+	contributer = {a3moss@uwaterloo.ca},
+	author = {Ganzinger, Harald and Ripken, Knut},
+	title = {Operator Identification in {ADA}: Formal Specification, Complexity, and Concrete Implementation},
+	journal = {SIGPLAN Notices},
+	issue_date = {February 1980},
+	volume = {15},
+	number = {2},
+	month = feb,
+	year = {1980},
+	issn = {0362-1340},
+	pages = {30--42},
+	numpages = {13},
+	url = {http://doi.acm.org/10.1145/947586.947589},
+	doi = {10.1145/947586.947589},
+	publisher = {ACM},
+	address = {New York, NY, USA}
+}
+
 @article{Ford82,
     keywords	= {},
@@ -5829,4 +5870,23 @@
 }
 
+@article{Pennello80,
+	contributer = {a3moss@uwaterloo.ca},
+	author = {Pennello, Tom and DeRemer, Frank and Meyers, Richard},
+	title = {A Simplified Operator Identification Scheme for {Ada}},
+	journal = {SIGPLAN Notices},
+	issue_date = {July-August 1980},
+	volume = {15},
+	number = {7 and 8},
+	month = jul,
+	year = {1980},
+	issn = {0362-1340},
+	pages = {82--87},
+	numpages = {6},
+	url = {http://doi.acm.org/10.1145/947680.947688},
+	doi = {10.1145/947680.947688},
+	publisher = {ACM},
+	address = {New York, NY, USA},
+}
+
 @inproceedings{Dice10,
     keywords	= {hardware, synchronization, transactional memory},
Index: doc/user/user.tex
===================================================================
--- doc/user/user.tex	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ doc/user/user.tex	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -11,6 +11,6 @@
 %% Created On       : Wed Apr  6 14:53:29 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Wed Jul 13 08:14:39 2016
-%% Update Count     : 1247
+%% Last Modified On : Sun Aug 14 08:23:06 2016
+%% Update Count     : 1323
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -211,5 +211,5 @@
 however, it largely extended the language, and did not address many existing problems.\footnote{%
 Two important existing problems addressed were changing the type of character literals from ©int© to ©char© and enumerator from ©int© to the type of its enumerators.}
-\Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features (e.g., objects, concurrency) are added and problems fixed within the framework of the existing language.
+\Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features (\eg objects, concurrency) are added and problems fixed within the framework of the existing language.
 \Index*{Java}~\cite{Java8}, \Index*{Go}~\cite{Go}, \Index*{Rust}~\cite{Rust} and \Index*{D}~\cite{D} are examples of the revolutionary approach for modernizing C/\CC, resulting in a new language rather than an extension of the descendent.
 These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection.
@@ -226,4 +226,5 @@
 
 \section{Interoperability}
+\label{s:Interoperability}
 
 \CFA is designed to integrate well with existing C programs and libraries.
@@ -265,5 +266,5 @@
 \section[Compiling CFA Program]{Compiling \CFA Program}
 
-The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, e.g.:
+The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, \eg:
 \begin{lstlisting}
 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ]
@@ -314,4 +315,9 @@
 The \CFA compilation message is printed at the beginning of a compilation.
 \textbf{This option is the default.}
+
+\item
+\Indexc{-no-include-stdhdr}\index{compilation option!-no-include-stdhdr@©-no-include-stdhdr©}
+Do not supply ©extern "C"© wrappers for \Celeven standard include files (see~\VRef{s:StandardHeaders}).
+\textbf{This option is \emph{not} the default.}
 \end{description}
 
@@ -350,5 +356,5 @@
 \section{Underscores in Constants}
 
-Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, e.g.:
+Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, \eg:
 \begin{lstlisting}
 2®_®147®_®483®_®648;			§\C{// decimal constant}§
@@ -366,8 +372,8 @@
 \begin{enumerate}
 \item
-A sequence of underscores is disallowed, e.g., ©12__34© is invalid.
+A sequence of underscores is disallowed, \eg ©12__34© is invalid.
 \item
 Underscores may only appear within a sequence of digits (regardless of the digit radix).
-In other words, an underscore cannot start or end a sequence of digits, e.g., ©_1©, ©1_© and ©_1_© are invalid (actually, the 1st and 3rd examples are identifier names).
+In other words, an underscore cannot start or end a sequence of digits, \eg ©_1©, ©1_© and ©_1_© are invalid (actually, the 1st and 3rd examples are identifier names).
 \item
 A numeric prefix may end with an underscore;
@@ -498,5 +504,5 @@
 \end{quote2}
 
-All type qualifiers, e.g., ©const©, ©volatile©, etc., are used in the normal way with the new declarations and also appear left to right, e.g.:
+All type qualifiers, \eg ©const©, ©volatile©, etc., are used in the normal way with the new declarations and also appear left to right, \eg:
 \begin{quote2}
 \begin{tabular}{@{}l@{\hspace{1em}}l@{\hspace{1em}}l@{}}
@@ -518,6 +524,6 @@
 \end{tabular}
 \end{quote2}
-All declaration qualifiers, e.g., ©extern©, ©static©, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier}
-The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}} e.g.:
+All declaration qualifiers, \eg ©extern©, ©static©, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier}
+The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}} \eg:
 \begin{quote2}
 \begin{tabular}{@{}l@{\hspace{3em}}l@{\hspace{2em}}l@{}}
@@ -542,5 +548,5 @@
 Unsupported are K\&R C declarations where the base type defaults to ©int©, if no type is specified,\footnote{
 At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each structure declaration and type name~\cite[\S~6.7.2(2)]{C11}}
-e.g.:
+\eg:
 \begin{lstlisting}
 x;								§\C{// int x}§
@@ -612,5 +618,5 @@
 A \Index{pointer}/\Index{reference} is a generalization of a variable name, i.e., a mutable address that can point to more than one memory location during its lifetime.
 (Similarly, an integer variable can contain multiple integer literals during its lifetime versus an integer constant representing a single literal during its lifetime and may not occupy storage as the literal is embedded directly into instructions.)
-Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, e.g.:
+Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, \eg:
 \begin{quote2}
 \begin{tabular}{@{}ll@{}}
@@ -669,5 +675,5 @@
 Except for auto-dereferencing by the compiler, this reference example is the same as the previous pointer example.
 Hence, a reference behaves like the variable name for the current variable it is pointing-to.
-The simplest way to understand a reference is to imagine the compiler inserting a dereference operator before the reference variable for each reference qualifier in a declaration, e.g.:
+The simplest way to understand a reference is to imagine the compiler inserting a dereference operator before the reference variable for each reference qualifier in a declaration, \eg:
 \begin{lstlisting}
 r2 = ((r1 + r2) * (r3 - r1)) / (r3 - 15);
@@ -677,5 +683,5 @@
 ®*®r2 = ((®*®r1 + ®*®r2) ®*® (®**®r3 - ®*®r1)) / (®**®r3 - 15);
 \end{lstlisting}
-When a reference operation appears beside a dereference operation, e.g., ©&*©, they cancel out.\footnote{
+When a reference operation appears beside a dereference operation, \eg ©&*©, they cancel out.\footnote{
 The unary ©&© operator yields the address of its operand.
 If the operand has type ``type'', the result has type ``pointer to type''.
@@ -721,9 +727,27 @@
 ®&®crc = &cx;					§\C{// error, cannot change crc}§
 \end{lstlisting}
-Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be ©0© unless an arbitrary pointer is assigned to the reference}, e.g.:
+Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be ©0© unless an arbitrary pointer is assigned to the reference}, \eg:
 \begin{lstlisting}
 int & const r = *0;				§\C{// where 0 is the int * zero}§
 \end{lstlisting}
 Otherwise, the compiler is managing the addresses for type ©& const© not the programmer, and by a programming discipline of only using references with references, address errors can be prevented.
+Finally, the position of the ©const© qualifier \emph{after} the pointer/reference qualifier causes confuse for C programmers.
+The ©const© qualifier cannot be moved before the pointer/reference qualifier for C style-declarations;
+\CFA-style declarations attempt to address this issue:
+\begin{quote2}
+\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
+\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}	& \multicolumn{1}{c}{\textbf{C}}	\\
+\begin{lstlisting}
+®const® * ®const® * const int ccp;
+®const® & ®const® & const int ccr;
+\end{lstlisting}
+&
+\begin{lstlisting}
+const int * ®const® * ®const® ccp;
+
+\end{lstlisting}
+\end{tabular}
+\end{quote2}
+where the \CFA declaration is read left-to-right (see \VRef{s:Declarations}).
 
 \Index{Initialization} is different than \Index{assignment} because initialization occurs on the empty (uninitialized) storage on an object, while assignment occurs on possibly initialized storage of an object.
@@ -783,7 +807,33 @@
 
 
+\section{Backquote Identifiers}
+\label{s:BackquoteIdentifiers}
+
+\CFA accommodates keyword clashes by syntactic transformations using the \CFA backquote escape-mechanism:
+\begin{lstlisting}
+int `otype` = 3;				// make keyword an identifier
+double `choose` = 3.5;
+\end{lstlisting}
+Programs can be converted easily by enclosing keyword identifiers in backquotes, and the backquotes can be removed later when the identifier name is changed to an non-keyword name.
+Clashes in C header files (see~\VRef{s:StandardHeaders}) can be handled automatically using the preprocessor, ©#include_next© and ©-I filename©:
+\begin{lstlisting}
+// include file uses the CFA keyword "otype".
+#if ! defined( otype )			// nesting ?
+#define otype `otype`
+#define __CFA_BFD_H__
+#endif // ! otype
+
+#include_next <bfd.h>			// must have internal check for multiple expansion
+
+#if defined( otype ) && defined( __CFA_BFD_H__ )	// reset only if set
+#undef otype
+#undef __CFA_BFD_H__
+#endif // otype && __CFA_BFD_H__
+\end{lstlisting}
+
+
 \section{Type Operators}
 
-The new declaration syntax can be used in other contexts where types are required, e.g., casts and the pseudo-routine ©sizeof©:
+The new declaration syntax can be used in other contexts where types are required, \eg casts and the pseudo-routine ©sizeof©:
 \begin{quote2}
 \begin{tabular}{@{}l@{\hspace{3em}}l@{}}
@@ -805,5 +855,5 @@
 
 \CFA also supports a new syntax for routine definition, as well as ISO C and K\&R routine syntax.
-The point of the new syntax is to allow returning multiple values from a routine~\cite{Galletly96,CLU}, e.g.:
+The point of the new syntax is to allow returning multiple values from a routine~\cite{Galletly96,CLU}, \eg:
 \begin{lstlisting}
 ®[ int o1, int o2, char o3 ]® f( int i1, char i2, char i3 ) {
@@ -817,5 +867,5 @@
 \Index*{Michael Tiemann}, with help from \Index*{Doug Lea}, provided named return values in g++, circa 1989.}
 The value of each local return variable is automatically returned at routine termination.
-Declaration qualifiers can only appear at the start of a routine definition, e.g.:
+Declaration qualifiers can only appear at the start of a routine definition, \eg:
 \begin{lstlisting}
 ®extern® [ int x ] g( int y ) {§\,§}
@@ -849,5 +899,5 @@
 The inability to use \CFA declarations in these two contexts is probably a blessing because it precludes programmers from arbitrarily switching between declarations forms within a declaration contexts.
 
-C-style declarations can be used to declare parameters for \CFA style routine definitions, e.g.:
+C-style declarations can be used to declare parameters for \CFA style routine definitions, \eg:
 \begin{lstlisting}
 [ int ] f( * int, int * );		§\C{// returns an integer, accepts 2 pointers to integers}§
@@ -898,5 +948,5 @@
 
 The syntax of the new routine prototype declaration follows directly from the new routine definition syntax;
-as well, parameter names are optional, e.g.:
+as well, parameter names are optional, \eg:
 \begin{lstlisting}
 [ int x ] f ();					§\C{// returning int with no parameters}§
@@ -906,5 +956,5 @@
 \end{lstlisting}
 This syntax allows a prototype declaration to be created by cutting and pasting source text from the routine definition header (or vice versa).
-It is possible to declare multiple routine-prototypes in a single declaration, but the entire type specification is distributed across \emph{all} routine names in the declaration list (see~\VRef{s:Declarations}), e.g.:
+It is possible to declare multiple routine-prototypes in a single declaration, but the entire type specification is distributed across \emph{all} routine names in the declaration list (see~\VRef{s:Declarations}), \eg:
 \begin{quote2}
 \begin{tabular}{@{}l@{\hspace{3em}}l@{}}
@@ -919,5 +969,5 @@
 \end{tabular}
 \end{quote2}
-Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} e.g.:
+Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} \eg:
 \begin{lstlisting}
 extern [ int ] f (int);
@@ -928,5 +978,5 @@
 \section{Routine Pointers}
 
-The syntax for pointers to \CFA routines specifies the pointer name on the right, e.g.:
+The syntax for pointers to \CFA routines specifies the pointer name on the right, \eg:
 \begin{lstlisting}
 * [ int x ] () fp;			§\C{// pointer to routine returning int with no parameters}§
@@ -987,5 +1037,22 @@
 Alternatively, prototype definitions can be eliminated by using a two-pass compilation, and implicitly creating header files for exports.
 The former is easy to do, while the latter is more complex.
-Currently, \CFA does \emph{not} attempt to support named arguments.
+
+Furthermore, named arguments do not work well in a \CFA-style programming-languages because they potentially introduces a new criteria for type matching.
+For example, it is technically possible to disambiguate between these two overloaded definitions of ©f© based on named arguments at the call site:
+\begin{lstlisting}
+int f( int i, int j );
+int f( int x, double y );
+
+f( j : 3, i : 4 );				§\C{// 1st f}§
+f( x : 7, y : 8.1 );			§\C{// 2nd f}§
+f( 4, 5 ); 						§\C{// ambiguous call}§
+\end{lstlisting}
+However, named arguments compound routine resolution in conjunction with conversions:
+\begin{lstlisting}
+f( i : 3, 5.7 );				§\C{// ambiguous call ?}§
+\end{lstlisting}
+Depending on the cost associated with named arguments, this call could be resolvable or ambiguous.
+Adding named argument into the routine resolution algorithm does not seem worth the complexity.
+Therefore, \CFA does \emph{not} attempt to support named arguments.
 
 \item[Default Arguments]
@@ -997,16 +1064,16 @@
 the allowable positional calls are:
 \begin{lstlisting}
-p();				§\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§
-p( 4 );				§\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§
-p( 4, 4 );			§\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§
-p( 4, 4, 4 );		§\C{// rewrite $\Rightarrow$ p( 4, 4, 4 )}§
+p();							§\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§
+p( 4 );							§\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§
+p( 4, 4 );						§\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§
+p( 4, 4, 4 );					§\C{// rewrite $\Rightarrow$ p( 4, 4, 4 )}§
 // empty arguments
-p(  , 4, 4 );		§\C{// rewrite $\Rightarrow$ p( 1, 4, 4 )}§
-p( 4,  , 4 );		§\C{// rewrite $\Rightarrow$ p( 4, 2, 4 )}§
-p( 4, 4,   );		§\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§
-p( 4,  ,   );		§\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§
-p(  , 4,   );		§\C{// rewrite $\Rightarrow$ p( 1, 4, 3 )}§
-p(  ,  , 4 );		§\C{// rewrite $\Rightarrow$ p( 1, 2, 4 )}§
-p(  ,  ,   );		§\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§
+p(  , 4, 4 );					§\C{// rewrite $\Rightarrow$ p( 1, 4, 4 )}§
+p( 4,  , 4 );					§\C{// rewrite $\Rightarrow$ p( 4, 2, 4 )}§
+p( 4, 4,   );					§\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§
+p( 4,  ,   );					§\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§
+p(  , 4,   );					§\C{// rewrite $\Rightarrow$ p( 1, 4, 3 )}§
+p(  ,  , 4 );					§\C{// rewrite $\Rightarrow$ p( 1, 2, 4 )}§
+p(  ,  ,   );					§\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§
 \end{lstlisting}
 Here the missing arguments are inserted from the default values in the parameter list.
@@ -1043,12 +1110,12 @@
 The conflict occurs because both named and ellipse arguments must appear after positional arguments, giving two possibilities:
 \begin{lstlisting}
-p( /* positional */, . . ., /* named */ );
-p( /* positional */, /* named */, . . . );
-\end{lstlisting}
-While it is possible to implement both approaches, the first possibly is more complex than the second, e.g.:
-\begin{lstlisting}
-p( int x, int y, int z, . . . );
-p( 1, 4, 5, 6, z : 3, y : 2 ); §\C{// assume p( /* positional */, . . ., /* named */ );}§
-p( 1, z : 3, y : 2, 4, 5, 6 ); §\C{// assume p( /* positional */, /* named */, . . . );}§
+p( /* positional */, ... , /* named */ );
+p( /* positional */, /* named */, ... );
+\end{lstlisting}
+While it is possible to implement both approaches, the first possibly is more complex than the second, \eg:
+\begin{lstlisting}
+p( int x, int y, int z, ... );
+p( 1, 4, 5, 6, z : 3, y : 2 ); §\C{// assume p( /* positional */, ... , /* named */ );}§
+p( 1, z : 3, y : 2, 4, 5, 6 ); §\C{// assume p( /* positional */, /* named */, ... );}§
 \end{lstlisting}
 In the first call, it is necessary for the programmer to conceptually rewrite the call, changing named arguments into positional, before knowing where the ellipse arguments begin.
@@ -1056,9 +1123,9 @@
 In the second call, the named arguments separate the positional and ellipse arguments, making it trivial to read the call.
 
-The problem is exacerbated with default arguments, e.g.:
-\begin{lstlisting}
-void p( int x, int y = 2, int z = 3. . . );
-p( 1, 4, 5, 6, z : 3 );		§\C{// assume p( /* positional */, . . ., /* named */ );}§
-p( 1, z : 3, 4, 5, 6 );		§\C{// assume p( /* positional */, /* named */, . . . );}§
+The problem is exacerbated with default arguments, \eg:
+\begin{lstlisting}
+void p( int x, int y = 2, int z = 3... );
+p( 1, 4, 5, 6, z : 3 );		§\C{// assume p( /* positional */, ... , /* named */ );}§
+p( 1, z : 3, 4, 5, 6 );		§\C{// assume p( /* positional */, /* named */, ... );}§
 \end{lstlisting}
 The first call is an error because arguments 4 and 5 are actually positional not ellipse arguments;
@@ -1105,6 +1172,7 @@
 \subsection{Type Nesting}
 
-\CFA allows \Index{type nesting}, and type qualification of the nested types (see \VRef[Figure]{f:TypeNestingQualification}), where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
+\CFA allows \Index{type nesting}, and type qualification of the nested typres (see \VRef[Figure]{f:TypeNestingQualification}), where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
 \begin{figure}
+\centering
 \begin{tabular}{@{}l@{\hspace{3em}}l|l@{}}
 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{C Type Nesting}}	& \multicolumn{1}{c}{\textbf{C Implicit Hoisting}}	& \multicolumn{1}{|c}{\textbf{\CFA}}	\\
@@ -1264,5 +1332,5 @@
 
 As mentioned, tuples can appear in contexts requiring a list of value, such as an argument list of a routine call.
-In unambiguous situations, the tuple brackets may be omitted, e.g., a tuple that appears as an argument may have its
+In unambiguous situations, the tuple brackets may be omitted, \eg a tuple that appears as an argument may have its
 square brackets omitted for convenience; therefore, the following routine invocations are equivalent:
 \begin{lstlisting}
@@ -1303,5 +1371,5 @@
 
 Type qualifiers, i.e., const and volatile, may modify a tuple type.
-The meaning is the same as for a type qualifier modifying an aggregate type [Int99, x 6.5.2.3(7),x 6.7.3(11)], i.e., the qualifier is distributed across all of the types in the tuple, e.g.:
+The meaning is the same as for a type qualifier modifying an aggregate type [Int99, x 6.5.2.3(7),x 6.7.3(11)], i.e., the qualifier is distributed across all of the types in the tuple, \eg:
 \begin{lstlisting}
 const volatile [ int, float, const int ] x;
@@ -1311,5 +1379,5 @@
 [ const volatile int, const volatile float, const volatile int ] x;
 \end{lstlisting}
-Declaration qualifiers can only appear at the start of a \CFA tuple declaration4, e.g.:
+Declaration qualifiers can only appear at the start of a \CFA tuple declaration4, \eg:
 \begin{lstlisting}
 extern [ int, int ] w1;
@@ -1319,5 +1387,5 @@
 Unfortunately, C's syntax for subscripts precluded treating them as tuples.
 The C subscript list has the form ©[i][j]...© and not ©[i, j, ...]©.
-Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, e.g., ©f[g()]© always means a single subscript value because there is only one set of brackets.
+Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, \eg ©f[g()]© always means a single subscript value because there is only one set of brackets.
 Fixing this requires a major change to C because the syntactic form ©M[i, j, k]© already has a particular meaning: ©i, j, k© is a comma expression.
 \end{rationale}
@@ -1373,5 +1441,5 @@
 Mass assignment has the following form:
 \begin{lstlisting}
-[ §\emph{lvalue}§, ..., §\emph{lvalue}§ ] = §\emph{expr}§;
+[ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = §\emph{expr}§;
 \end{lstlisting}
 \index{lvalue}
@@ -1380,5 +1448,5 @@
 Clearly, the types of the entities being assigned must be type compatible with the value of the expression.
 
-Mass assignment has parallel semantics, e.g., the statement:
+Mass assignment has parallel semantics, \eg the statement:
 \begin{lstlisting}
 [ x, y, z ] = 1.5;
@@ -1413,5 +1481,5 @@
 Multiple assignment has the following form:
 \begin{lstlisting}
-[ §\emph{lvalue}§, . . ., §\emph{lvalue}§ ] = [ §\emph{expr}§, . . ., §\emph{expr}§ ];
+[ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = [ §\emph{expr}§, ... , §\emph{expr}§ ];
 \end{lstlisting}
 \index{lvalue}
@@ -1469,21 +1537,21 @@
 \section{Unnamed Structure Fields}
 
-C requires each field of a structure to have a name, except for a bit field associated with a basic type, e.g.:
+C requires each field of a structure to have a name, except for a bit field associated with a basic type, \eg:
 \begin{lstlisting}
 struct {
-	int f1;			// named field
-	int f2 : 4;		// named field with bit field size
-	int : 3;		// unnamed field for basic type with bit field size
-	int ;			// disallowed, unnamed field
-	int *;			// disallowed, unnamed field
-	int (*)(int);	// disallowed, unnamed field
+	int f1;					§\C{// named field}§
+	int f2 : 4;				§\C{// named field with bit field size}§
+	int : 3;				§\C{// unnamed field for basic type with bit field size}§
+	int ;					§\C{// disallowed, unnamed field}§
+	int *;					§\C{// disallowed, unnamed field}§
+	int (*)(int);			§\C{// disallowed, unnamed field}§
 };
 \end{lstlisting}
 This requirement is relaxed by making the field name optional for all field declarations; therefore, all the field declarations in the example are allowed.
 As for unnamed bit fields, an unnamed field is used for padding a structure to a particular size.
-A list of unnamed fields is also supported, e.g.:
+A list of unnamed fields is also supported, \eg:
 \begin{lstlisting}
 struct {
-	int , , ;		// 3 unnamed fields
+	int , , ;				§\C{// 3 unnamed fields}§
 }
 \end{lstlisting}
@@ -1498,5 +1566,5 @@
 §\emph{expr}§ -> [ §\emph{fieldlist}§ ]
 \end{lstlisting}
-\emph{expr} is any expression yielding a value of type record, e.g., ©struct©, ©union©.
+\emph{expr} is any expression yielding a value of type record, \eg ©struct©, ©union©.
 Each element of \emph{ fieldlist} is an element of the record specified by \emph{expr}.
 A record-field tuple may be used anywhere a tuple can be used. An example of the use of a record-field tuple is
@@ -1760,9 +1828,8 @@
 }
 \end{lstlisting}
-While the declaration of the local variable ©y© is useful and its scope is across all ©case© clauses, the initialization for such a variable is defined to never be executed because control always transfers over it.
-Furthermore, any statements before the first ©case© clause can only be executed if labelled and transferred to using a ©goto©, either from outside or inside of the ©switch©.
-As mentioned, transfer into control structures should be forbidden;
-transfers from within the ©switch© body using a ©goto© are equally unpalatable.
-As well, the declaration of ©z© is cannot occur after the ©case© because a label can only be attached to a statement, and without a fall through to case 3, ©z© is uninitialized.
+While the declaration of the local variable ©y© is useful with a scope across all ©case© clauses, the initialization for such a variable is defined to never be executed because control always transfers over it.
+Furthermore, any statements before the first ©case© clause can only be executed if labelled and transferred to using a ©goto©, either from outside or inside of the ©switch©, both of which are problematic.
+As well, the declaration of ©z© cannot occur after the ©case© because a label can only be attached to a statement, and without a fall through to case 3, ©z© is uninitialized.
+The key observation is that the ©switch© statement branches into control structure, i.e., there are multiple entry points into its statement body.
 \end{enumerate}
 
@@ -1778,15 +1845,19 @@
 and there is only a medium amount of fall-through from one ©case© clause to the next, and most of these result from a list of case values executing common code, rather than a sequence of case actions that compound.
 \end{itemize}
-These observations help to put the suggested changes to the ©switch© into perspective.
+These observations help to put the \CFA changes to the ©switch© into perspective.
 \begin{enumerate}
 \item
 Eliminating default fall-through has the greatest potential for affecting existing code.
-However, even if fall-through is removed, most ©switch© statements would continue to work because of the explicit transfers already present at the end of each ©case© clause, the common placement of the ©default© clause at the end of the case list, and the most common use of fall-through, i.e., a list of ©case© clauses executing common code, e.g.:
-\begin{lstlisting}
+However, even if fall-through is removed, most ©switch© statements would continue to work because of the explicit transfers already present at the end of each ©case© clause, the common placement of the ©default© clause at the end of the case list, and the most common use of fall-through, i.e., a list of ©case© clauses executing common code, \eg:
+ \begin{lstlisting}
 case 1:  case 2:  case 3: ...
 \end{lstlisting}
 still work.
 Nevertheless, reversing the default action would have a non-trivial effect on case actions that compound, such as the above example of processing shell arguments.
-Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthru©, e.g.:
+<<<<<<< HEAD
+Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthru©, \eg:
+=======
+Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthrough©/©fallthru©, e.g.:
+>>>>>>> 080615890f586cb9954c252b55cab47f52c25758
 \begin{lstlisting}
 ®choose® ( i ) {
@@ -1815,16 +1886,16 @@
 Therefore, no change is made for this issue.
 \item
-Dealing with unreachable code in a ©switch©/©choose© body is solved by restricting declarations and associated initialization to the start of statement body, which is executed \emph{before} the transfer to the appropriate ©case© clause.\footnote{
-Essentially, these declarations are hoisted before the statement and both declarations and statement are surrounded by a compound statement.} and precluding statements before the first ©case© clause.
-Further declaration in the statement body are disallowed.
+Dealing with unreachable code in a ©switch©/©choose© body is solved by restricting declarations and associated initialization to the start of statement body, which is executed \emph{before} the transfer to the appropriate ©case© clause\footnote{
+Essentially, these declarations are hoisted before the ©switch©/©choose© statement and both declarations and statement are surrounded by a compound statement.} and precluding statements before the first ©case© clause.
+Further declarations at the same nesting level as the statement body are disallowed to ensure every transfer into the body is sound.
 \begin{lstlisting}
 switch ( x ) {
-	®int i = 0;®				§\C{// allowed}§
+	®int i = 0;®				§\C{// allowed only at start}§
   case 0:
 	...
-	®int i = 0;®				§\C{// disallowed}§
+	®int j = 0;®				§\C{// disallowed}§
   case 1:
     {
-		®int i = 0;®			§\C{// allowed in any compound statement}§
+		®int k = 0;®			§\C{// allowed at different nesting levels}§
 		...
 	}
@@ -1846,7 +1917,7 @@
 \begin{lstlisting}
 switch ( i ) {
-  ®case 1, 3, 5®:
+  case ®1, 3, 5®:
 	...
-  ®case 2, 4, 6®:
+  case ®2, 4, 6®:
 	...
 }
@@ -1879,7 +1950,7 @@
 \begin{lstlisting}
 switch ( i ) {
-  ®case 1~5:®
+  case ®1~5:®
 	...
-  ®case 10~15:®
+  case ®10~15:®
 	...
 }
@@ -1888,7 +1959,7 @@
 \begin{lstlisting}
 switch ( i )
-  case 1 ... 5:
+  case ®1 ... 5®:
 	...
-  case 10 ... 15:
+  case ®10 ... 15®:
 	...
 }
@@ -2707,6 +2778,6 @@
 Like the \Index*[C++]{\CC} lexical problem with closing template-syntax, e.g, ©Foo<Bar<int®>>®©, this issue can be solved with a more powerful lexer/parser.
 
-There are several ambiguous cases with operator identifiers, e.g., ©int *?*?()©, where the string ©*?*?© can be lexed as ©*©/©?*?© or ©*?©/©*?©.
-Since it is common practise to put a unary operator juxtaposed to an identifier, e.g., ©*i©, users will be annoyed if they cannot do this with respect to operator identifiers.
+There are several ambiguous cases with operator identifiers, \eg ©int *?*?()©, where the string ©*?*?© can be lexed as ©*©/©?*?© or ©*?©/©*?©.
+Since it is common practise to put a unary operator juxtaposed to an identifier, \eg ©*i©, users will be annoyed if they cannot do this with respect to operator identifiers.
 Even with this special hack, there are 5 general cases that cannot be handled.
 The first case is for the function-call identifier ©?()©:
@@ -2773,5 +2844,5 @@
 This means that a function requiring mutual exclusion could block if the lock is already held by another thread.
 Blocking on a monitor lock does not block the kernel thread, it simply blocks the user thread, which yields its kernel thread while waiting to obtain the lock.
-If multiple mutex parameters are specified, they will be locked in parameter order (i.e. first parameter is locked first) and unlocked in the
+If multiple mutex parameters are specified, they will be locked in parameter order (\ie first parameter is locked first) and unlocked in the
 reverse order.
 \begin{lstlisting}
@@ -4350,29 +4421,9 @@
 \begin{description}
 \item[Change:] add new keywords \\
-New keywords are added to \CFA.
+New keywords are added to \CFA (see~\VRef{s:NewKeywords}).
 \item[Rationale:] keywords added to implement new semantics of \CFA.
 \item[Effect on original feature:] change to semantics of well-defined feature. \\
 Any ISO C programs using these keywords as identifiers are invalid \CFA programs.
-\item[Difficulty of converting:] keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism:
-\begin{lstlisting}
-int `otype` = 3;				// make keyword an identifier
-double `choose` = 3.5;
-\end{lstlisting}
-Programs can be converted automatically by enclosing keyword identifiers in backquotes, and the backquotes can be remove later when the identifier name is changed.
-Clashes in C system libraries (include files) can be handled automatically using preprocessor, ©#include_next© and ©-Ifilename©:
-\begin{lstlisting}
-// include file uses the CFA keyword "otype".
-#if ! defined( otype )			// nesting ?
-#define otype `otype`
-#define __CFA_BFD_H__
-#endif // ! otype
-
-#include_next <bfd.h>			// must have internal check for multiple expansion
-
-#if defined( otype ) && defined( __CFA_BFD_H__ )	// reset only if set
-#undef otype
-#undef __CFA_BFD_H__
-#endif // otype && __CFA_BFD_H__
-\end{lstlisting}
+\item[Difficulty of converting:] keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism (see~\VRef{s:BackquoteIdentifiers}):
 \item[How widely used:] clashes among new \CFA keywords and existing identifiers are rare.
 \end{description}
@@ -4384,5 +4435,5 @@
 int rtn( int i );
 int rtn( char c );
-rtn( 'x' );						// programmer expects 2nd rtn to be called
+rtn( 'x' );						§\C{// programmer expects 2nd rtn to be called}§
 \end{lstlisting}
 \item[Rationale:] it is more intuitive for the call to ©rtn© to match the second version of definition of ©rtn© rather than the first.
@@ -4406,6 +4457,6 @@
 \item[Change:] make string literals ©const©:
 \begin{lstlisting}
-char * p = "abc";				// valid in C, deprecated in §\CFA§
-char * q = expr ? "abc" : "de";	// valid in C, invalid in §\CFA§
+char * p = "abc";				§\C{// valid in C, deprecated in \CFA}§
+char * q = expr ? "abc" : "de";	§\C{// valid in C, invalid in \CFA}§
 \end{lstlisting}
 The type of a string literal is changed from ©[] char© to ©const [] char©.
@@ -4414,5 +4465,5 @@
 \begin{lstlisting}
 char * p = "abc";
-p[0] = 'w';						// segment fault or change constant literal
+p[0] = 'w';						§\C{// segment fault or change constant literal}§
 \end{lstlisting}
 The same problem occurs when passing a string literal to a routine that changes its argument.
@@ -4426,7 +4477,7 @@
 \item[Change:] remove \newterm{tentative definitions}, which only occurs at file scope:
 \begin{lstlisting}
-int i;							// forward definition
-int *j = ®&i®;					// forward reference, valid in C, invalid in §\CFA§
-int i = 0;						// definition
+int i;							§\C{// forward definition}§
+int *j = ®&i®;					§\C{// forward reference, valid in C, invalid in \CFA}§
+int i = 0;						§\C{// definition}§
 \end{lstlisting}
 is valid in C, and invalid in \CFA because duplicate overloaded object definitions at the same scope level are disallowed.
@@ -4434,7 +4485,7 @@
 \begin{lstlisting}
 struct X { int i; struct X *next; };
-static struct X a;				// forward definition
-static struct X b = { 0, ®&a® };	// forward reference, valid in C, invalid in §\CFA§
-static struct X a = { 1, &b };	// definition
+static struct X a;				§\C{// forward definition}§
+static struct X b = { 0, ®&a® };	§\C{// forward reference, valid in C, invalid in \CFA}§
+static struct X a = { 1, &b };	§\C{// definition}§
 \end{lstlisting}
 \item[Rationale:] avoids having different initialization rules for builtin types and userdefined types.
@@ -4446,30 +4497,27 @@
 \item
 \begin{description}
-\item[Change:] have ©struct© introduce a scope for nested types
-In C, the name of the nested types belongs to the same scope as the name of the outermost enclosing 
-Example:
+\item[Change:] have ©struct© introduce a scope for nested types:
 \begin{lstlisting}
 enum ®Colour® { R, G, B, Y, C, M };
 struct Person {
-	enum ®Colour® { R, G, B };	// nested type
-	struct Face {				// nested type
-		®Colour® Eyes, Hair;		// type defined outside (1 level)
+	enum ®Colour® { R, G, B };	§\C{// nested type}§
+	struct Face {				§\C{// nested type}§
+		®Colour® Eyes, Hair;	§\C{// type defined outside (1 level)}§
 	};
-	ß.ß®Colour® shirt;				// type defined outside (top level)
-	®Colour® pants;				// type defined same level
-	Face looks[10];				// type defined same level
+	ß.ß®Colour® shirt;			§\C{// type defined outside (top level)}§
+	®Colour® pants;				§\C{// type defined same level}§
+	Face looks[10];				§\C{// type defined same level}§
 };
-®Colour® c = R;					// type/enum defined same level
-Personß.ß®Colour® pc = Personß.ßR;	// type/enum defined inside
-Personß.ßFace pretty;				// type defined inside
-\end{lstlisting}
+®Colour® c = R;					§\C{// type/enum defined same level}§
+Personß.ß®Colour® pc = Personß.ßR;	§\C{// type/enum defined inside}§
+Personß.ßFace pretty;			§\C{// type defined inside}§
+\end{lstlisting}
+In C, the name of the nested types belongs to the same scope as the name of the outermost enclosing structure, i.e., the nested types are hoisted to the scope of the outer-most type, which is not useful and confusing.
+\CFA is C \emph{incompatible} on this issue, and provides semantics similar to \Index*[C++]{\CC}.
+Nested types are not hoisted and can be referenced using the field selection operator ``©.©'', unlike the \CC scope-resolution operator ``©::©''.
 \item[Rationale:] ©struct© scope is crucial to \CFA as an information structuring and hiding mechanism.
 \item[Effect on original feature:] change to semantics of well-defined feature.
 \item[Difficulty of converting:] Semantic transformation.
 \item[How widely used:] C programs rarely have nest types because they are equivalent to the hoisted version.
-
-\CFA is C \emph{incompatible} on this issue, and provides semantics similar to \Index*[C++]{\CC}.
-Nested types are not hoisted and can be referenced using the field selection operator ``©.©'', unlike the \CC scope-resolution operator ``©::©''.
-Given that nested types in C are equivalent to not using them, i.e., they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility.
 \end{description}
 
@@ -4480,5 +4528,5 @@
 \item[Difficulty of converting:] Semantic transformation. To make the struct type name visible in the scope of the enclosing struct, the struct tag could be declared in the scope of the enclosing struct, before the enclosing struct is defined. Example:
 \begin{lstlisting}
-struct Y; // struct Y and struct X are at the same scope
+struct Y;						§\C{// struct Y and struct X are at the same scope}§
 struct X {
 struct Y { /* ... */ } y;
@@ -4501,4 +4549,44 @@
 
 
+\section{New Keywords}
+\label{s:NewKeywords}
+
+\begin{quote2}
+\begin{tabular}{lll}
+©catch©			& ©fallthrough©	& ©otype©		\\
+©catchResume©	& ©fallthru©	& ©throw©		\\
+©choose©		& ©finally©		& ©throwResume©	\\
+©disable©		& ©forall©		& ©trait©		\\
+©dtype©			& ©ftype©		& ©try©			\\
+©enable©		& ©lvalue©		&				\\
+\end{tabular}
+\end{quote2}
+
+
+\section{Standard Headers}
+\label{s:StandardHeaders}
+
+C prescribes the following standard header-files~\cite[\S~7.1.2]{C11}:
+\begin{quote2}
+\begin{minipage}{\linewidth}
+\begin{tabular}{lll}
+assert.h	& math.h		& stdlib.h		\\
+complex.h	& setjmp.h		& stdnoreturn.h	\\
+ctype.h		& signal.h		& string.h		\\
+errno.h		& stdalign.h	& tgmath.h		\\
+fenv.h		& stdarg.h		& threads.h		\\
+float.h		& stdatomic.h	& time.h		\\
+inttypes.h	& stdbool.h		& uchar.h		\\
+iso646.h	& stddef.h		& wchar.h		\\
+limits.h	& stdint.h		& wctype.h		\\
+locale.h	& stdio.h		& unistd.h\footnote{\CFA extension}
+\end{tabular}
+\end{minipage}
+\end{quote2}
+For the prescribed head-files, \CFA implicitly wraps their includes in an ©extern "C"©;
+hence, names in these include files are not mangled\index{mangling!name} (see~\VRef{s:Interoperability}).
+All other C header files must be explicitly wrapped in ©extern "C"© to prevent name mangling.
+
+
 \section{I/O Library}
 \label{s:IOLibrary}
@@ -4570,5 +4658,6 @@
 %$
 \begin{lstlisting}[mathescape=off]
-sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¡" | 7 | "x ¿" | 8 | "x «" | 9 | endl;
+sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¡" | 7
+	 | "x ¿" | 8 | "x «" | 9 | endl;
 \end{lstlisting}
 %$
@@ -4580,6 +4669,6 @@
 A seperator does not appear after a C string ending with the (extended) \Index{ASCII}\index{ASCII!extended} characters: ©,.:;!?)]}%¢»©
 \begin{lstlisting}[belowskip=0pt]
-sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 | ") x" | 8 | "] x" | 9 | "} x"
-	 | 10 | "% x" | 11 | "¢ x" | 12 | "» x" | endl;
+sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7
+	 | ") x" | 8 | "] x" | 9 | "} x" | 10 | "% x" | 11 | "¢ x" | 12 | "» x" | endl;
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -4597,5 +4686,5 @@
 The following \CC-style \Index{manipulator}s allow further control over implicit seperation.
 \begin{lstlisting}[mathescape=off,belowskip=0pt]
-sout | sepOn | 1 | 2 | 3 | sepOn | endl;	// separator at start of line
+sout | sepOn | 1 | 2 | 3 | sepOn | endl;	§\C{// separator at start of line}§
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -4603,5 +4692,5 @@
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
-sout | 1 | sepOff | 2 | 3 | endl;			// turn off implicit separator temporarily
+sout | 1 | sepOff | 2 | 3 | endl;			§\C{// turn off implicit separator temporarily}§
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -4609,5 +4698,5 @@
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
-sout | sepDisable | 1 | 2 | 3 | endl;		// turn off implicit separation, affects all subsequent prints
+sout | sepDisable | 1 | 2 | 3 | endl;		§\C{// turn off implicit separation, affects all subsequent prints}§
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -4615,5 +4704,5 @@
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
-sout | 1 | sepOn | 2 | 3 | endl;			// turn on implicit separator temporarily
+sout | 1 | sepOn | 2 | 3 | endl;			§\C{// turn on implicit separator temporarily}§
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -4621,5 +4710,5 @@
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt]
-sout | sepEnable | 1 | 2 | 3 | endl;		// turn on implicit separation, affects all subsequent prints
+sout | sepEnable | 1 | 2 | 3 | endl;		§\C{// turn on implicit separation, affects all subsequent prints}§
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
@@ -4627,5 +4716,5 @@
 \end{lstlisting}
 \begin{lstlisting}[mathescape=off,aboveskip=0pt,aboveskip=0pt,belowskip=0pt]
-sepSet( sout, ", $" );						// change separator from " " to ", $"
+sepSet( sout, ", $" );						§\C{// change separator from " " to ", \$"}§
 sout | 1 | 2 | 3 | endl;
 \end{lstlisting}
@@ -4673,4 +4762,5 @@
 \subsection{malloc}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 forall( otype T ) T * malloc( void );§\indexc{malloc}§
@@ -4689,8 +4779,9 @@
 forall( otype T ) T * memset( T * ptr );				// remove when default value available
 \end{lstlisting}
-\ 
+
 
 \subsection{ato / strto}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 int ato( const char * ptr );§\indexc{ato}§
@@ -4720,9 +4811,9 @@
 long double _Complex strto( const char * sptr, char ** eptr );
 \end{lstlisting}
-\ 
 
 
 \subsection{bsearch / qsort}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 forall( otype T | { int ?<?( T, T ); } )
@@ -4732,9 +4823,9 @@
 void qsort( const T * arr, size_t dimension );§\indexc{qsort}§
 \end{lstlisting}
-\ 
 
 
 \subsection{abs}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 char abs( char );§\indexc{abs}§
@@ -4749,9 +4840,9 @@
 long double abs( long double _Complex );
 \end{lstlisting}
-\ 
 
 
 \subsection{random}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 void rand48seed( long int s );§\indexc{rand48seed}§
@@ -4767,9 +4858,9 @@
 long double _Complex rand48();
 \end{lstlisting}
-\ 
 
 
 \subsection{min / max / clamp / swap}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 forall( otype T | { int ?<?( T, T ); } )
@@ -4785,5 +4876,4 @@
 void swap( T * t1, T * t2 );§\indexc{swap}§
 \end{lstlisting}
-\ 
 
 
@@ -4796,4 +4886,5 @@
 \subsection{General}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 float fabs( float );§\indexc{fabs}§
@@ -4841,9 +4932,9 @@
 long double nan( const char * );
 \end{lstlisting}
-\ 
 
 
 \subsection{Exponential}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 float exp( float );§\indexc{exp}§
@@ -4898,9 +4989,9 @@
 long double logb( long double );
 \end{lstlisting}
-\ 
 
 
 \subsection{Power}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 float sqrt( float );§\indexc{sqrt}§
@@ -4926,9 +5017,9 @@
 long double _Complex pow( long double _Complex, long double _Complex );
 \end{lstlisting}
-\ 
 
 
 \subsection{Trigonometric}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 float sin( float );§\indexc{sin}§
@@ -4982,9 +5073,9 @@
 long double atan( long double, long double );
 \end{lstlisting}
-\ 
 
 
 \subsection{Hyperbolic}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 float sinh( float );§\indexc{sinh}§
@@ -5030,9 +5121,9 @@
 long double _Complex atanh( long double _Complex );
 \end{lstlisting}
-\ 
 
 
 \subsection{Error / Gamma}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 float erf( float );§\indexc{erf}§
@@ -5061,9 +5152,9 @@
 long double tgamma( long double );
 \end{lstlisting}
-\ 
 
 
 \subsection{Nearest Integer}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 float floor( float );§\indexc{floor}§
@@ -5115,9 +5206,9 @@
 long long int llround( long double );
 \end{lstlisting}
-\ 
 
 
 \subsection{Manipulation}
 
+\leavevmode
 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
 float copysign( float, float );§\indexc{copysign}§
@@ -5156,5 +5247,4 @@
 long double scalbln( long double, long int );
 \end{lstlisting}
-\ 
 
 
@@ -5162,5 +5252,5 @@
 \label{s:RationalNumbers}
 
-Rational numbers are numbers written as a ratio, i.e., as a fraction, where the numerator (top number) and the denominator (bottom number) are whole numbers.
+Rational numbers are numbers written as a ratio, \ie as a fraction, where the numerator (top number) and the denominator (bottom number) are whole numbers.
 When creating and computing with rational numbers, results are constantly reduced to keep the numerator and denominator as small as possible.
 
Index: doc/working/resolver_design.md
===================================================================
--- doc/working/resolver_design.md	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ doc/working/resolver_design.md	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -37,5 +37,5 @@
 
 An alternate possibility would be to only count two-arg constructors 
-`void ?{} ( To*, From )` as unsafe conversions; under this semantics, safe and  
+`void ?{} ( To*, From )` as unsafe conversions; under this semantics, safe and 
 explicit conversions should also have a compiler-enforced restriction to 
 ensure that they are two-arg functions (this restriction may be valuable 
@@ -69,5 +69,5 @@
 two chains of conversions, one among the signed integral types, another among 
 the unsigned, and to use monomorphic conversions to allow conversions between 
-signed and unsigned integer types).   
+signed and unsigned integer types).
 
 ### Implementation Details ###
@@ -509,5 +509,5 @@
 A variant of the above scheme would be to fix a maximum depth of polymorphic 
 type variables (16 seems like a reasonable choice) at which a parameter would 
-be considered to be effectively monomorphic, and to subtract the value  
+be considered to be effectively monomorphic, and to subtract the value 
 described above from that maximum, clamping the result to a minimum of 0. 
 Under this scheme, assuming a maximum value of 4, `int` has value 0, `T` has 
@@ -577,5 +577,5 @@
 specifying the (completely arbitrary) maximum depth as part of the language or 
 allowing the compiler to refuse to accept otherwise well-typed deeply-nested 
-polymorphic types.  
+polymorphic types.
 
 For purposes of determining polymorphism, the list of return types of a 
@@ -951,7 +951,7 @@
 `sizeof`, `alignof`, and `offsetof` expressions have at most a single 
 interpretation, of type `size_t`. 
-`sizeof` and `alignof` expressions take either a type or an expression as a  
-an argument; if the argument is a type, it must be a complete type which is 
-not a function type, if an expression, the expression must have a single 
+`sizeof` and `alignof` expressions take either a type or an expression as an 
+argument; if the argument is a type, it must be a complete type which is not a 
+function type, if an expression, the expression must have a single 
 interpretation, the type of which conforms to the same rules. 
 `offsetof` takes two arguments, a type and a member name; the type must be 
@@ -1620,2 +1620,9 @@
 			= delete;
 	}
+
+## Appendix E: Features to Add in Resolver Re-write ##
+* Reference types
+* Special types for 0 and 1 literals
+* Expression type for return statement that resolves similarly to ?=?
+  - This is to get rid of the kludge in the box pass that effectively 
+    re-implements the resolver poorly.
Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/CodeGen/CodeGenerator.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 15 15:53:15 2016
-// Update Count     : 306
+// Last Modified On : Thu Aug  4 13:35:30 2016
+// Update Count     : 352
 //
 
@@ -45,8 +45,8 @@
 	bool wantSpacing( Statement * stmt) {
 		return dynamic_cast< IfStmt * >( stmt ) || dynamic_cast< CompoundStmt * >( stmt ) ||
-			dynamic_cast< WhileStmt * >( stmt ) || dynamic_cast< ForStmt * > ( stmt ) || dynamic_cast< SwitchStmt *>( stmt );
-	}
-
-	void CodeGenerator::extension( Expression *expr ) {
+			dynamic_cast< WhileStmt * >( stmt ) || dynamic_cast< ForStmt * >( stmt ) || dynamic_cast< SwitchStmt *>( stmt );
+	}
+
+	void CodeGenerator::extension( Expression * expr ) {
 		if ( expr->get_extension() ) {
 			output << "__extension__ ";
@@ -54,5 +54,5 @@
 	} // extension
 
-	void CodeGenerator::extension( Declaration *decl ) {
+	void CodeGenerator::extension( Declaration * decl ) {
 		if ( decl->get_extension() ) {
 			output << "__extension__ ";
@@ -73,5 +73,5 @@
 	}
 
-	ostream & operator<<( ostream & output, CodeGenerator::LabelPrinter &printLabels ) {
+	ostream & operator<<( ostream & output, CodeGenerator::LabelPrinter & printLabels ) {
 		std::list< Label > & labs = *printLabels.labels;
 		// l.unique(); // assumes a sorted list. Why not use set? Does order matter?
@@ -79,21 +79,21 @@
 			output << l.get_name() + ": ";
 			printLabels.cg.genAttributes( l.get_attributes() );
-		}
+		} // for
 		return output;
 	}
 
-	CodeGenerator::CodeGenerator( std::ostream &os ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ), printLabels( *this ) { }
-
-	CodeGenerator::CodeGenerator( std::ostream &os, std::string init, int indentation, bool infunp )
+	CodeGenerator::CodeGenerator( std::ostream & os ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ), printLabels( *this ) {}
+
+	CodeGenerator::CodeGenerator( std::ostream & os, std::string init, int indentation, bool infunp )
 			: indent( *this), cur_indent( indentation ), insideFunction( infunp ), output( os ), printLabels( *this ) {
 		//output << std::string( init );
 	}
 
-	CodeGenerator::CodeGenerator( std::ostream &os, char *init, int indentation, bool infunp )
+	CodeGenerator::CodeGenerator( std::ostream & os, char * init, int indentation, bool infunp )
 			: indent( *this ), cur_indent( indentation ), insideFunction( infunp ), output( os ), printLabels( *this ) {
 		//output << std::string( init );
 	}
 
-	string mangleName( DeclarationWithType *decl ) {
+	string mangleName( DeclarationWithType * decl ) {
 		if ( decl->get_mangleName() != "" ) {
 			// need to incorporate scope level in order to differentiate names for destructors
@@ -112,14 +112,14 @@
 					genCommaList( attr->get_parameters().begin(), attr->get_parameters().end() );
 					output << ")";
-				}
+				} // if
 				output << ",";
-			}
+			} // for
 			output << ")) ";
-		}
+		} // if
 	}
 
 
 	//*** Declarations
-	void CodeGenerator::visit( FunctionDecl *functionDecl ) {
+	void CodeGenerator::visit( FunctionDecl * functionDecl ) {
 		extension( functionDecl );
 		genAttributes( functionDecl->get_attributes() );
@@ -146,6 +146,8 @@
 	}
 
-	void CodeGenerator::visit( ObjectDecl *objectDecl ) {
+	void CodeGenerator::visit( ObjectDecl * objectDecl ) {
 		extension( objectDecl );
+		genAttributes( objectDecl->get_attributes() );
+
 		handleStorageClass( objectDecl );
 		output << genType( objectDecl->get_type(), mangleName( objectDecl ) );
@@ -155,4 +157,5 @@
 			objectDecl->get_init()->accept( *this );
 		} // if
+
 		if ( objectDecl->get_bitfieldWidth() ) {
 			output << ":";
@@ -161,20 +164,20 @@
 	}
 
-	void CodeGenerator::handleAggregate( AggregateDecl *aggDecl ) {
+	void CodeGenerator::handleAggregate( AggregateDecl * aggDecl ) {
 		if ( aggDecl->get_name() != "" )
 			output << aggDecl->get_name();
 
-		std::list< Declaration * > &memb = aggDecl->get_members();
+		std::list< Declaration * > & memb = aggDecl->get_members();
 		if ( ! memb.empty() ) {
 //		if ( aggDecl->has_body() ) {
-//			std::list< Declaration * > &memb = aggDecl->get_members();
+//			std::list< Declaration * > & memb = aggDecl->get_members();
 			output << " {" << endl;
 
 			cur_indent += CodeGenerator::tabsize;
-			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
+			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++ ) {
 				output << indent;
 				(*i)->accept( *this );
 				output << ";" << endl;
-			}
+			} // for
 
 			cur_indent -= CodeGenerator::tabsize;
@@ -184,5 +187,5 @@
 	}
 
-	void CodeGenerator::visit( StructDecl *structDecl ) {
+	void CodeGenerator::visit( StructDecl * structDecl ) {
 		extension( structDecl );
 		output << "struct ";
@@ -190,5 +193,5 @@
 	}
 
-	void CodeGenerator::visit( UnionDecl *unionDecl ) {
+	void CodeGenerator::visit( UnionDecl * unionDecl ) {
 		extension( unionDecl );
 		output << "union ";
@@ -196,5 +199,5 @@
 	}
 
-	void CodeGenerator::visit( EnumDecl *enumDecl ) {
+	void CodeGenerator::visit( EnumDecl * enumDecl ) {
 		extension( enumDecl );
 		output << "enum ";
@@ -210,5 +213,5 @@
 			cur_indent += CodeGenerator::tabsize;
 			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
-				ObjectDecl *obj = dynamic_cast< ObjectDecl* >( *i );
+				ObjectDecl * obj = dynamic_cast< ObjectDecl* >( *i );
 				assert( obj );
 				output << indent << mangleName( obj );
@@ -226,7 +229,7 @@
 	}
 
-	void CodeGenerator::visit( TraitDecl *traitDecl ) {}
-
-	void CodeGenerator::visit( TypedefDecl *typeDecl ) {
+	void CodeGenerator::visit( TraitDecl * traitDecl ) {}
+
+	void CodeGenerator::visit( TypedefDecl * typeDecl ) {
 		assert( false && "Typedefs are removed and substituted in earlier passes." );
 		//output << "typedef ";
@@ -234,5 +237,5 @@
 	}
 
-	void CodeGenerator::visit( TypeDecl *typeDecl ) {
+	void CodeGenerator::visit( TypeDecl * typeDecl ) {
 		// really, we should mutate this into something that isn't a TypeDecl but that requires large-scale changes,
 		// still to be done
@@ -257,34 +260,34 @@
 				(*iter)->accept( *this );
 				output << "]";
-			}
-		}
+			} // if
+		} // for
 		output << " = ";
 	}
 
-	void CodeGenerator::visit( SingleInit *init ) {
+	void CodeGenerator::visit( SingleInit * init ) {
 		printDesignators( init->get_designators() );
 		init->get_value()->accept( *this );
 	}
 
-	void CodeGenerator::visit( ListInit *init ) {
+	void CodeGenerator::visit( ListInit * init ) {
 		printDesignators( init->get_designators() );
 		output << "{ ";
-		if ( init->begin_initializers() == init->end_initializers() ) {
+		if ( init->begin() == init->end() ) {
 			// illegal to leave initializer list empty for scalar initializers, but always legal to have 0
 			output << "0";
 		} else {
-			genCommaList( init->begin_initializers(), init->end_initializers() );
-		}
+			genCommaList( init->begin(), init->end() );
+		} // if
 		output << " }";
 	}
 
-	void CodeGenerator::visit( Constant *constant ) {
+	void CodeGenerator::visit( Constant * constant ) {
 		output << constant->get_value() ;
 	}
 
 	//*** Expressions
-	void CodeGenerator::visit( ApplicationExpr *applicationExpr ) {
+	void CodeGenerator::visit( ApplicationExpr * applicationExpr ) {
 		extension( applicationExpr );
-		if ( VariableExpr *varExpr = dynamic_cast< VariableExpr* >( applicationExpr->get_function() ) ) {
+		if ( VariableExpr * varExpr = dynamic_cast< VariableExpr* >( applicationExpr->get_function() ) ) {
 			OperatorInfo opInfo;
 			if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( varExpr->get_var()->get_name(), opInfo ) ) {
@@ -298,10 +301,10 @@
 					{
 						assert( arg != applicationExpr->get_args().end() );
-						if ( AddressExpr *addrExpr = dynamic_cast< AddressExpr * >( *arg ) ) {
+						if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( *arg ) ) {
 							// remove & from first assignment/ctor argument
 							*arg = addrExpr->get_arg();
 						} else {
 							// no address-of operator, so must be a pointer - add dereference
-							UntypedExpr *newExpr = new UntypedExpr( new NameExpr( "*?" ) );
+							UntypedExpr * newExpr = new UntypedExpr( new NameExpr( "*?" ) );
 							newExpr->get_args().push_back( *arg );
 							assert( (*arg)->get_results().size() == 1 );
@@ -317,5 +320,5 @@
 					// do nothing
 					;
-				}
+				} // switch
 
 				switch ( opInfo.type ) {
@@ -351,5 +354,5 @@
 						// no constructors with 0 or more than 2 parameters
 						assert( false );
-					}
+					} // if
 					break;
 
@@ -385,5 +388,5 @@
 					// there are no intrinsic definitions of 0/1 or label addresses as functions
 					assert( false );
-				}
+				} // switch
 			} else {
 				varExpr->accept( *this );
@@ -400,7 +403,7 @@
 	}
 
-	void CodeGenerator::visit( UntypedExpr *untypedExpr ) {
+	void CodeGenerator::visit( UntypedExpr * untypedExpr ) {
 		extension( untypedExpr );
-		if ( NameExpr *nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) {
+		if ( NameExpr * nameExpr = dynamic_cast< NameExpr* >( untypedExpr->get_function() ) ) {
 			OperatorInfo opInfo;
 			if ( operatorLookup( nameExpr->get_name(), opInfo ) ) {
@@ -417,5 +420,4 @@
 				  case OT_CALL:
 					assert( false );
-
 
 				  case OT_CTOR:
@@ -437,5 +439,5 @@
 						// no constructors with 0 or more than 2 parameters
 						assert( false );
-					}
+					} // if
 					break;
 
@@ -470,10 +472,17 @@
 					// there are no intrinsic definitions of 0 or 1 as functions
 					assert( false );
-				}
+				} // switch
 			} else {
-				nameExpr->accept( *this );
-				output << "(";
-				genCommaList( untypedExpr->get_args().begin(), untypedExpr->get_args().end() );
-				output << ")";
+				if ( nameExpr->get_name() == "..." ) { // case V1 ... V2 or case V1~V2
+					assert( untypedExpr->get_args().size() == 2 );
+					(*untypedExpr->get_args().begin())->accept( *this );
+					output << " ... ";
+					(*--untypedExpr->get_args().end())->accept( *this );
+				} else {								// builtin routines
+					nameExpr->accept( *this );
+					output << "(";
+					genCommaList( untypedExpr->get_args().begin(), untypedExpr->get_args().end() );
+					output << ")";
+				} // if
 			} // if
 		} else {
@@ -485,5 +494,11 @@
 	}
 
-	void CodeGenerator::visit( NameExpr *nameExpr ) {
+	void CodeGenerator::visit( RangeExpr * rangeExpr ) {
+		rangeExpr->get_low()->accept( *this );
+		output << " ... ";
+		rangeExpr->get_high()->accept( *this );
+	}
+
+	void CodeGenerator::visit( NameExpr * nameExpr ) {
 		extension( nameExpr );
 		OperatorInfo opInfo;
@@ -496,9 +511,9 @@
 	}
 
-	void CodeGenerator::visit( AddressExpr *addressExpr ) {
+	void CodeGenerator::visit( AddressExpr * addressExpr ) {
 		extension( addressExpr );
 		output << "(&";
 		// this hack makes sure that we don't convert "constant_zero" to "0" if we're taking its address
-		if ( VariableExpr *variableExpr = dynamic_cast< VariableExpr* >( addressExpr->get_arg() ) ) {
+		if ( VariableExpr * variableExpr = dynamic_cast< VariableExpr* >( addressExpr->get_arg() ) ) {
 			output << mangleName( variableExpr->get_var() );
 		} else {
@@ -508,5 +523,5 @@
 	}
 
-	void CodeGenerator::visit( CastExpr *castExpr ) {
+	void CodeGenerator::visit( CastExpr * castExpr ) {
 		extension( castExpr );
 		output << "(";
@@ -521,14 +536,14 @@
 			// otherwise, the cast is to an lvalue type, so the cast should be dropped, since the result of a cast is
 			// never an lvalue in C
-		}
+		} // if
 		castExpr->get_arg()->accept( *this );
 		output << ")";
 	}
 
-	void CodeGenerator::visit( UntypedMemberExpr *memberExpr ) {
+	void CodeGenerator::visit( UntypedMemberExpr * memberExpr ) {
 		assert( false );
 	}
 
-	void CodeGenerator::visit( MemberExpr *memberExpr ) {
+	void CodeGenerator::visit( MemberExpr * memberExpr ) {
 		extension( memberExpr );
 		memberExpr->get_aggregate()->accept( *this );
@@ -536,5 +551,5 @@
 	}
 
-	void CodeGenerator::visit( VariableExpr *variableExpr ) {
+	void CodeGenerator::visit( VariableExpr * variableExpr ) {
 		extension( variableExpr );
 		OperatorInfo opInfo;
@@ -546,5 +561,5 @@
 	}
 
-	void CodeGenerator::visit( ConstantExpr *constantExpr ) {
+	void CodeGenerator::visit( ConstantExpr * constantExpr ) {
 		assert( constantExpr->get_constant() );
 		extension( constantExpr );
@@ -552,5 +567,5 @@
 	}
 
-	void CodeGenerator::visit( SizeofExpr *sizeofExpr ) {
+	void CodeGenerator::visit( SizeofExpr * sizeofExpr ) {
 		extension( sizeofExpr );
 		output << "sizeof(";
@@ -563,5 +578,5 @@
 	}
 
-	void CodeGenerator::visit( AlignofExpr *alignofExpr ) {
+	void CodeGenerator::visit( AlignofExpr * alignofExpr ) {
 		// use GCC extension to avoid bumping std to C11
 		extension( alignofExpr );
@@ -575,9 +590,9 @@
 	}
 
-	void CodeGenerator::visit( UntypedOffsetofExpr *offsetofExpr ) {
+	void CodeGenerator::visit( UntypedOffsetofExpr * offsetofExpr ) {
 		assert( false && "UntypedOffsetofExpr should not reach code generation." );
 	}
 
-	void CodeGenerator::visit( OffsetofExpr *offsetofExpr ) {
+	void CodeGenerator::visit( OffsetofExpr * offsetofExpr ) {
 		// use GCC builtin
 		output << "__builtin_offsetof(";
@@ -587,9 +602,9 @@
 	}
 
-	void CodeGenerator::visit( OffsetPackExpr *offsetPackExpr ) {
+	void CodeGenerator::visit( OffsetPackExpr * offsetPackExpr ) {
 		assert( false && "OffsetPackExpr should not reach code generation." );
 	}
 
-	void CodeGenerator::visit( LogicalExpr *logicalExpr ) {
+	void CodeGenerator::visit( LogicalExpr * logicalExpr ) {
 		extension( logicalExpr );
 		output << "(";
@@ -604,5 +619,5 @@
 	}
 
-	void CodeGenerator::visit( ConditionalExpr *conditionalExpr ) {
+	void CodeGenerator::visit( ConditionalExpr * conditionalExpr ) {
 		extension( conditionalExpr );
 		output << "(";
@@ -615,5 +630,5 @@
 	}
 
-	void CodeGenerator::visit( CommaExpr *commaExpr ) {
+	void CodeGenerator::visit( CommaExpr * commaExpr ) {
 		extension( commaExpr );
 		output << "(";
@@ -624,9 +639,9 @@
 	}
 
-	void CodeGenerator::visit( TupleExpr *tupleExpr ) {}
-
-	void CodeGenerator::visit( TypeExpr *typeExpr ) {}
-
-	void CodeGenerator::visit( AsmExpr *asmExpr ) {
+	void CodeGenerator::visit( TupleExpr * tupleExpr ) {}
+
+	void CodeGenerator::visit( TypeExpr * typeExpr ) {}
+
+	void CodeGenerator::visit( AsmExpr * asmExpr ) {
 		if ( asmExpr->get_inout() ) {
 			output << "[ ";
@@ -641,5 +656,5 @@
 
 	//*** Statements
-	void CodeGenerator::visit( CompoundStmt *compoundStmt ) {
+	void CodeGenerator::visit( CompoundStmt * compoundStmt ) {
 		std::list<Statement*> ks = compoundStmt->get_kids();
 		output << "{" << endl;
@@ -654,6 +669,6 @@
 			if ( wantSpacing( *i ) ) {
 				output << endl;
-			}
-		}
+			} // if
+		} // for
 		cur_indent -= CodeGenerator::tabsize;
 
@@ -661,5 +676,5 @@
 	}
 
-	void CodeGenerator::visit( ExprStmt *exprStmt ) {
+	void CodeGenerator::visit( ExprStmt * exprStmt ) {
 		assert( exprStmt );
 		// cast the top-level expression to void to reduce gcc warnings.
@@ -669,5 +684,5 @@
 	}
 
-	void CodeGenerator::visit( AsmStmt *asmStmt ) {
+	void CodeGenerator::visit( AsmStmt * asmStmt ) {
 		output << "asm ";
 		if ( asmStmt->get_voltile() ) output << "volatile ";
@@ -692,5 +707,5 @@
 	}
 
-	void CodeGenerator::visit( IfStmt *ifStmt ) {
+	void CodeGenerator::visit( IfStmt * ifStmt ) {
 		output << "if ( ";
 		ifStmt->get_condition()->accept( *this );
@@ -705,5 +720,5 @@
 	}
 
-	void CodeGenerator::visit( SwitchStmt *switchStmt ) {
+	void CodeGenerator::visit( SwitchStmt * switchStmt ) {
 		output << "switch ( " ;
 		switchStmt->get_condition()->accept( *this );
@@ -712,13 +727,10 @@
 		output << "{" << std::endl;
 		cur_indent += CodeGenerator::tabsize;
-
-		acceptAll( switchStmt->get_branches(), *this );
-
+		acceptAll( switchStmt->get_statements(), *this );
 		cur_indent -= CodeGenerator::tabsize;
-
 		output << indent << "}";
 	}
 
-	void CodeGenerator::visit( CaseStmt *caseStmt ) {
+	void CodeGenerator::visit( CaseStmt * caseStmt ) {
 		output << indent;
 		if ( caseStmt->isDefault()) {
@@ -737,9 +749,9 @@
 			(*i)->accept( *this );
 			output << endl;
-		}
+		} // for
 		cur_indent -= CodeGenerator::tabsize;
 	}
 
-	void CodeGenerator::visit( BranchStmt *branchStmt ) {
+	void CodeGenerator::visit( BranchStmt * branchStmt ) {
 		switch ( branchStmt->get_type()) {
 		  case BranchStmt::Goto:
@@ -759,10 +771,10 @@
 			output << "continue";
 			break;
-		}
+		} // switch
 		output << ";";
 	}
 
 
-	void CodeGenerator::visit( ReturnStmt *returnStmt ) {
+	void CodeGenerator::visit( ReturnStmt * returnStmt ) {
 		output << "return ";
 		maybeAccept( returnStmt->get_expr(), *this );
@@ -770,5 +782,5 @@
 	}
 
-	void CodeGenerator::visit( WhileStmt *whileStmt ) {
+	void CodeGenerator::visit( WhileStmt * whileStmt ) {
 		if ( whileStmt->get_isDoWhile() ) {
 			output << "do" ;
@@ -792,5 +804,5 @@
 	}
 
-	void CodeGenerator::visit( ForStmt *forStmt ) {
+	void CodeGenerator::visit( ForStmt * forStmt ) {
 		// initialization is always hoisted, so don't bother doing anything with that
 		output << "for (;";
@@ -798,5 +810,5 @@
 		if ( forStmt->get_condition() != 0 ) {
 			forStmt->get_condition()->accept( *this );
-		}
+		} // if
 		output << ";";
 
@@ -805,5 +817,5 @@
 			Expression * expr = new CastExpr( forStmt->get_increment() );
 			expr->accept( *this );
-		}
+		} // if
 		output << ") ";
 
@@ -814,10 +826,10 @@
 	}
 
-	void CodeGenerator::visit( NullStmt *nullStmt ) {
+	void CodeGenerator::visit( NullStmt * nullStmt ) {
 		//output << indent << CodeGenerator::printLabels( nullStmt->get_labels() );
 		output << "/* null statement */ ;";
 	}
 
-	void CodeGenerator::visit( DeclStmt *declStmt ) {
+	void CodeGenerator::visit( DeclStmt * declStmt ) {
 		declStmt->get_decl()->accept( *this );
 
@@ -827,5 +839,5 @@
 	}
 
-	void CodeGenerator::handleStorageClass( Declaration *decl ) {
+	void CodeGenerator::handleStorageClass( Declaration * decl ) {
 		switch ( decl->get_storageClass() ) {
 		  case DeclarationNode::Extern:
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/CodeGen/CodeGenerator.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jul  4 17:12:40 2016
-// Update Count     : 34
+// Last Modified On : Thu Aug  4 13:37:07 2016
+// Update Count     : 38
 //
 
@@ -54,4 +54,5 @@
 		virtual void visit( ApplicationExpr *applicationExpr );
 		virtual void visit( UntypedExpr *untypedExpr );
+		virtual void visit( RangeExpr * rangeExpr );
 		virtual void visit( NameExpr *nameExpr );
 		virtual void visit( AddressExpr *addressExpr );
@@ -118,5 +119,5 @@
 		void handleAggregate( AggregateDecl *aggDecl );
 		void handleTypedef( NamedTypeDecl *namedType );
-	};
+	}; // CodeGenerator
 
 	template< class Iterator >
Index: c/ControlStruct/CaseRangeMutator.cc
===================================================================
--- src/ControlStruct/CaseRangeMutator.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ 	(revision )
@@ -1,192 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// CaseRangeMutator.cc -- 
-//
-// Author           : Rodolfo G. Esteves
-// Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:35:13 2016
-// Update Count     : 9
-//
-
-#include <list>
-#include <cassert>
-#include <cstdlib>
-#include <iterator>
-
-#include "Common/utility.h"
-
-#include "SynTree/Statement.h"
-#include "SynTree/Expression.h"
-#include "SynTree/Constant.h"
-#include "SynTree/Type.h"
-#include "CaseRangeMutator.h"
-
-namespace ControlStruct {
-	Statement *CaseRangeMutator::mutate( SwitchStmt *switchStmt ) {
-		std::list< Statement * > &cases = switchStmt->get_branches();
-
-		// a `for' would be more natural... all this contortions are because `replace' invalidates the iterator
-		std::list< Statement * >::iterator i = cases.begin();
-		while ( i != cases.end() ) {
-			(*i )->acceptMutator( *this );
-
-			if ( ! newCaseLabels.empty() ) {
-				std::list< Statement * > newCases;
-
-				// transform( newCaseLabels.begin(), newCaseLabels.end(), bnd1st( ptr_fun( ctor< CaseStmt, Label, Expression * > ) ) );
-
-				for ( std::list< Expression * >::iterator j = newCaseLabels.begin();
-					  j != newCaseLabels.end(); j++ ) {
-					std::list<Label> emptyLabels;
-					std::list< Statement *> emptyStmts;
-					newCases.push_back( new CaseStmt( emptyLabels, *j, emptyStmts ) );
-				} // for
-
-				if ( CaseStmt *currentCase = dynamic_cast< CaseStmt * > ( *i ) )
-					if ( ! currentCase->get_statements().empty() ) {
-						CaseStmt *lastCase = dynamic_cast< CaseStmt * > ( newCases.back() );
-						if ( lastCase == 0 ) { throw ( 0 ); /* FIXME */ } // something is very wrong, as I just made these, and they were all cases
-						// transfer the statement block ( if any ) to the new list:
-						lastCase->set_statements( currentCase->get_statements() );
-					} // if
-				std::list< Statement * >::iterator j = i; advance( j, 1 );
-				replace ( cases, i, newCases );
-				i = j;
-				newCaseLabels.clear();
-			} else
-				i++;
-		} // while
-
-		return switchStmt;
-	}
-
-	Statement *CaseRangeMutator::mutate( CaseStmt *caseStmt ) {
-		UntypedExpr *cond;
-		if ( ( cond = dynamic_cast< UntypedExpr * >( caseStmt->get_condition() )) != 0 ) {
-			NameExpr *nmfunc;
-			if ( ( nmfunc = dynamic_cast< NameExpr *>( cond->get_function() )) != 0 ) {
-				if ( nmfunc->get_name() == std::string("Range") ) {
-					assert( cond->get_args().size() == 2 );
-					std::list<Expression *>::iterator i = cond->get_args().begin();
-					Expression *lo = *i, *hi = *(++i ); // "unnecessary" temporaries
-					fillRange( lo, hi );
-				} // if
-			} // if
-		} else if ( TupleExpr *tcond = dynamic_cast< TupleExpr * >( caseStmt->get_condition() ) ) {
-			// case list
-			assert( ! tcond->get_exprs().empty() );
-			for ( std::list< Expression * >::iterator i = tcond->get_exprs().begin(); i != tcond->get_exprs().end(); i++ )
-				newCaseLabels.push_back( *i ); // do I need to clone them?
-		} // if
-
-		std::list< Statement * > &stmts = caseStmt->get_statements();
-		mutateAll ( stmts, *this );
-
-		return caseStmt;
-	}
-
-	void CaseRangeMutator::fillRange( Expression *lo, Expression *hi ) {
-		// generate the actual range ( and check for consistency )
-		Constant *c_lo, *c_hi;
-		ConstantExpr *ce_lo, *ce_hi;
-		ce_lo = dynamic_cast< ConstantExpr * >( lo );
-		ce_hi = dynamic_cast< ConstantExpr * >( hi );
-
-		if ( ce_lo && ce_hi ) {
-			c_lo = ce_lo->get_constant(); c_hi = ce_hi->get_constant();
-		} /* else {
-			 if ( ! ce_lo ) ;
-			 if ( ! ce_hi ) ;
-			 } */
-		BasicType *ty_lo = dynamic_cast< BasicType * >( c_lo->get_type() ),
-			*ty_hi = dynamic_cast< BasicType * >( c_hi->get_type() );
-	
-		if ( ! ty_lo || ! ty_hi )
-			return; // one of them is not a constant
-
-		switch ( ty_lo->get_kind() ) {
-		  case BasicType::Char:
-		  case BasicType::UnsignedChar:
-			switch ( ty_hi->get_kind() ) {
-			  case BasicType::Char:
-			  case BasicType::UnsignedChar:
-				// first case, they are both printable ASCII characters represented as 'x'
-				if ( c_lo->get_value().size() == 3 && c_hi->get_value().size() == 3 ) {
-					char ch_lo = ( c_lo->get_value())[1], ch_hi = ( c_hi->get_value())[1];
-
-					if ( ch_lo > ch_hi ) { char t=ch_lo; ch_lo=ch_hi; ch_hi=t; }
-
-					for ( char c = ch_lo; c <=  ch_hi; c++ ) {
-						Type::Qualifiers q;
-						Constant cnst( new BasicType( q, BasicType::Char ),
-									   std::string("'") + c + std::string("'") );
-						newCaseLabels.push_back( new ConstantExpr( cnst ) );
-					} // for
-
-					return;
-				} // if
-				break;
-			  default:
-				// error: incompatible constants
-				break;
-			} // switch
-			break;
-		  case BasicType::ShortSignedInt:
-		  case BasicType::ShortUnsignedInt:
-		  case BasicType::SignedInt:
-		  case BasicType::UnsignedInt:
-		  case BasicType::LongSignedInt:
-		  case BasicType::LongUnsignedInt:
-		  case BasicType::LongLongSignedInt:
-		  case BasicType::LongLongUnsignedInt:
-			switch ( ty_hi->get_kind() ) {
-			  case BasicType::ShortSignedInt:
-			  case BasicType::ShortUnsignedInt:
-			  case BasicType::SignedInt:
-			  case BasicType::UnsignedInt:
-			  case BasicType::LongSignedInt:
-			  case BasicType::LongUnsignedInt:
-			  case BasicType::LongLongSignedInt:
-			  case BasicType::LongLongUnsignedInt: {
-				  int i_lo = atoi( c_lo->get_value().c_str()),
-					  i_hi = atoi( c_hi->get_value().c_str());
-
-				  if ( i_lo > i_hi ) { int t=i_lo; i_lo=i_hi; i_hi=t; }
-
-				  for ( int c = i_lo; c <=  i_hi; c++ ) {
-					  Type::Qualifiers q;
-					  Constant cnst( new BasicType( q, ty_hi->get_kind()), // figure can't hurt (used to think in positives)
-									 toString< int >( c ) );
-					  newCaseLabels.push_back( new ConstantExpr( cnst ) );
-				  }
-
-				  return;
-			  }
-			  default:
-				// error: incompatible constants
-				break;
-			}
-			break;
-		  default:
-			break;
-		} // switch
-
-		/* End: */{ 
-			// invalid range, signal a warning (it still generates the two case labels)
-			newCaseLabels.push_back( lo );
-			newCaseLabels.push_back( hi );
-			return;
-		}
-	}
-} // namespace ControlStruct
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: c/ControlStruct/CaseRangeMutator.h
===================================================================
--- src/ControlStruct/CaseRangeMutator.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ 	(revision )
@@ -1,45 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// CaseRangeMutator.h -- 
-//
-// Author           : Rodolfo G. Esteves
-// Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:35:30 2016
-// Update Count     : 4
-//
-
-#ifndef CASERNG_MUTATOR_H
-#define CASERNG_MUTATOR_H
-
-#include <list>
-
-#include "SynTree/Mutator.h"
-
-namespace ControlStruct {
-	/// expand case ranges and turn fallthru into a null statement
-	class CaseRangeMutator : public Mutator {
-	  public:
-		CaseRangeMutator() {}
-
-		virtual Statement *mutate( SwitchStmt * );
-		virtual Statement *mutate( CaseStmt * );
-	  private:
-		void fillRange( Expression *lo, Expression *hi );
-
-		Expression *currentCondition;
-		std::list< Expression * > newCaseLabels;
-	};
-} // namespace ControlStruct
-
-#endif // CASERNG_MUTATOR_H
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/ControlStruct/MLEMutator.cc
===================================================================
--- src/ControlStruct/MLEMutator.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/ControlStruct/MLEMutator.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:36:51 2016
-// Update Count     : 197
+// Last Modified On : Thu Aug  4 11:21:32 2016
+// Update Count     : 202
 //
 
@@ -128,5 +128,5 @@
 		Label brkLabel = generator->newLabel("switchBreak");
 		enclosingControlStructures.push_back( Entry(switchStmt, brkLabel) );
-		mutateAll( switchStmt->get_branches(), *this );
+		mutateAll( switchStmt->get_statements(), *this );
 
 		Entry &e = enclosingControlStructures.back();
@@ -138,13 +138,13 @@
 			// switch should be CastStmts), append the exit label + break to the last case statement; create a default
 			// case if there are no cases
-			std::list< Statement * > &branches = switchStmt->get_branches();
-			if ( branches.empty() ) {
-				branches.push_back( CaseStmt::makeDefault() );
-			} // if
-
-			if ( CaseStmt * c = dynamic_cast< CaseStmt * >( branches.back() ) ) {
+			std::list< Statement * > &statements = switchStmt->get_statements();
+			if ( statements.empty() ) {
+				statements.push_back( CaseStmt::makeDefault() );
+			} // if
+
+			if ( CaseStmt * c = dynamic_cast< CaseStmt * >( statements.back() ) ) {
 				std::list<Label> temp; temp.push_back( brkLabel );
 				c->get_statements().push_back( new BranchStmt( temp, Label("brkLabel"), BranchStmt::Break ) );
-			} else assert(0); // as of this point, all branches of a switch are still CaseStmts
+			} else assert(0); // as of this point, all statements of a switch are still CaseStmts
 		} // if
 
Index: src/ControlStruct/Mutate.cc
===================================================================
--- src/ControlStruct/Mutate.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/ControlStruct/Mutate.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:37:45 2016
-// Update Count     : 8
+// Last Modified On : Thu Aug  4 11:39:08 2016
+// Update Count     : 9
 //
 
@@ -22,5 +22,4 @@
 #include "LabelFixer.h"
 #include "MLEMutator.h"
-#include "CaseRangeMutator.h"
 #include "ForExprMutator.h"
 #include "LabelTypeChecker.h"
@@ -41,7 +40,4 @@
 		LabelFixer lfix;
 
-		// expand case ranges and turn fallthru into a null statement
-		CaseRangeMutator ranges;
-
 		//ExceptMutator exc;
 		// LabelTypeChecker lbl;
@@ -49,5 +45,4 @@
 		mutateAll( translationUnit, formut );
 		acceptAll( translationUnit, lfix );
-		mutateAll( translationUnit, ranges );
 		//mutateAll( translationUnit, exc );
 		//acceptAll( translationUnit, lbl );
Index: src/ControlStruct/module.mk
===================================================================
--- src/ControlStruct/module.mk	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/ControlStruct/module.mk	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -11,6 +11,6 @@
 ## Created On       : Mon Jun  1 17:49:17 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Tue Jul 12 17:40:31 2016
-## Update Count     : 2
+## Last Modified On : Thu Aug  4 11:38:06 2016
+## Update Count     : 3
 ###############################################################################
 
@@ -18,5 +18,4 @@
 	ControlStruct/LabelFixer.cc \
         ControlStruct/MLEMutator.cc \
-	ControlStruct/CaseRangeMutator.cc \
 	ControlStruct/Mutate.cc \
 	ControlStruct/ForExprMutator.cc \
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/GenPoly/Box.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -62,91 +62,4 @@
 
 		FunctionType *makeAdapterType( FunctionType *adaptee, const TyVarMap &tyVars );
-
-		/// Abstracts type equality for a list of parameter types
-		struct TypeList {
-			TypeList() : params() {}
-			TypeList( const std::list< Type* > &_params ) : params() { cloneAll(_params, params); }
-			TypeList( std::list< Type* > &&_params ) : params( _params ) {}
-
-			TypeList( const TypeList &that ) : params() { cloneAll(that.params, params); }
-			TypeList( TypeList &&that ) : params( std::move( that.params ) ) {}
-
-			/// Extracts types from a list of TypeExpr*
-			TypeList( const std::list< TypeExpr* >& _params ) : params() {
-				for ( std::list< TypeExpr* >::const_iterator param = _params.begin(); param != _params.end(); ++param ) {
-					params.push_back( (*param)->get_type()->clone() );
-				}
-			}
-
-			TypeList& operator= ( const TypeList &that ) {
-				deleteAll( params );
-
-				params.clear();
-				cloneAll( that.params, params );
-
-				return *this;
-			}
-
-			TypeList& operator= ( TypeList &&that ) {
-				deleteAll( params );
-
-				params = std::move( that.params );
-
-				return *this;
-			}
-
-			~TypeList() { deleteAll( params ); }
-
-			bool operator== ( const TypeList& that ) const {
-				if ( params.size() != that.params.size() ) return false;
-
-				SymTab::Indexer dummy;
-				for ( std::list< Type* >::const_iterator it = params.begin(), jt = that.params.begin(); it != params.end(); ++it, ++jt ) {
-					if ( ! ResolvExpr::typesCompatible( *it, *jt, dummy ) ) return false;
-				}
-				return true;
-			}
-
-			std::list< Type* > params;  ///< Instantiation parameters
-		};
-
-		/// Maps a key and a TypeList to the some value, accounting for scope
-		template< typename Key, typename Value >
-		class InstantiationMap {
-			/// Wraps value for a specific (Key, TypeList) combination
-			typedef std::pair< TypeList, Value* > Instantiation;
-			/// List of TypeLists paired with their appropriate values
-			typedef std::vector< Instantiation > ValueList;
-			/// Underlying map type; maps keys to a linear list of corresponding TypeLists and values
-			typedef ScopedMap< Key*, ValueList > InnerMap;
-
-			InnerMap instantiations;  ///< instantiations
-
-		public:
-			/// Starts a new scope
-			void beginScope() { instantiations.beginScope(); }
-
-			/// Ends a scope
-			void endScope() { instantiations.endScope(); }
-
-			/// Gets the value for the (key, typeList) pair, returns NULL on none such.
-			Value *lookup( Key *key, const std::list< TypeExpr* >& params ) const {
- 				TypeList typeList( params );
-
-				// scan scopes for matches to the key
-				for ( typename InnerMap::const_iterator insts = instantiations.find( key ); insts != instantiations.end(); insts = instantiations.findNext( insts, key ) ) {
-					for ( typename ValueList::const_reverse_iterator inst = insts->second.rbegin(); inst != insts->second.rend(); ++inst ) {
-						if ( inst->first == typeList ) return inst->second;
-					}
-				}
-				// no matching instantiations found
-				return 0;
-			}
-
-			/// Adds a value for a (key, typeList) pair to the current scope
-			void insert( Key *key, const std::list< TypeExpr* > &params, Value *value ) {
-				instantiations[ key ].push_back( Instantiation( TypeList( params ), value ) );
-			}
-		};
 
 		/// Adds layout-generation functions to polymorphic types
@@ -191,5 +104,5 @@
 			Type *replaceWithConcrete( ApplicationExpr *appExpr, Type *type, bool doClone = true );
 			/// wraps a function application returning a polymorphic type with a new temporary for the out-parameter return value
-			Expression *addPolyRetParam( ApplicationExpr *appExpr, FunctionType *function, ReferenceToType *polyType, std::list< Expression *>::iterator &arg );
+			Expression *addDynRetParam( ApplicationExpr *appExpr, FunctionType *function, ReferenceToType *polyType, std::list< Expression *>::iterator &arg );
 			Expression *applyAdapter( ApplicationExpr *appExpr, FunctionType *function, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars );
 			void boxParam( Type *formal, Expression *&arg, const TyVarMap &exprTyVars );
@@ -237,32 +150,4 @@
 
 			std::map< UniqueId, std::string > adapterName;
-		};
-
-		/// Mutator pass that replaces concrete instantiations of generic types with actual struct declarations, scoped appropriately
-		class GenericInstantiator : public DeclMutator {
-			/// Map of (generic type, parameter list) pairs to concrete type instantiations
-			InstantiationMap< AggregateDecl, AggregateDecl > instantiations;
-			/// Namer for concrete types
-			UniqueName typeNamer;
-
-		public:
-			GenericInstantiator() : DeclMutator(), instantiations(), typeNamer("_conc_") {}
-
-			virtual Type* mutate( StructInstType *inst );
-			virtual Type* mutate( UnionInstType *inst );
-
-	// 		virtual Expression* mutate( MemberExpr *memberExpr );
-
-			virtual void doBeginScope();
-			virtual void doEndScope();
-		private:
-			/// Wrap instantiation lookup for structs
-			StructDecl* lookup( StructInstType *inst, const std::list< TypeExpr* > &typeSubs ) { return (StructDecl*)instantiations.lookup( inst->get_baseStruct(), typeSubs ); }
-			/// Wrap instantiation lookup for unions
-			UnionDecl* lookup( UnionInstType *inst, const std::list< TypeExpr* > &typeSubs ) { return (UnionDecl*)instantiations.lookup( inst->get_baseUnion(), typeSubs ); }
-			/// Wrap instantiation insertion for structs
-			void insert( StructInstType *inst, const std::list< TypeExpr* > &typeSubs, StructDecl *decl ) { instantiations.insert( inst->get_baseStruct(), typeSubs, decl ); }
-			/// Wrap instantiation insertion for unions
-			void insert( UnionInstType *inst, const std::list< TypeExpr* > &typeSubs, UnionDecl *decl ) { instantiations.insert( inst->get_baseUnion(), typeSubs, decl ); }
 		};
 
@@ -354,5 +239,4 @@
 		Pass1 pass1;
 		Pass2 pass2;
-		GenericInstantiator instantiator;
 		PolyGenericCalculator polyCalculator;
 		Pass3 pass3;
@@ -361,5 +245,4 @@
 		mutateTranslationUnit/*All*/( translationUnit, pass1 );
 		mutateTranslationUnit/*All*/( translationUnit, pass2 );
-		instantiator.mutateDeclarationList( translationUnit );
 		mutateTranslationUnit/*All*/( translationUnit, polyCalculator );
 		mutateTranslationUnit/*All*/( translationUnit, pass3 );
@@ -619,5 +502,5 @@
 			return 0;
 		}
-		
+
 		/// Returns T if the given declaration is a function with parameters (T*, T) for some TypeInstType T, NULL otherwise
 		TypeInstType *isTypeInstPtrValFn( DeclarationWithType *decl ) {
@@ -637,5 +520,5 @@
 			return 0;
 		}
-		
+
 		/// Returns T if the given declaration is (*?=?)(T *, T) for some TypeInstType T (return not checked, but maybe should be), NULL otherwise
 		TypeInstType *isTypeInstAssignment( DeclarationWithType *decl ) {
@@ -677,5 +560,5 @@
 			return 0;
 		}
-		
+
 		/// Returns T if the given declaration is a function with parameters (T*, T) for some type T, where neither parameter is cv-qualified,
 		/// NULL otherwise
@@ -772,5 +655,5 @@
 				copyOps.beginScope();
 				dtorOps.beginScope();
-				
+
 				DeclarationWithType *oldRetval = retval;
 				bool oldUseRetval = useRetval;
@@ -778,5 +661,5 @@
 				// process polymorphic return value
 				retval = 0;
-				if ( isPolyRet( functionDecl->get_functionType() ) && functionDecl->get_linkage() == LinkageSpec::Cforall ) {
+				if ( isDynRet( functionDecl->get_functionType() ) && functionDecl->get_linkage() == LinkageSpec::Cforall ) {
 					retval = functionDecl->get_functionType()->get_returnVals().front();
 
@@ -889,5 +772,5 @@
 						arg++;
 					} else {
-						/// xxx - should this be an assertion?
+						// xxx - should this be an assertion?
 						throw SemanticError( "unbound type variable: " + tyParm->first + " in application ", appExpr );
 					} // if
@@ -902,5 +785,5 @@
 			std::list< DeclarationWithType* >::const_iterator fnParm = funcType->get_parameters().begin();
 			std::list< Expression* >::const_iterator fnArg = arg;
-			std::set< std::string > seenTypes; //< names for generic types we've seen
+			std::set< std::string > seenTypes; ///< names for generic types we've seen
 
 			// a polymorphic return type may need to be added to the argument list
@@ -985,7 +868,7 @@
 		}
 
-		Expression *Pass1::addPolyRetParam( ApplicationExpr *appExpr, FunctionType *function, ReferenceToType *polyType, std::list< Expression *>::iterator &arg ) {
+		Expression *Pass1::addDynRetParam( ApplicationExpr *appExpr, FunctionType *function, ReferenceToType *dynType, std::list< Expression *>::iterator &arg ) {
 			assert( env );
-			Type *concrete = replaceWithConcrete( appExpr, polyType );
+			Type *concrete = replaceWithConcrete( appExpr, dynType );
 			// add out-parameter for return value
 			return addRetParam( appExpr, function, concrete, arg );
@@ -994,5 +877,6 @@
 		Expression *Pass1::applyAdapter( ApplicationExpr *appExpr, FunctionType *function, std::list< Expression *>::iterator &arg, const TyVarMap &tyVars ) {
 			Expression *ret = appExpr;
-			if ( ! function->get_returnVals().empty() && isPolyType( function->get_returnVals().front()->get_type(), tyVars ) ) {
+//			if ( ! function->get_returnVals().empty() && isPolyType( function->get_returnVals().front()->get_type(), tyVars ) ) {
+			if ( isDynRet( function, tyVars ) ) {
 				ret = addRetParam( appExpr, function, function->get_returnVals().front()->get_type(), arg );
 			} // if
@@ -1042,6 +926,6 @@
 		/// this gets rid of warnings from gcc.
 		void addCast( Expression *&actual, Type *formal, const TyVarMap &tyVars ) {
-			Type * newType = formal->clone();
-			if ( getFunctionType( newType ) ) {
+			if ( getFunctionType( formal ) ) {
+				Type * newType = formal->clone();
 				newType = ScrubTyVars::scrub( newType, tyVars );
 				actual = new CastExpr( actual, newType );
@@ -1085,5 +969,6 @@
 			// actually make the adapter type
 			FunctionType *adapter = adaptee->clone();
-			if ( ! adapter->get_returnVals().empty() && isPolyType( adapter->get_returnVals().front()->get_type(), tyVars ) ) {
+//			if ( ! adapter->get_returnVals().empty() && isPolyType( adapter->get_returnVals().front()->get_type(), tyVars ) ) {
+			if ( isDynRet( adapter, tyVars ) ) {
 				makeRetParm( adapter );
 			} // if
@@ -1147,5 +1032,6 @@
 				addAdapterParams( adapteeApp, arg, param, adapterType->get_parameters().end(), realParam, tyVars );
 				bodyStmt = new ExprStmt( noLabels, adapteeApp );
-			} else if ( isPolyType( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {
+//			} else if ( isPolyType( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {
+			} else if ( isDynType( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {
 				// return type T
 				if ( (*param)->get_name() == "" ) {
@@ -1394,8 +1280,8 @@
 			TyVarMap exprTyVars( (TypeDecl::Kind)-1 );
 			makeTyVarMap( function, exprTyVars );
-			ReferenceToType *polyRetType = isPolyRet( function );
-
-			if ( polyRetType ) {
-				ret = addPolyRetParam( appExpr, function, polyRetType, arg );
+			ReferenceToType *dynRetType = isDynRet( function, exprTyVars );
+
+			if ( dynRetType ) {
+				ret = addDynRetParam( appExpr, function, dynRetType, arg );
 			} else if ( needsAdapter( function, scopeTyVars ) ) {
 				// std::cerr << "needs adapter: ";
@@ -1407,5 +1293,5 @@
 			arg = appExpr->get_args().begin();
 
-			passTypeVars( appExpr, polyRetType, arg, exprTyVars );
+			passTypeVars( appExpr, dynRetType, arg, exprTyVars );
 			addInferredParams( appExpr, function, arg, exprTyVars );
 
@@ -1471,7 +1357,9 @@
 		VariableExpr *wrapFunctionDecl( DeclarationWithType *functionDecl ) {
 			// line below cloned from FixFunction.cc
+			// xxx - functionObj is never added to a list of declarations...
 			ObjectDecl *functionObj = new ObjectDecl( functionDecl->get_name(), functionDecl->get_storageClass(), functionDecl->get_linkage(), 0,
 			                                          new PointerType( Type::Qualifiers(), functionDecl->get_type()->clone() ), 0 );
 			functionObj->set_mangleName( functionDecl->get_mangleName() );
+			functionObj->set_scopeLevel( functionDecl->get_scopeLevel() );
 			return new VariableExpr( functionObj );
 		}
@@ -1492,5 +1380,5 @@
 					= ParamEntry( assertOp->get_uniqueId(), assertOp->get_type()->clone(), actualDecl->get_type()->clone(), wrapFunctionDecl( assertOp ) );
 		}
-		
+
 		Statement * Pass1::mutate( ReturnStmt *returnStmt ) {
 			if ( retval && returnStmt->get_expr() ) {
@@ -1554,5 +1442,5 @@
 						DeclarationWithType *assertDtor = findOpForType( formalType, dtorOps, scopedDtorOps );
 						if ( ! assertDtor ) throw SemanticError( "No destructor found for ", formalType );
-						
+
 						// add inferred parameters for otype operators to assignment expression
 						// NOTE: Code here assumes that first four assertions are assign op, ctor, copy ctor, dtor, in that order
@@ -1568,8 +1456,5 @@
 						++actualIt;
 						addAssertionFor( assignExpr, *actualIt, assertDtor );
-						
-						//DeclarationWithType *actualDecl = asserts.front();
-						//assignExpr->get_inferParams()[ actualDecl->get_uniqueId() ]
-						//	= ParamEntry( assertAssign->get_uniqueId(), assertAssign->get_type()->clone(), actualDecl->get_type()->clone(), wrapFunctionDecl( assertAssign ) );
+
 					}
 				}
@@ -1695,5 +1580,5 @@
 
 			// move polymorphic return type to parameter list
-			if ( isPolyRet( funcType ) ) {
+			if ( isDynRet( funcType ) ) {
 				DeclarationWithType *ret = funcType->get_returnVals().front();
 				ret->set_type( new PointerType( Type::Qualifiers(), ret->get_type() ) );
@@ -1776,193 +1661,4 @@
 		}
 
-//////////////////////////////////////// GenericInstantiator //////////////////////////////////////////////////
-
-		/// Makes substitutions of params into baseParams; returns true if all parameters substituted for a concrete type
-		bool makeSubstitutions( const std::list< TypeDecl* >& baseParams, const std::list< Expression* >& params, std::list< TypeExpr* >& out ) {
-			bool allConcrete = true;  // will finish the substitution list even if they're not all concrete
-
-			// substitute concrete types for given parameters, and incomplete types for placeholders
-			std::list< TypeDecl* >::const_iterator baseParam = baseParams.begin();
-			std::list< Expression* >::const_iterator param = params.begin();
-			for ( ; baseParam != baseParams.end() && param != params.end(); ++baseParam, ++param ) {
-	// 			switch ( (*baseParam)->get_kind() ) {
-	// 			case TypeDecl::Any: {   // any type is a valid substitution here; complete types can be used to instantiate generics
-					TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
-					assert(paramType && "Aggregate parameters should be type expressions");
-					out.push_back( paramType->clone() );
-					// check that the substituted type isn't a type variable itself
-					if ( dynamic_cast< TypeInstType* >( paramType->get_type() ) ) {
-						allConcrete = false;
-					}
-	// 				break;
-	// 			}
-	// 			case TypeDecl::Dtype:  // dtype can be consistently replaced with void [only pointers, which become void*]
-	// 				out.push_back( new TypeExpr( new VoidType( Type::Qualifiers() ) ) );
-	// 				break;
-	// 			case TypeDecl::Ftype:  // pointer-to-ftype can be consistently replaced with void (*)(void) [similar to dtype]
-	// 				out.push_back( new TypeExpr( new FunctionType( Type::Qualifiers(), false ) ) );
-	// 				break;
-	// 			}
-			}
-
-			// if any parameters left over, not done
-			if ( baseParam != baseParams.end() ) return false;
-	// 		// if not enough parameters given, substitute remaining incomplete types for placeholders
-	// 		for ( ; baseParam != baseParams.end(); ++baseParam ) {
-	// 			switch ( (*baseParam)->get_kind() ) {
-	// 			case TypeDecl::Any:    // no more substitutions here, fail early
-	// 				return false;
-	// 			case TypeDecl::Dtype:  // dtype can be consistently replaced with void [only pointers, which become void*]
-	// 				out.push_back( new TypeExpr( new VoidType( Type::Qualifiers() ) ) );
-	// 				break;
-	// 			case TypeDecl::Ftype:  // pointer-to-ftype can be consistently replaced with void (*)(void) [similar to dtype]
-	// 				out.push_back( new TypeExpr( new FunctionType( Type::Qualifiers(), false ) ) );
-	// 				break;
-	// 			}
-	// 		}
-
-			return allConcrete;
-		}
-
-		/// Substitutes types of members of in according to baseParams => typeSubs, appending the result to out
-		void substituteMembers( const std::list< Declaration* >& in, const std::list< TypeDecl* >& baseParams, const std::list< TypeExpr* >& typeSubs,
-								std::list< Declaration* >& out ) {
-			// substitute types into new members
-			TypeSubstitution subs( baseParams.begin(), baseParams.end(), typeSubs.begin() );
-			for ( std::list< Declaration* >::const_iterator member = in.begin(); member != in.end(); ++member ) {
-				Declaration *newMember = (*member)->clone();
-				subs.apply(newMember);
-				out.push_back( newMember );
-			}
-		}
-
-		Type* GenericInstantiator::mutate( StructInstType *inst ) {
-			// mutate subtypes
-			Type *mutated = Mutator::mutate( inst );
-			inst = dynamic_cast< StructInstType* >( mutated );
-			if ( ! inst ) return mutated;
-
-			// exit early if no need for further mutation
-			if ( inst->get_parameters().empty() ) return inst;
-			assert( inst->get_baseParameters() && "Base struct has parameters" );
-
-			// check if type can be concretely instantiated; put substitutions into typeSubs
-			std::list< TypeExpr* > typeSubs;
-			if ( ! makeSubstitutions( *inst->get_baseParameters(), inst->get_parameters(), typeSubs ) ) {
-				deleteAll( typeSubs );
-				return inst;
-			}
-
-			// make concrete instantiation of generic type
-			StructDecl *concDecl = lookup( inst, typeSubs );
-			if ( ! concDecl ) {
-				// set concDecl to new type, insert type declaration into statements to add
-				concDecl = new StructDecl( typeNamer.newName( inst->get_name() ) );
-				substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, 	concDecl->get_members() );
-				DeclMutator::addDeclaration( concDecl );
-				insert( inst, typeSubs, concDecl );
-			}
-			StructInstType *newInst = new StructInstType( inst->get_qualifiers(), concDecl->get_name() );
-			newInst->set_baseStruct( concDecl );
-
-			deleteAll( typeSubs );
-			delete inst;
-			return newInst;
-		}
-
-		Type* GenericInstantiator::mutate( UnionInstType *inst ) {
-			// mutate subtypes
-			Type *mutated = Mutator::mutate( inst );
-			inst = dynamic_cast< UnionInstType* >( mutated );
-			if ( ! inst ) return mutated;
-
-			// exit early if no need for further mutation
-			if ( inst->get_parameters().empty() ) return inst;
-			assert( inst->get_baseParameters() && "Base union has parameters" );
-
-			// check if type can be concretely instantiated; put substitutions into typeSubs
-			std::list< TypeExpr* > typeSubs;
-			if ( ! makeSubstitutions( *inst->get_baseParameters(), inst->get_parameters(), typeSubs ) ) {
-				deleteAll( typeSubs );
-				return inst;
-			}
-
-			// make concrete instantiation of generic type
-			UnionDecl *concDecl = lookup( inst, typeSubs );
-			if ( ! concDecl ) {
-				// set concDecl to new type, insert type declaration into statements to add
-				concDecl = new UnionDecl( typeNamer.newName( inst->get_name() ) );
-				substituteMembers( inst->get_baseUnion()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
-				DeclMutator::addDeclaration( concDecl );
-				insert( inst, typeSubs, concDecl );
-			}
-			UnionInstType *newInst = new UnionInstType( inst->get_qualifiers(), concDecl->get_name() );
-			newInst->set_baseUnion( concDecl );
-
-			deleteAll( typeSubs );
-			delete inst;
-			return newInst;
-		}
-
-	// 	/// Gets the base struct or union declaration for a member expression; NULL if not applicable
-	// 	AggregateDecl* getMemberBaseDecl( MemberExpr *memberExpr ) {
-	// 		// get variable for member aggregate
-	// 		VariableExpr *varExpr = dynamic_cast< VariableExpr* >( memberExpr->get_aggregate() );
-	// 		if ( ! varExpr ) return NULL;
-	//
-	// 		// get object for variable
-	// 		ObjectDecl *objectDecl = dynamic_cast< ObjectDecl* >( varExpr->get_var() );
-	// 		if ( ! objectDecl ) return NULL;
-	//
-	// 		// get base declaration from object type
-	// 		Type *objectType = objectDecl->get_type();
-	// 		StructInstType *structType = dynamic_cast< StructInstType* >( objectType );
-	// 		if ( structType ) return structType->get_baseStruct();
-	// 		UnionInstType *unionType = dynamic_cast< UnionInstType* >( objectType );
-	// 		if ( unionType ) return unionType->get_baseUnion();
-	//
-	// 		return NULL;
-	// 	}
-	//
-	// 	/// Finds the declaration with the given name, returning decls.end() if none such
-	// 	std::list< Declaration* >::const_iterator findDeclNamed( const std::list< Declaration* > &decls, const std::string &name ) {
-	// 		for( std::list< Declaration* >::const_iterator decl = decls.begin(); decl != decls.end(); ++decl ) {
-	// 			if ( (*decl)->get_name() == name ) return decl;
-	// 		}
-	// 		return decls.end();
-	// 	}
-	//
-	// 	Expression* Instantiate::mutate( MemberExpr *memberExpr ) {
-	// 		// mutate, exiting early if no longer MemberExpr
-	// 		Expression *expr = Mutator::mutate( memberExpr );
-	// 		memberExpr = dynamic_cast< MemberExpr* >( expr );
-	// 		if ( ! memberExpr ) return expr;
-	//
-	// 		// get declaration of member and base declaration of member, exiting early if not found
-	// 		AggregateDecl *memberBase = getMemberBaseDecl( memberExpr );
-	// 		if ( ! memberBase ) return memberExpr;
-	// 		DeclarationWithType *memberDecl = memberExpr->get_member();
-	// 		std::list< Declaration* >::const_iterator baseIt = findDeclNamed( memberBase->get_members(), memberDecl->get_name() );
-	// 		if ( baseIt == memberBase->get_members().end() ) return memberExpr;
-	// 		DeclarationWithType *baseDecl = dynamic_cast< DeclarationWithType* >( *baseIt );
-	// 		if ( ! baseDecl ) return memberExpr;
-	//
-	// 		// check if stated type of the member is not the type of the member's declaration; if so, need a cast
-	// 		// this *SHOULD* be safe, I don't think anything but the void-replacements I put in for dtypes would make it past the typechecker
-	// 		SymTab::Indexer dummy;
-	// 		if ( ResolvExpr::typesCompatible( memberDecl->get_type(), baseDecl->get_type(), dummy ) ) return memberExpr;
-	// 		else return new CastExpr( memberExpr, memberDecl->get_type() );
-	// 	}
-
-		void GenericInstantiator::doBeginScope() {
-			DeclMutator::doBeginScope();
-			instantiations.beginScope();
-		}
-
-		void GenericInstantiator::doEndScope() {
-			DeclMutator::doEndScope();
-			instantiations.endScope();
-		}
-
 ////////////////////////////////////////// PolyGenericCalculator ////////////////////////////////////////////////////
 
@@ -2108,4 +1804,5 @@
 			findGeneric( objectType ); // ensure layout for this type is available
 
+			// replace member expression with dynamically-computed layout expression
 			Expression *newMemberExpr = 0;
 			if ( StructInstType *structType = dynamic_cast< StructInstType* >( objectType ) ) {
@@ -2181,5 +1878,5 @@
 		bool PolyGenericCalculator::findGeneric( Type *ty ) {
 			ty = replaceTypeInst( ty, env );
-			
+
 			if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( ty ) ) {
 				if ( scopeTyVars.find( typeInst->get_name() ) != scopeTyVars.end() ) {
Index: src/GenPoly/DeclMutator.cc
===================================================================
--- src/GenPoly/DeclMutator.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/GenPoly/DeclMutator.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Fri Nov 27 14:44:00 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:38:46 2016
-// Update Count     : 2
+// Last Modified On : Thu Aug  4 11:16:43 2016
+// Update Count     : 3
 //
 
@@ -163,5 +163,5 @@
 	Statement* DeclMutator::mutate(SwitchStmt *switchStmt) {
 		switchStmt->set_condition( maybeMutate( switchStmt->get_condition(), *this ) );
-		mutateAll( switchStmt->get_branches(), *this );
+		mutateAll( switchStmt->get_statements(), *this );
 		return switchStmt;
 	}
Index: src/GenPoly/DeclMutator.h
===================================================================
--- src/GenPoly/DeclMutator.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/GenPoly/DeclMutator.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -28,7 +28,10 @@
 	class DeclMutator : public Mutator {
 	public:
+		typedef Mutator Parent;
+
 		DeclMutator();
 		virtual ~DeclMutator();
-		
+
+		using Parent::mutate;
 		virtual CompoundStmt* mutate(CompoundStmt *compoundStmt);
 		virtual Statement* mutate(IfStmt *ifStmt);
@@ -42,5 +45,5 @@
 		/// Mutates a list of declarations with this visitor
 		void mutateDeclarationList(std::list< Declaration* >& decls);
-		
+
 		/// Called on entry to a new scope; overriders should call this as a super-class call
 		virtual void doBeginScope();
Index: src/GenPoly/GenPoly.cc
===================================================================
--- src/GenPoly/GenPoly.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/GenPoly/GenPoly.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -23,25 +23,4 @@
 
 namespace GenPoly {
-	bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) {
-		if ( ! adaptee->get_returnVals().empty() && isPolyType( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {
-			return true;
-		} // if
-		for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); innerArg != adaptee->get_parameters().end(); ++innerArg ) {
-			if ( isPolyType( (*innerArg)->get_type(), tyVars ) ) {
-				return true;
-			} // if
-		} // for
-		return false;
-	}
-
-	ReferenceToType *isPolyRet( FunctionType *function ) {
-		if ( ! function->get_returnVals().empty() ) {
-			TyVarMap forallTypes( (TypeDecl::Kind)-1 );
-			makeTyVarMap( function, forallTypes );
-			return (ReferenceToType*)isPolyType( function->get_returnVals().front()->get_type(), forallTypes );
-		} // if
-		return 0;
-	}
-
 	namespace {
 		/// Checks a parameter list for polymorphic parameters; will substitute according to env if present
@@ -64,4 +43,14 @@
 			return false;
 		}
+
+		/// Checks a parameter list for dynamic-layout parameters from tyVars; will substitute according to env if present
+		bool hasDynParams( std::list< Expression* >& params, const TyVarMap &tyVars, const TypeSubstitution *env ) {
+			for ( std::list< Expression* >::iterator param = params.begin(); param != params.end(); ++param ) {
+				TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
+				assert(paramType && "Aggregate parameters should be type expressions");
+				if ( isDynType( paramType->get_type(), tyVars, env ) ) return true;
+			}
+			return false;
+		}
 	}
 
@@ -101,4 +90,49 @@
 		}
 		return 0;
+	}
+
+	Type *isDynType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) {
+		type = replaceTypeInst( type, env );
+
+		if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( type ) ) {
+			auto var = tyVars.find( typeInst->get_name() );
+			if ( var != tyVars.end() && var->second == TypeDecl::Any ) {
+				return type;
+			}
+		} else if ( StructInstType *structType = dynamic_cast< StructInstType* >( type ) ) {
+			if ( hasDynParams( structType->get_parameters(), tyVars, env ) ) return type;
+		} else if ( UnionInstType *unionType = dynamic_cast< UnionInstType* >( type ) ) {
+			if ( hasDynParams( unionType->get_parameters(), tyVars, env ) ) return type;
+		}
+		return 0;
+	}
+
+	ReferenceToType *isDynRet( FunctionType *function, const TyVarMap &forallTypes ) {
+		if ( function->get_returnVals().empty() ) return 0;
+		
+		return (ReferenceToType*)isDynType( function->get_returnVals().front()->get_type(), forallTypes );
+	}
+
+	ReferenceToType *isDynRet( FunctionType *function ) {
+		if ( function->get_returnVals().empty() ) return 0;
+
+		TyVarMap forallTypes( (TypeDecl::Kind)-1 );
+		makeTyVarMap( function, forallTypes );
+		return (ReferenceToType*)isDynType( function->get_returnVals().front()->get_type(), forallTypes );
+	}
+
+	bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) {
+// 		if ( ! adaptee->get_returnVals().empty() && isPolyType( adaptee->get_returnVals().front()->get_type(), tyVars ) ) {
+// 			return true;
+// 		} // if
+		if ( isDynRet( adaptee, tyVars ) ) return true;
+		
+		for ( std::list< DeclarationWithType* >::const_iterator innerArg = adaptee->get_parameters().begin(); innerArg != adaptee->get_parameters().end(); ++innerArg ) {
+// 			if ( isPolyType( (*innerArg)->get_type(), tyVars ) ) {
+			if ( isDynType( (*innerArg)->get_type(), tyVars ) ) {
+				return true;
+			} // if
+		} // for
+		return false;
 	}
 
Index: src/GenPoly/GenPoly.h
===================================================================
--- src/GenPoly/GenPoly.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/GenPoly/GenPoly.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -31,11 +31,4 @@
 namespace GenPoly {
 	typedef ErasableScopedMap< std::string, TypeDecl::Kind > TyVarMap;
-	
-	/// A function needs an adapter if it returns a polymorphic value or if any of its
-	/// parameters have polymorphic type
-	bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVarr );
-
-	/// true iff function has polymorphic return type
-	ReferenceToType *isPolyRet( FunctionType *function );
 
 	/// Replaces a TypeInstType by its referrent in the environment, if applicable
@@ -47,4 +40,16 @@
 	/// returns polymorphic type if is polymorphic type in tyVars, NULL otherwise; will look up substitution in env if provided
 	Type *isPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
+
+	/// returns dynamic-layout type if is dynamic-layout type in tyVars, NULL otherwise; will look up substitution in env if provided
+	Type *isDynType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env = 0 );
+
+	/// true iff function has dynamic-layout return type under the given type variable map
+	ReferenceToType *isDynRet( FunctionType *function, const TyVarMap &tyVars );
+
+	/// true iff function has dynamic-layout return type under the type variable map generated from its forall-parameters
+	ReferenceToType *isDynRet( FunctionType *function );
+
+	/// A function needs an adapter if it returns a dynamic-layout value or if any of its parameters have dynamic-layout type
+	bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVarr );
 
 	/// returns polymorphic type if is pointer to polymorphic type, NULL otherwise; will look up substitution in env if provided
Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
+++ src/GenPoly/InstantiateGeneric.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -0,0 +1,376 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// InstantiateGeneric.cc --
+//
+// Author           : Aaron B. Moss
+// Created On       : Thu Aug 04 18:33:00 2016
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Thu Aug 04 18:33:00 2016
+// Update Count     : 1
+//
+
+#include <cassert>
+#include <list>
+#include <utility>
+#include <vector>
+
+#include "InstantiateGeneric.h"
+
+#include "DeclMutator.h"
+#include "GenPoly.h"
+#include "ScopedMap.h"
+#include "ScopedSet.h"
+
+#include "ResolvExpr/typeops.h"
+
+#include "SynTree/Declaration.h"
+#include "SynTree/Expression.h"
+#include "SynTree/Type.h"
+
+#include "Common/UniqueName.h"
+#include "Common/utility.h"
+
+namespace GenPoly {
+
+	/// Abstracts type equality for a list of parameter types
+	struct TypeList {
+		TypeList() : params() {}
+		TypeList( const std::list< Type* > &_params ) : params() { cloneAll(_params, params); }
+		TypeList( std::list< Type* > &&_params ) : params( _params ) {}
+
+		TypeList( const TypeList &that ) : params() { cloneAll(that.params, params); }
+		TypeList( TypeList &&that ) : params( std::move( that.params ) ) {}
+
+		/// Extracts types from a list of TypeExpr*
+		TypeList( const std::list< TypeExpr* >& _params ) : params() {
+			for ( std::list< TypeExpr* >::const_iterator param = _params.begin(); param != _params.end(); ++param ) {
+				params.push_back( (*param)->get_type()->clone() );
+			}
+		}
+
+		TypeList& operator= ( const TypeList &that ) {
+			deleteAll( params );
+
+			params.clear();
+			cloneAll( that.params, params );
+
+			return *this;
+		}
+
+		TypeList& operator= ( TypeList &&that ) {
+			deleteAll( params );
+
+			params = std::move( that.params );
+
+			return *this;
+		}
+
+		~TypeList() { deleteAll( params ); }
+
+		bool operator== ( const TypeList& that ) const {
+			if ( params.size() != that.params.size() ) return false;
+
+			SymTab::Indexer dummy;
+			for ( std::list< Type* >::const_iterator it = params.begin(), jt = that.params.begin(); it != params.end(); ++it, ++jt ) {
+				if ( ! ResolvExpr::typesCompatible( *it, *jt, dummy ) ) return false;
+			}
+			return true;
+		}
+
+		std::list< Type* > params;  ///< Instantiation parameters
+	};
+	
+	/// Maps a key and a TypeList to the some value, accounting for scope
+	template< typename Key, typename Value >
+	class InstantiationMap {
+		/// Wraps value for a specific (Key, TypeList) combination
+		typedef std::pair< TypeList, Value* > Instantiation;
+		/// List of TypeLists paired with their appropriate values
+		typedef std::vector< Instantiation > ValueList;
+		/// Underlying map type; maps keys to a linear list of corresponding TypeLists and values
+		typedef ScopedMap< Key*, ValueList > InnerMap;
+
+		InnerMap instantiations;  ///< instantiations
+
+	public:
+		/// Starts a new scope
+		void beginScope() { instantiations.beginScope(); }
+
+		/// Ends a scope
+		void endScope() { instantiations.endScope(); }
+
+		/// Gets the value for the (key, typeList) pair, returns NULL on none such.
+		Value *lookup( Key *key, const std::list< TypeExpr* >& params ) const {
+			TypeList typeList( params );
+
+			// scan scopes for matches to the key
+			for ( typename InnerMap::const_iterator insts = instantiations.find( key ); insts != instantiations.end(); insts = instantiations.findNext( insts, key ) ) {
+				for ( typename ValueList::const_reverse_iterator inst = insts->second.rbegin(); inst != insts->second.rend(); ++inst ) {
+					if ( inst->first == typeList ) return inst->second;
+				}
+			}
+			// no matching instantiations found
+			return 0;
+		}
+
+		/// Adds a value for a (key, typeList) pair to the current scope
+		void insert( Key *key, const std::list< TypeExpr* > &params, Value *value ) {
+			instantiations[ key ].push_back( Instantiation( TypeList( params ), value ) );
+		}
+	};
+
+	/// Possible options for a given specialization of a generic type
+	enum class genericType {
+		dtypeStatic,  ///< Concrete instantiation based solely on {d,f}type-to-void conversions
+		concrete,     ///< Concrete instantiation requiring at least one parameter type
+		dynamic       ///< No concrete instantiation
+	};
+
+	genericType& operator |= ( genericType& gt, const genericType& ht ) {
+		switch ( gt ) {
+		case genericType::dtypeStatic:
+			gt = ht;
+			break;
+		case genericType::concrete:
+			if ( ht == genericType::dynamic ) { gt = genericType::dynamic; }
+			break;
+		case genericType::dynamic:
+			// nothing possible
+			break;
+		}
+		return gt;
+	}
+	
+	/// Mutator pass that replaces concrete instantiations of generic types with actual struct declarations, scoped appropriately
+	class GenericInstantiator : public DeclMutator {
+		/// Map of (generic type, parameter list) pairs to concrete type instantiations
+		InstantiationMap< AggregateDecl, AggregateDecl > instantiations;
+		/// Set of types which are dtype-only generic (and therefore have static layout)
+		ScopedSet< AggregateDecl* > dtypeStatics;
+		/// Namer for concrete types
+		UniqueName typeNamer;
+
+	public:
+		GenericInstantiator() : DeclMutator(), instantiations(), dtypeStatics(), typeNamer("_conc_") {}
+
+		virtual Type* mutate( StructInstType *inst );
+		virtual Type* mutate( UnionInstType *inst );
+
+		virtual void doBeginScope();
+		virtual void doEndScope();
+	private:
+		/// Wrap instantiation lookup for structs
+		StructDecl* lookup( StructInstType *inst, const std::list< TypeExpr* > &typeSubs ) { return (StructDecl*)instantiations.lookup( inst->get_baseStruct(), typeSubs ); }
+		/// Wrap instantiation lookup for unions
+		UnionDecl* lookup( UnionInstType *inst, const std::list< TypeExpr* > &typeSubs ) { return (UnionDecl*)instantiations.lookup( inst->get_baseUnion(), typeSubs ); }
+		/// Wrap instantiation insertion for structs
+		void insert( StructInstType *inst, const std::list< TypeExpr* > &typeSubs, StructDecl *decl ) { instantiations.insert( inst->get_baseStruct(), typeSubs, decl ); }
+		/// Wrap instantiation insertion for unions
+		void insert( UnionInstType *inst, const std::list< TypeExpr* > &typeSubs, UnionDecl *decl ) { instantiations.insert( inst->get_baseUnion(), typeSubs, decl ); }
+
+		/// Strips a dtype-static aggregate decl of its type parameters, marks it as stripped
+		void stripDtypeParams( AggregateDecl *base, std::list< TypeDecl* >& baseParams, const std::list< TypeExpr* >& typeSubs );
+	};
+
+	void instantiateGeneric( std::list< Declaration* > &translationUnit ) {
+		GenericInstantiator instantiator;
+		instantiator.mutateDeclarationList( translationUnit );
+	}
+
+	/// Makes substitutions of params into baseParams; returns dtypeStatic if there is a concrete instantiation based only on {d,f}type-to-void conversions,
+	/// concrete if there is a concrete instantiation requiring at least one parameter type, and dynamic if there is no concrete instantiation
+	genericType makeSubstitutions( const std::list< TypeDecl* >& baseParams, const std::list< Expression* >& params, std::list< TypeExpr* >& out ) {
+		genericType gt = genericType::dtypeStatic;
+
+		// substitute concrete types for given parameters, and incomplete types for placeholders
+		std::list< TypeDecl* >::const_iterator baseParam = baseParams.begin();
+		std::list< Expression* >::const_iterator param = params.begin();
+		for ( ; baseParam != baseParams.end() && param != params.end(); ++baseParam, ++param ) {
+			TypeExpr *paramType = dynamic_cast< TypeExpr* >( *param );
+			assert(paramType && "Aggregate parameters should be type expressions");
+			
+			switch ( (*baseParam)->get_kind() ) {
+			case TypeDecl::Any: {
+				// substitute parameter for otype; makes the type concrete or dynamic depending on the parameter
+				out.push_back( paramType->clone() );
+				gt |= isPolyType( paramType->get_type() ) ? genericType::dynamic : genericType::concrete;
+				break;
+			}
+			case TypeDecl::Dtype:
+				// can pretend that any dtype is `void`
+				out.push_back( new TypeExpr( new VoidType( Type::Qualifiers() ) ) );
+				break;
+			case TypeDecl::Ftype:
+				// can pretend that any ftype is `void (*)(void)`
+				out.push_back( new TypeExpr( new FunctionType( Type::Qualifiers(), false ) ) );
+				break;
+			}
+		}
+
+		assert( baseParam == baseParams.end() && param == params.end() && "Type parameters should match type variables" );
+		return gt;
+	}
+
+	/// Substitutes types of members of in according to baseParams => typeSubs, appending the result to out
+	void substituteMembers( const std::list< Declaration* >& in, const std::list< TypeDecl* >& baseParams, const std::list< TypeExpr* >& typeSubs,
+							std::list< Declaration* >& out ) {
+		// substitute types into new members
+		TypeSubstitution subs( baseParams.begin(), baseParams.end(), typeSubs.begin() );
+		for ( std::list< Declaration* >::const_iterator member = in.begin(); member != in.end(); ++member ) {
+			Declaration *newMember = (*member)->clone();
+			subs.apply(newMember);
+			out.push_back( newMember );
+		}
+	}
+
+	/// Substitutes types of members according to baseParams => typeSubs, working in-place
+	void substituteMembers( std::list< Declaration* >& members, const std::list< TypeDecl* >& baseParams, const std::list< TypeExpr* >& typeSubs ) {
+		// substitute types into new members
+		TypeSubstitution subs( baseParams.begin(), baseParams.end(), typeSubs.begin() );
+		for ( std::list< Declaration* >::iterator member = members.begin(); member != members.end(); ++member ) {
+			subs.apply(*member);
+		}
+	}
+
+	/// Strips the instances's type parameters
+	void stripInstParams( ReferenceToType *inst ) {
+		deleteAll( inst->get_parameters() );
+		inst->get_parameters().clear();
+	}
+	
+	void GenericInstantiator::stripDtypeParams( AggregateDecl *base, std::list< TypeDecl* >& baseParams, const std::list< TypeExpr* >& typeSubs ) {
+		substituteMembers( base->get_members(), baseParams, typeSubs );
+
+		deleteAll( baseParams );
+		baseParams.clear();
+		
+		dtypeStatics.insert( base );
+	}
+
+	Type* GenericInstantiator::mutate( StructInstType *inst ) {
+		// mutate subtypes
+		Type *mutated = Mutator::mutate( inst );
+		inst = dynamic_cast< StructInstType* >( mutated );
+		if ( ! inst ) return mutated;
+
+		// exit early if no need for further mutation
+		if ( inst->get_parameters().empty() ) return inst;
+
+		// check for an already-instantiatiated dtype-static type
+		if ( dtypeStatics.find( inst->get_baseStruct() ) != dtypeStatics.end() ) {
+			stripInstParams( inst );
+			return inst;
+		}
+		
+		// check if type can be concretely instantiated; put substitutions into typeSubs
+		assert( inst->get_baseParameters() && "Base struct has parameters" );
+		std::list< TypeExpr* > typeSubs;
+		genericType gt = makeSubstitutions( *inst->get_baseParameters(), inst->get_parameters(), typeSubs );
+		switch ( gt ) {
+		case genericType::dtypeStatic:
+			stripDtypeParams( inst->get_baseStruct(), *inst->get_baseParameters(), typeSubs );
+			stripInstParams( inst );
+			break;
+		
+		case genericType::concrete: {
+			// make concrete instantiation of generic type
+			StructDecl *concDecl = lookup( inst, typeSubs );
+			if ( ! concDecl ) {
+				// set concDecl to new type, insert type declaration into statements to add
+				concDecl = new StructDecl( typeNamer.newName( inst->get_name() ) );
+				substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, 	concDecl->get_members() );
+				DeclMutator::addDeclaration( concDecl );
+				insert( inst, typeSubs, concDecl );
+			}
+			StructInstType *newInst = new StructInstType( inst->get_qualifiers(), concDecl->get_name() );
+			newInst->set_baseStruct( concDecl );
+
+			delete inst;
+			inst = newInst;
+			break;
+		}
+
+		case genericType::dynamic:
+			// do nothing
+			break;
+		}
+
+		deleteAll( typeSubs );
+		return inst;
+	}
+
+	Type* GenericInstantiator::mutate( UnionInstType *inst ) {
+		// mutate subtypes
+		Type *mutated = Mutator::mutate( inst );
+		inst = dynamic_cast< UnionInstType* >( mutated );
+		if ( ! inst ) return mutated;
+
+		// exit early if no need for further mutation
+		if ( inst->get_parameters().empty() ) return inst;
+
+		// check for an already-instantiatiated dtype-static type
+		if ( dtypeStatics.find( inst->get_baseUnion() ) != dtypeStatics.end() ) {
+			stripInstParams( inst );
+			return inst;
+		}
+
+		// check if type can be concretely instantiated; put substitutions into typeSubs
+		assert( inst->get_baseParameters() && "Base union has parameters" );
+		std::list< TypeExpr* > typeSubs;
+		genericType gt = makeSubstitutions( *inst->get_baseParameters(), inst->get_parameters(), typeSubs );
+		switch ( gt ) {
+		case genericType::dtypeStatic:
+			stripDtypeParams( inst->get_baseUnion(), *inst->get_baseParameters(), typeSubs );
+			stripInstParams( inst );
+			break;
+			
+		case genericType::concrete:
+		{
+			// make concrete instantiation of generic type
+			UnionDecl *concDecl = lookup( inst, typeSubs );
+			if ( ! concDecl ) {
+				// set concDecl to new type, insert type declaration into statements to add
+				concDecl = new UnionDecl( typeNamer.newName( inst->get_name() ) );
+				substituteMembers( inst->get_baseUnion()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
+				DeclMutator::addDeclaration( concDecl );
+				insert( inst, typeSubs, concDecl );
+			}
+			UnionInstType *newInst = new UnionInstType( inst->get_qualifiers(), concDecl->get_name() );
+			newInst->set_baseUnion( concDecl );
+
+			delete inst;
+			inst = newInst;
+			break;
+		}
+		case genericType::dynamic:
+			// do nothing
+			break;
+		}
+
+		deleteAll( typeSubs );
+		return inst;
+	}
+
+	void GenericInstantiator::doBeginScope() {
+		DeclMutator::doBeginScope();
+		instantiations.beginScope();
+		dtypeStatics.beginScope();
+	}
+
+	void GenericInstantiator::doEndScope() {
+		DeclMutator::doEndScope();
+		instantiations.endScope();
+		dtypeStatics.endScope();
+	}
+
+} // namespace GenPoly
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/GenPoly/InstantiateGeneric.h
===================================================================
--- src/GenPoly/InstantiateGeneric.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
+++ src/GenPoly/InstantiateGeneric.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -0,0 +1,34 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// InstantiateGeneric.h --
+//
+// Author           : Aaron B. Moss
+// Created On       : Thu Aug 04 18:33:00 2016
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Thu Aug 04 18:33:00 2016
+// Update Count     : 1
+//
+
+#ifndef _INSTANTIATEGENERIC_H
+#define _INSTANTIATEGENERIC_H
+
+#include "SynTree/SynTree.h"
+
+namespace GenPoly {
+	/// Replaces all generic types that have static layout with concrete instantiations.
+	/// Types with concrete values for otype parameters will be template-expanded, while
+	/// dtype and ftype parameters will be replaced by the appropriate void type.
+	void instantiateGeneric( std::list< Declaration* > &translationUnit );
+} // namespace GenPoly
+
+#endif // _INSTANTIATEGENERIC_H
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/GenPoly/PolyMutator.cc
===================================================================
--- src/GenPoly/PolyMutator.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/GenPoly/PolyMutator.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:39:32 2016
-// Update Count     : 12
+// Last Modified On : Thu Aug  4 11:26:22 2016
+// Update Count     : 16
 //
 
@@ -99,5 +99,5 @@
 
 	Statement * PolyMutator::mutate(SwitchStmt *switchStmt) {
-		mutateStatementList( switchStmt->get_branches() );
+		mutateStatementList( switchStmt->get_statements() );
 		switchStmt->set_condition( mutateExpression( switchStmt->get_condition() ) );
 		return switchStmt;
Index: src/GenPoly/ScrubTyVars.cc
===================================================================
--- src/GenPoly/ScrubTyVars.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/GenPoly/ScrubTyVars.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -45,5 +45,5 @@
 
 	Type * ScrubTyVars::mutateAggregateType( Type *ty ) {
-		if ( isPolyType( ty, tyVars ) ) {
+		if ( shouldScrub( ty ) ) {
 			PointerType *ret = new PointerType( Type::Qualifiers(), new VoidType( ty->get_qualifiers() ) );
 			delete ty;
@@ -63,6 +63,6 @@
 	Expression * ScrubTyVars::mutate( SizeofExpr *szeof ) {
 		// sizeof( T ) => _sizeof_T parameter, which is the size of T
-		if ( Type *polyType = isPolyType( szeof->get_type() ) ) {
-			Expression *expr = new NameExpr( sizeofName( mangleType( polyType ) ) );
+		if ( Type *dynType = shouldScrub( szeof->get_type() ) ) {
+			Expression *expr = new NameExpr( sizeofName( mangleType( dynType ) ) );
 			return expr;
 		} else {
@@ -73,6 +73,6 @@
 	Expression * ScrubTyVars::mutate( AlignofExpr *algnof ) {
 		// alignof( T ) => _alignof_T parameter, which is the alignment of T
-		if ( Type *polyType = isPolyType( algnof->get_type() ) ) {
-			Expression *expr = new NameExpr( alignofName( mangleType( polyType ) ) );
+		if ( Type *dynType = shouldScrub( algnof->get_type() ) ) {
+			Expression *expr = new NameExpr( alignofName( mangleType( dynType ) ) );
 			return expr;
 		} else {
@@ -82,6 +82,19 @@
 
 	Type * ScrubTyVars::mutate( PointerType *pointer ) {
-		if ( Type *polyType = isPolyType( pointer->get_base(), tyVars ) ) {
-			Type *ret = polyType->acceptMutator( *this );
+//		// special case of shouldScrub that takes all TypeInstType pointer bases, even if they're not dynamic
+// 		Type *base = pointer->get_base();
+// 		Type *dynType = 0;
+// 		if ( dynamicOnly ) {
+// 			if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( base ) ) {
+// 				if ( tyVars.find( typeInst->get_name() ) != tyVars.end() ) { dynType = typeInst; }
+// 			} else {
+// 				dynType = isDynType( base, tyVars );
+// 			}
+// 		} else {
+// 			dynType = isPolyType( base, tyVars );
+// 		}
+// 		if ( dynType ) {
+		if ( Type *dynType = shouldScrub( pointer->get_base() ) ) {
+			Type *ret = dynType->acceptMutator( *this );
 			ret->get_qualifiers() += pointer->get_qualifiers();
 			pointer->set_base( 0 );
Index: src/GenPoly/ScrubTyVars.h
===================================================================
--- src/GenPoly/ScrubTyVars.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/GenPoly/ScrubTyVars.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -27,5 +27,5 @@
 	class ScrubTyVars : public Mutator {
 	  public:
-		ScrubTyVars( const TyVarMap &tyVars ): tyVars( tyVars ) {}
+		ScrubTyVars( const TyVarMap &tyVars, bool dynamicOnly = false ): tyVars( tyVars ), dynamicOnly( dynamicOnly ) {}
 
 		/// For all polymorphic types with type variables in `tyVars`, replaces generic types, dtypes, and ftypes with the appropriate void type,
@@ -33,4 +33,9 @@
 		template< typename SynTreeClass >
 		static SynTreeClass *scrub( SynTreeClass *target, const TyVarMap &tyVars );
+
+		/// For all dynamic-layout types with type variables in `tyVars`, replaces generic types, dtypes, and ftypes with the appropriate void type,
+		/// and sizeof/alignof expressions with the proper variable
+		template< typename SynTreeClass >
+		static SynTreeClass *scrubDynamic( SynTreeClass *target, const TyVarMap &tyVars );
 
 		virtual Type* mutate( TypeInstType *typeInst );
@@ -42,14 +47,32 @@
 
 	  private:
+		/// Returns the type if it should be scrubbed, NULL otherwise.
+		Type* shouldScrub( Type *ty ) {
+			return dynamicOnly ? isDynType( ty, tyVars ) : isPolyType( ty, tyVars );
+// 			if ( ! dynamicOnly ) return isPolyType( ty, tyVars );
+// 
+// 			if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( ty ) ) {
+// 				return tyVars.find( typeInst->get_name() ) != tyVars.end() ? ty : 0;
+// 			}
+// 
+// 			return isDynType( ty, tyVars );
+		}
+		
 		/// Mutates (possibly generic) aggregate types appropriately
 		Type* mutateAggregateType( Type *ty );
 		
-		const TyVarMap &tyVars;
+		const TyVarMap &tyVars;  ///< Type variables to scrub
+		bool dynamicOnly;        ///< only scrub the types with dynamic layout? [false]
 	};
 
-	/* static class method */
 	template< typename SynTreeClass >
 	SynTreeClass * ScrubTyVars::scrub( SynTreeClass *target, const TyVarMap &tyVars ) {
 		ScrubTyVars scrubber( tyVars );
+		return static_cast< SynTreeClass * >( target->acceptMutator( scrubber ) );
+	}
+
+	template< typename SynTreeClass >
+	SynTreeClass * ScrubTyVars::scrubDynamic( SynTreeClass *target, const TyVarMap &tyVars ) {
+		ScrubTyVars scrubber( tyVars, true );
 		return static_cast< SynTreeClass * >( target->acceptMutator( scrubber ) );
 	}
Index: src/GenPoly/Specialize.cc
===================================================================
--- src/GenPoly/Specialize.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/GenPoly/Specialize.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -31,4 +31,5 @@
 #include "Common/UniqueName.h"
 #include "Common/utility.h"
+#include "InitTweak/InitTweak.h"
 
 namespace GenPoly {
@@ -184,10 +185,13 @@
 		mutateAll( appExpr->get_args(), *this );
 
-		// create thunks for the inferred parameters
-		for ( InferredParams::iterator inferParam = appExpr->get_inferParams().begin(); inferParam != appExpr->get_inferParams().end(); ++inferParam ) {
-			inferParam->second.expr = doSpecialization( inferParam->second.formalType, inferParam->second.expr, &appExpr->get_inferParams() );
-		}
-
-		handleExplicitParams( appExpr );
+		if ( ! InitTweak::isIntrinsicCallExpr( appExpr ) ) {
+			// create thunks for the inferred parameters
+			// don't need to do this for intrinsic calls, because they aren't actually passed
+			for ( InferredParams::iterator inferParam = appExpr->get_inferParams().begin(); inferParam != appExpr->get_inferParams().end(); ++inferParam ) {
+				inferParam->second.expr = doSpecialization( inferParam->second.formalType, inferParam->second.expr, &appExpr->get_inferParams() );
+			}
+
+			handleExplicitParams( appExpr );
+		}
 
 		return appExpr;
Index: src/GenPoly/module.mk
===================================================================
--- src/GenPoly/module.mk	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/GenPoly/module.mk	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -23,3 +23,4 @@
        GenPoly/CopyParams.cc \
        GenPoly/FindFunction.cc \
-       GenPoly/DeclMutator.cc
+       GenPoly/DeclMutator.cc \
+       GenPoly/InstantiateGeneric.cc
Index: src/InitTweak/FixGlobalInit.cc
===================================================================
--- src/InitTweak/FixGlobalInit.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/InitTweak/FixGlobalInit.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -46,47 +46,4 @@
 		FunctionDecl * destroyFunction;
 	};
-
-	class ConstExprChecker : public Visitor {
-	public:
-		ConstExprChecker() : isConstExpr( true ) {}
-
-		virtual void visit( ApplicationExpr *applicationExpr ) { isConstExpr = false; }
-		virtual void visit( UntypedExpr *untypedExpr ) { isConstExpr = false; }
-		virtual void visit( NameExpr *nameExpr ) { isConstExpr = false; }
-		virtual void visit( CastExpr *castExpr ) { isConstExpr = false; }
-		virtual void visit( LabelAddressExpr *labAddressExpr ) { isConstExpr = false; }
-		virtual void visit( UntypedMemberExpr *memberExpr ) { isConstExpr = false; }
-		virtual void visit( MemberExpr *memberExpr ) { isConstExpr = false; }
-		virtual void visit( VariableExpr *variableExpr ) { isConstExpr = false; }
-		virtual void visit( ConstantExpr *constantExpr ) { /* bottom out */ }
-		// these might be okay?
-		// virtual void visit( SizeofExpr *sizeofExpr );
-		// virtual void visit( AlignofExpr *alignofExpr );
-		// virtual void visit( UntypedOffsetofExpr *offsetofExpr );
-		// virtual void visit( OffsetofExpr *offsetofExpr );
-		// virtual void visit( OffsetPackExpr *offsetPackExpr );
-		// virtual void visit( AttrExpr *attrExpr );
-		// virtual void visit( CommaExpr *commaExpr );
-		// virtual void visit( LogicalExpr *logicalExpr );
-		// virtual void visit( ConditionalExpr *conditionalExpr );
-		virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }
-		virtual void visit( SolvedTupleExpr *tupleExpr ) { isConstExpr = false; }
-		virtual void visit( TypeExpr *typeExpr ) { isConstExpr = false; }
-		virtual void visit( AsmExpr *asmExpr ) { isConstExpr = false; }
-		virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; }
-		virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; }
-
-		bool isConstExpr;
-	};
-
-	bool isConstExpr( Initializer * init ) {
-		if ( init ) {
-			ConstExprChecker checker;
-			init->accept( checker );
-			return checker.isConstExpr;
-		} // if
-		// for all intents and purposes, no initializer means const expr
-		return true;
-	}
 
 	void fixGlobalInit( std::list< Declaration * > & translationUnit, const std::string & name, bool inLibrary ) {
@@ -140,6 +97,4 @@
 		std::list< Statement * > & destroyStatements = destroyFunction->get_statements()->get_kids();
 
-		if ( ! tryConstruct( objDecl ) ) return; // don't construct @= or designated objects
-		if ( objDecl->get_storageClass() == DeclarationNode::Extern ) return;
 		// C allows you to initialize objects with constant expressions
 		// xxx - this is an optimization. Need to first resolve constructors before we decide
@@ -147,22 +102,27 @@
 		// if ( isConstExpr( objDecl->get_init() ) ) return;
 
-		if ( dynamic_cast< ArrayType * > ( objDecl->get_type() ) ) {
-			// xxx - initialize each element of the array
-		} else {
-			// steal initializer from object and attach it to a new temporary
-			ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, objDecl->get_type()->clone(), objDecl->get_init() );
-			objDecl->set_init( NULL );
-			initStatements.push_back( new DeclStmt( noLabels, newObj ) );
+		if ( ConstructorInit * ctorInit = dynamic_cast< ConstructorInit * >( objDecl->get_init() ) ) {
+			// a decision should have been made by the resolver, so ctor and init are not both non-NULL
+			assert( ! ctorInit->get_ctor() || ! ctorInit->get_init() );
 
-			// copy construct objDecl using temporary
-			UntypedExpr * init = new UntypedExpr( new NameExpr( "?{}" ) );
-			init->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );
-			init->get_args().push_back( new VariableExpr( newObj ) );
-			initStatements.push_back( new ImplicitCtorDtorStmt( new ExprStmt( noLabels, init ) ) );
-
-			// add destructor calls to global destroy function
-			UntypedExpr * destroy = new UntypedExpr( new NameExpr( "^?{}" ) );
-			destroy->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );
-			destroyStatements.push_front( new ImplicitCtorDtorStmt( new ExprStmt( noLabels, destroy ) ) );
+			Statement * dtor = ctorInit->get_dtor();
+			if ( dtor && ! isIntrinsicSingleArgCallStmt( dtor ) ) {
+				// don't need to call intrinsic dtor, because it does nothing, but
+				// non-intrinsic dtors must be called
+				destroyStatements.push_front( dtor );
+				ctorInit->set_dtor( NULL );
+			} // if
+			if ( Statement * ctor = ctorInit->get_ctor() ) {
+				initStatements.push_back( ctor );
+				objDecl->set_init( NULL );
+				ctorInit->set_ctor( NULL );
+			} else if ( Initializer * init = ctorInit->get_init() ) {
+				objDecl->set_init( init );
+				ctorInit->set_init( NULL );
+			} else {
+				// no constructor and no initializer, which is okay
+				objDecl->set_init( NULL );
+			} // if
+			delete ctorInit;
 		} // if
 	}
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/InitTweak/FixInit.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -18,6 +18,7 @@
 #include <iterator>
 #include <algorithm>
+#include "InitTweak.h"
 #include "FixInit.h"
-#include "InitTweak.h"
+#include "FixGlobalInit.h"
 #include "ResolvExpr/Resolver.h"
 #include "ResolvExpr/typeops.h"
@@ -25,4 +26,5 @@
 #include "SynTree/Type.h"
 #include "SynTree/Expression.h"
+#include "SynTree/Attribute.h"
 #include "SynTree/Statement.h"
 #include "SynTree/Initializer.h"
@@ -83,4 +85,5 @@
 		};
 
+		// debug
 		struct printSet {
 			typedef ObjDeclCollector::ObjectSet ObjectSet;
@@ -159,4 +162,6 @@
 
 			virtual DeclarationWithType * mutate( ObjectDecl *objDecl );
+
+			std::list< Declaration * > staticDtorDecls;
 		};
 
@@ -171,5 +176,8 @@
 	} // namespace
 
-	void fix( std::list< Declaration * > & translationUnit ) {
+	void fix( std::list< Declaration * > & translationUnit, const std::string & filename, bool inLibrary ) {
+		// fixes ConstructorInit for global variables. should happen before fixInitializers.
+		InitTweak::fixGlobalInit( translationUnit, filename, inLibrary );
+
 		InsertImplicitCalls::insert( translationUnit );
 		ResolveCopyCtors::resolveImplicitCalls( translationUnit );
@@ -194,5 +202,19 @@
 		void FixInit::fixInitializers( std::list< Declaration * > & translationUnit ) {
 			FixInit fixer;
-			mutateAll( translationUnit, fixer );
+
+			// can't use mutateAll, because need to insert declarations at top-level
+			// can't use DeclMutator, because sometimes need to insert IfStmt, etc.
+			SemanticError errors;
+			for ( std::list< Declaration * >::iterator i = translationUnit.begin(); i != translationUnit.end(); ++i ) {
+				try {
+					*i = maybeMutate( *i, fixer );
+					translationUnit.splice( i, fixer.staticDtorDecls );
+				} catch( SemanticError &e ) {
+					errors.append( e );
+				} // try
+			} // for
+			if ( ! errors.isEmpty() ) {
+				throw errors;
+			} // if
 		}
 
@@ -422,16 +444,27 @@
 				if ( Statement * ctor = ctorInit->get_ctor() ) {
 					if ( objDecl->get_storageClass() == DeclarationNode::Static ) {
+						// originally wanted to take advantage of gcc nested functions, but
+						// we get memory errors with this approach. To remedy this, the static
+						// variable is hoisted when the destructor needs to be called.
+						//
 						// generate:
-						// static bool __objName_uninitialized = true;
-						// if (__objName_uninitialized) {
-						//   __ctor(__objName);
-						//   void dtor_atexit() {
-						//     __dtor(__objName);
+						// static T __objName_static_varN;
+						// void __objName_dtor_atexitN() {
+						//   __dtor__...;
+						// }
+						// int f(...) {
+						//   ...
+						//   static bool __objName_uninitialized = true;
+						//   if (__objName_uninitialized) {
+						//     __ctor(__objName);
+						//     __objName_uninitialized = false;
+						//     atexit(__objName_dtor_atexitN);
 						//   }
-						//   on_exit(dtorOnExit, &__objName);
-						//   __objName_uninitialized = false;
+						//   ...
 						// }
 
-						// generate first line
+						static UniqueName dtorCallerNamer( "_dtor_atexit" );
+
+						// static bool __objName_uninitialized = true
 						BasicType * boolType = new BasicType( Type::Qualifiers(), BasicType::Bool );
 						SingleInit * boolInitExpr = new SingleInit( new ConstantExpr( Constant( boolType->clone(), "1" ) ), noDesignators );
@@ -439,13 +472,4 @@
 						isUninitializedVar->fixUniqueId();
 
-						// void dtor_atexit(...) {...}
-						FunctionDecl * dtorCaller = new FunctionDecl( objDecl->get_mangleName() + "_dtor_atexit", DeclarationNode::NoStorageClass, LinkageSpec::C, new FunctionType( Type::Qualifiers(), false ), new CompoundStmt( noLabels ), false, false );
-						dtorCaller->fixUniqueId();
-						dtorCaller->get_statements()->get_kids().push_back( ctorInit->get_dtor()->clone() );
-
-						// on_exit(dtor_atexit);
-						UntypedExpr * callAtexit = new UntypedExpr( new NameExpr( "atexit" ) );
-						callAtexit->get_args().push_back( new VariableExpr( dtorCaller ) );
-
 						// __objName_uninitialized = false;
 						UntypedExpr * setTrue = new UntypedExpr( new NameExpr( "?=?" ) );
@@ -457,6 +481,4 @@
 						std::list< Statement * > & body = initStmts->get_kids();
 						body.push_back( ctor );
-						body.push_back( new DeclStmt( noLabels, dtorCaller ) );
-						body.push_back( new ExprStmt( noLabels, callAtexit ) );
 						body.push_back( new ExprStmt( noLabels, setTrue ) );
 
@@ -465,4 +487,43 @@
 						stmtsToAddAfter.push_back( new DeclStmt( noLabels, isUninitializedVar ) );
 						stmtsToAddAfter.push_back( ifStmt );
+
+						if ( ctorInit->get_dtor() ) {
+							// if the object has a non-trivial destructor, have to
+							// hoist it and the object into the global space and
+							// call the destructor function with atexit.
+
+							Statement * dtorStmt = ctorInit->get_dtor()->clone();
+
+							// void __objName_dtor_atexitN(...) {...}
+							FunctionDecl * dtorCaller = new FunctionDecl( objDecl->get_mangleName() + dtorCallerNamer.newName(), DeclarationNode::Static, LinkageSpec::C, new FunctionType( Type::Qualifiers(), false ), new CompoundStmt( noLabels ), false, false );
+							dtorCaller->fixUniqueId();
+							dtorCaller->get_statements()->get_kids().push_back( dtorStmt );
+
+							// atexit(dtor_atexit);
+							UntypedExpr * callAtexit = new UntypedExpr( new NameExpr( "atexit" ) );
+							callAtexit->get_args().push_back( new VariableExpr( dtorCaller ) );
+
+							body.push_back( new ExprStmt( noLabels, callAtexit ) );
+
+							// hoist variable and dtor caller decls to list of decls that will be added into global scope
+							staticDtorDecls.push_back( objDecl );
+							staticDtorDecls.push_back( dtorCaller );
+
+							// need to rename object uniquely since it now appears
+							// at global scope and there could be multiple function-scoped
+							// static variables with the same name in different functions.
+							static UniqueName staticNamer( "_static_var" );
+							objDecl->set_mangleName( objDecl->get_mangleName() + staticNamer.newName() );
+
+							objDecl->set_init( NULL );
+							ctorInit->set_ctor( NULL );
+							delete ctorInit;
+
+							// xxx - temporary hack: need to return a declaration, but want to hoist the current object out of this scope
+							// create a new object which is never used
+							static UniqueName dummyNamer( "_dummy" );
+							ObjectDecl * dummy = new ObjectDecl( dummyNamer.newName(), DeclarationNode::Static, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) ), 0, std::list< Attribute * >{ new Attribute("unused") } );
+							return dummy;
+						}
 					} else {
 						stmtsToAddAfter.push_back( ctor );
@@ -524,5 +585,5 @@
 					assert( ! ctorInit->get_ctor() || ! ctorInit->get_init() );
 					Statement * dtor = ctorInit->get_dtor();
-					if ( dtor && ! isInstrinsicSingleArgCallStmt( dtor ) ) {
+					if ( dtor && ! isIntrinsicSingleArgCallStmt( dtor ) ) {
 						// don't need to call intrinsic dtor, because it does nothing, but
 						// non-intrinsic dtors must be called
Index: src/InitTweak/FixInit.h
===================================================================
--- src/InitTweak/FixInit.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/InitTweak/FixInit.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -27,5 +27,5 @@
   /// replace constructor initializers with expression statements
   /// and unwrap basic C-style initializers
-	void fix( std::list< Declaration * > & translationUnit );
+	void fix( std::list< Declaration * > & translationUnit, const std::string & name, bool inLibrary );
 } // namespace
 
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/InitTweak/GenInit.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -26,4 +26,5 @@
 #include "SymTab/Autogen.h"
 #include "GenPoly/PolyMutator.h"
+#include "GenPoly/DeclMutator.h"
 
 namespace InitTweak {
@@ -55,28 +56,57 @@
 	  public:
 		/// create constructor and destructor statements for object declarations.
-		/// Destructors are inserted directly into the code, whereas constructors
-		/// will be added in after the resolver has run so that the initializer expression
-		/// is only removed if a constructor is found
+		/// the actual call statements will be added in after the resolver has run
+		/// so that the initializer expression is only removed if a constructor is found
+		/// and the same destructor call is inserted in all of the appropriate locations.
 		static void generateCtorDtor( std::list< Declaration * > &translationUnit );
-
-		CtorDtor() : inFunction( false ) {}
 
 		virtual DeclarationWithType * mutate( ObjectDecl * );
 		virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );
-		virtual Declaration* mutate( StructDecl *aggregateDecl );
-		virtual Declaration* mutate( UnionDecl *aggregateDecl );
-		virtual Declaration* mutate( EnumDecl *aggregateDecl );
-		virtual Declaration* mutate( TraitDecl *aggregateDecl );
-		virtual TypeDecl* mutate( TypeDecl *typeDecl );
-		virtual Declaration* mutate( TypedefDecl *typeDecl );
-
-		virtual Type * mutate( FunctionType *funcType );
+		// should not traverse into any of these declarations to find objects
+		// that need to be constructed or destructed
+		virtual Declaration* mutate( StructDecl *aggregateDecl ) { return aggregateDecl; }
+		virtual Declaration* mutate( UnionDecl *aggregateDecl ) { return aggregateDecl; }
+		virtual Declaration* mutate( EnumDecl *aggregateDecl ) { return aggregateDecl; }
+		virtual Declaration* mutate( TraitDecl *aggregateDecl ) { return aggregateDecl; }
+		virtual TypeDecl* mutate( TypeDecl *typeDecl ) { return typeDecl; }
+		virtual Declaration* mutate( TypedefDecl *typeDecl ) { return typeDecl; }
+
+		virtual Type * mutate( FunctionType *funcType ) { return funcType; }
 
 	  protected:
-		bool inFunction;
+	};
+
+	class HoistArrayDimension : public GenPoly::DeclMutator {
+	  public:
+		typedef GenPoly::DeclMutator Parent;
+
+		/// hoist dimension from array types in object declaration so that it uses a single
+		/// const variable of type size_t, so that side effecting array dimensions are only
+		/// computed once.
+		static void hoistArrayDimension( std::list< Declaration * > & translationUnit );
+
+	  private:
+		virtual DeclarationWithType * mutate( ObjectDecl * objectDecl );
+		virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );
+		// should not traverse into any of these declarations to find objects
+		// that need to be constructed or destructed
+		virtual Declaration* mutate( StructDecl *aggregateDecl ) { return aggregateDecl; }
+		virtual Declaration* mutate( UnionDecl *aggregateDecl ) { return aggregateDecl; }
+		virtual Declaration* mutate( EnumDecl *aggregateDecl ) { return aggregateDecl; }
+		virtual Declaration* mutate( TraitDecl *aggregateDecl ) { return aggregateDecl; }
+		virtual TypeDecl* mutate( TypeDecl *typeDecl ) { return typeDecl; }
+		virtual Declaration* mutate( TypedefDecl *typeDecl ) { return typeDecl; }
+
+		virtual Type* mutate( FunctionType *funcType ) { return funcType; }
+
+		void hoist( Type * type );
+
+		DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass;
+		bool inFunction = false;
 	};
 
 	void genInit( std::list< Declaration * > & translationUnit ) {
 		ReturnFixer::makeReturnTemp( translationUnit );
+		HoistArrayDimension::hoistArrayDimension( translationUnit );
 		CtorDtor::generateCtorDtor( translationUnit );
 	}
@@ -124,4 +154,53 @@
 	}
 
+	// precompute array dimension expression, because constructor generation may duplicate it,
+	// which would be incorrect if it is a side-effecting computation.
+	void HoistArrayDimension::hoistArrayDimension( std::list< Declaration * > & translationUnit ) {
+		HoistArrayDimension hoister;
+		hoister.mutateDeclarationList( translationUnit );
+	}
+
+	DeclarationWithType * HoistArrayDimension::mutate( ObjectDecl * objectDecl ) {
+		storageclass = objectDecl->get_storageClass();
+		DeclarationWithType * temp = Parent::mutate( objectDecl );
+		hoist( objectDecl->get_type() );
+		storageclass = DeclarationNode::NoStorageClass;
+		return temp;
+	}
+
+	void HoistArrayDimension::hoist( Type * type ) {
+		// if in function, generate const size_t var
+		static UniqueName dimensionName( "_array_dim" );
+
+		// C doesn't allow variable sized arrays at global scope or for static variables,
+		// so don't hoist dimension.
+		if ( ! inFunction ) return;
+		if ( storageclass == DeclarationNode::Static ) return;
+
+		if ( ArrayType * arrayType = dynamic_cast< ArrayType * >( type ) ) {
+			if ( ! arrayType->get_dimension() ) return; // xxx - recursive call to hoist?
+
+			// don't need to hoist dimension if it's a constexpr - only need to if there's potential
+			// for side effects.
+			if ( isConstExpr( arrayType->get_dimension() ) ) return;
+
+			ObjectDecl * arrayDimension = new ObjectDecl( dimensionName.newName(), storageclass, LinkageSpec::C, 0, SymTab::SizeType->clone(), new SingleInit( arrayType->get_dimension() ) );
+			arrayDimension->get_type()->set_isConst( true );
+
+			arrayType->set_dimension( new VariableExpr( arrayDimension ) );
+			addDeclaration( arrayDimension );
+
+			hoist( arrayType->get_base() );
+			return;
+		}
+	}
+
+	DeclarationWithType * HoistArrayDimension::mutate( FunctionDecl *functionDecl ) {
+		bool oldInFunc = inFunction;
+		inFunction = true;
+		DeclarationWithType * decl = Parent::mutate( functionDecl );
+		inFunction = oldInFunc;
+		return decl;
+	}
 
 	void CtorDtor::generateCtorDtor( std::list< Declaration * > & translationUnit ) {
@@ -130,60 +209,34 @@
 	}
 
-	namespace {
-		Expression * makeCtorDtorExpr( std::string name, ObjectDecl * objDecl, std::list< Expression * > args ) {
-			UntypedExpr * expr = new UntypedExpr( new NameExpr( name ) );
-			expr->get_args().push_back( new AddressExpr( new VariableExpr( objDecl ) ) );
-			expr->get_args().splice( expr->get_args().end(), args );
-			return expr;
-		}
-	}
-
 	DeclarationWithType * CtorDtor::mutate( ObjectDecl * objDecl ) {
-		// hands off if designated or if @=
+		// hands off if designated, if @=, or if extern
 		if ( tryConstruct( objDecl ) ) {
-			if ( inFunction ) {
-				if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->get_type() ) ) {
-					// call into makeArrayFunction from validate.cc to generate calls to ctor/dtor for each element of array
-					// TODO: walk initializer and generate appropriate copy ctor if element has initializer
-					std::list< Expression * > args = makeInitList( objDecl->get_init() );
-					if ( args.empty() ) {
-						std::list< Statement * > ctor;
-						std::list< Statement * > dtor;
-
-						SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "?{}", back_inserter( ctor ) );
-						SymTab::makeArrayFunction( NULL, new VariableExpr( objDecl ), at, "^?{}", front_inserter( dtor ), false );
-
-						// Currently makeArrayFunction produces a single Statement - a CompoundStmt
-						// which  wraps everything that needs to happen. As such, it's technically
-						// possible to use a Statement ** in the above calls, but this is inherently
-						// unsafe, so instead we take the slightly less efficient route, but will be
-						// immediately informed if somehow the above assumption is broken. In this case,
-						// we could always wrap the list of statements at this point with a CompoundStmt,
-						// but it seems reasonable at the moment for this to be done by makeArrayFunction
-						// itself
-						assert( ctor.size() == 1 && dynamic_cast< ImplicitCtorDtorStmt * >( ctor.front() ) );
-						assert( dtor.size() == 1 && dynamic_cast< ImplicitCtorDtorStmt * >( dtor.front() ) );
-						objDecl->set_init( new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init() ) );
-					} else {
-						// array came with an initializer list: initialize each element
-						// may have more initializers than elements in the array - need to check at each index that
-						// we haven't exceeded size. This requires precomputing the size because it might be a side-effecting
-						// computation.
-						// may have fewer initializers than eleemnts in the array - need to default construct
-						// remaining elements.
-						// might be able to merge this with the case above.
-					}
-				} else {
-					// it's sufficient to attempt to call the ctor/dtor for the given object and its initializer
-					Expression * ctor = makeCtorDtorExpr( "?{}", objDecl, makeInitList( objDecl->get_init() ) );
-					Expression * dtor = makeCtorDtorExpr( "^?{}", objDecl, std::list< Expression * >() );
-
-					// need to remember init expression, in case no ctors exist
-					// if ctor does exist, want to use ctor expression instead of init
-					// push this decision to the resolver
-					ExprStmt * ctorStmt = new ExprStmt( noLabels, ctor );
-					ExprStmt * dtorStmt = new ExprStmt( noLabels, dtor );
-					objDecl->set_init( new ConstructorInit( new ImplicitCtorDtorStmt( ctorStmt ), new ImplicitCtorDtorStmt( dtorStmt ), objDecl->get_init() ) );
-				}
+			// call into genImplicitCall from Autogen.h to generate calls to ctor/dtor
+			// for each constructable object
+			std::list< Statement * > ctor;
+			std::list< Statement * > dtor;
+
+			InitExpander srcParam( objDecl->get_init() );
+			InitExpander nullParam( (Initializer *)NULL );
+			SymTab::genImplicitCall( srcParam, new VariableExpr( objDecl ), "?{}", back_inserter( ctor ), objDecl );
+			SymTab::genImplicitCall( nullParam, new VariableExpr( objDecl ), "^?{}", front_inserter( dtor ), objDecl, false );
+
+			// Currently genImplicitCall produces a single Statement - a CompoundStmt
+			// which  wraps everything that needs to happen. As such, it's technically
+			// possible to use a Statement ** in the above calls, but this is inherently
+			// unsafe, so instead we take the slightly less efficient route, but will be
+			// immediately informed if somehow the above assumption is broken. In this case,
+			// we could always wrap the list of statements at this point with a CompoundStmt,
+			// but it seems reasonable at the moment for this to be done by genImplicitCall
+			// itself. It is possible that genImplicitCall produces no statements (e.g. if
+			// an array type does not have a dimension). In this case, it's fine to ignore
+			// the object for the purposes of construction.
+			assert( ctor.size() == dtor.size() && ctor.size() <= 1 );
+			if ( ctor.size() == 1 ) {
+				// need to remember init expression, in case no ctors exist
+				// if ctor does exist, want to use ctor expression instead of init
+				// push this decision to the resolver
+				assert( dynamic_cast< ImplicitCtorDtorStmt * > ( ctor.front() ) && dynamic_cast< ImplicitCtorDtorStmt * > ( dtor.front() ) );
+				objDecl->set_init( new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init() ) );
 			}
 		}
@@ -193,22 +246,8 @@
 	DeclarationWithType * CtorDtor::mutate( FunctionDecl *functionDecl ) {
 		// parameters should not be constructed and destructed, so don't mutate FunctionType
-		bool oldInFunc = inFunction;
 		mutateAll( functionDecl->get_oldDecls(), *this );
-		inFunction = true;
 		functionDecl->set_statements( maybeMutate( functionDecl->get_statements(), *this ) );
-		inFunction = oldInFunc;
 		return functionDecl;
 	}
-
-	// should not traverse into any of these declarations to find objects
-	// that need to be constructed or destructed
-	Declaration* CtorDtor::mutate( StructDecl *aggregateDecl ) { return aggregateDecl; }
-	Declaration* CtorDtor::mutate( UnionDecl *aggregateDecl ) { return aggregateDecl; }
-	Declaration* CtorDtor::mutate( EnumDecl *aggregateDecl ) { return aggregateDecl; }
-	Declaration* CtorDtor::mutate( TraitDecl *aggregateDecl ) { return aggregateDecl; }
-	TypeDecl* CtorDtor::mutate( TypeDecl *typeDecl ) { return typeDecl; }
-	Declaration* CtorDtor::mutate( TypedefDecl *typeDecl ) { return typeDecl; }
-	Type* CtorDtor::mutate( FunctionType *funcType ) { return funcType; }
-
 } // namespace InitTweak
 
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/InitTweak/InitTweak.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -1,2 +1,3 @@
+#include <algorithm>
 #include "InitTweak.h"
 #include "SynTree/Visitor.h"
@@ -4,4 +5,5 @@
 #include "SynTree/Initializer.h"
 #include "SynTree/Expression.h"
+#include "SynTree/Attribute.h"
 #include "GenPoly/GenPoly.h"
 
@@ -20,7 +22,6 @@
 		};
 
-		class InitExpander : public Visitor {
+		class InitFlattener : public Visitor {
 			public:
-			InitExpander() {}
 			virtual void visit( SingleInit * singleInit );
 			virtual void visit( ListInit * listInit );
@@ -28,12 +29,12 @@
 		};
 
-		void InitExpander::visit( SingleInit * singleInit ) {
+		void InitFlattener::visit( SingleInit * singleInit ) {
 			argList.push_back( singleInit->get_value()->clone() );
 		}
 
-		void InitExpander::visit( ListInit * listInit ) {
-			// xxx - for now, assume no nested list inits
-			std::list<Initializer*>::iterator it = listInit->begin_initializers();
-			for ( ; it != listInit->end_initializers(); ++it ) {
+		void InitFlattener::visit( ListInit * listInit ) {
+			// flatten nested list inits
+			std::list<Initializer*>::iterator it = listInit->begin();
+			for ( ; it != listInit->end(); ++it ) {
 				(*it)->accept( *this );
 			}
@@ -42,7 +43,7 @@
 
 	std::list< Expression * > makeInitList( Initializer * init ) {
-		InitExpander expander;
-		maybeAccept( init, expander );
-		return expander.argList;
+		InitFlattener flattener;
+		maybeAccept( init, flattener );
+		return flattener.argList;
 	}
 
@@ -53,48 +54,254 @@
 	}
 
+	class InitExpander::ExpanderImpl {
+	public:
+		virtual std::list< Expression * > next( std::list< Expression * > & indices ) = 0;
+		virtual Statement * buildListInit( UntypedExpr * callExpr, std::list< Expression * > & indices ) = 0;
+	};
+
+	class InitImpl : public InitExpander::ExpanderImpl {
+	public:
+		InitImpl( Initializer * init ) : init( init ) {}
+
+		virtual std::list< Expression * > next( std::list< Expression * > & indices ) {
+			// this is wrong, but just a placeholder for now
+			// if ( ! flattened ) flatten( indices );
+			// return ! inits.empty() ? makeInitList( inits.front() ) : std::list< Expression * >();
+			return makeInitList( init );
+		}
+
+		virtual Statement * buildListInit( UntypedExpr * callExpr, std::list< Expression * > & indices );
+	private:
+		Initializer * init;
+	};
+
+	class ExprImpl : public InitExpander::ExpanderImpl {
+	public:
+		ExprImpl( Expression * expr ) : arg( expr ) {}
+
+		virtual std::list< Expression * > next( std::list< Expression * > & indices ) {
+			std::list< Expression * > ret;
+			Expression * expr = maybeClone( arg );
+			if ( expr ) {
+				for ( std::list< Expression * >::reverse_iterator it = indices.rbegin(); it != indices.rend(); ++it ) {
+					// go through indices and layer on subscript exprs ?[?]
+					++it;
+					UntypedExpr * subscriptExpr = new UntypedExpr( new NameExpr( "?[?]") );
+					subscriptExpr->get_args().push_back( expr );
+					subscriptExpr->get_args().push_back( (*it)->clone() );
+					expr = subscriptExpr;
+				}
+				ret.push_back( expr );
+			}
+			return ret;
+		}
+
+		virtual Statement * buildListInit( UntypedExpr * callExpr, std::list< Expression * > & indices );
+	private:
+		Expression * arg;
+	};
+
+	InitExpander::InitExpander( Initializer * init ) : expander( new InitImpl( init ) ) {}
+
+	InitExpander::InitExpander( Expression * expr ) : expander( new ExprImpl( expr ) ) {}
+
+	std::list< Expression * > InitExpander::operator*() {
+		return cur;
+	}
+
+	InitExpander & InitExpander::operator++() {
+		cur = expander->next( indices );
+		return *this;
+	}
+
+	// use array indices list to build switch statement
+	void InitExpander::addArrayIndex( Expression * index, Expression * dimension ) {
+		indices.push_back( index );
+		indices.push_back( dimension );
+	}
+
+	void InitExpander::clearArrayIndices() {
+		indices.clear();
+	}
+
+	namespace {
+		/// given index i, dimension d, initializer init, and callExpr f, generates
+		///   if (i < d) f(..., init)
+		///   ++i;
+		/// so that only elements within the range of the array are constructed
+		template< typename OutIterator >
+		void buildCallExpr( UntypedExpr * callExpr, Expression * index, Expression * dimension, Initializer * init, OutIterator out ) {
+			UntypedExpr * cond = new UntypedExpr( new NameExpr( "?<?") );
+			cond->get_args().push_back( index->clone() );
+			cond->get_args().push_back( dimension->clone() );
+
+			std::list< Expression * > args = makeInitList( init );
+			callExpr->get_args().splice( callExpr->get_args().end(), args );
+
+			*out++ = new IfStmt( noLabels, cond, new ExprStmt( noLabels, callExpr ), NULL );
+
+			UntypedExpr * increment = new UntypedExpr( new NameExpr( "++?" ) );
+			increment->get_args().push_back( new AddressExpr( index->clone() ) );
+			*out++ = new ExprStmt( noLabels, increment );
+		}
+
+		template< typename OutIterator >
+		void build( UntypedExpr * callExpr, InitExpander::IndexList::iterator idx, InitExpander::IndexList::iterator idxEnd, Initializer * init, OutIterator out ) {
+			if ( idx == idxEnd ) return;
+			Expression * index = *idx++;
+			assert( idx != idxEnd );
+			Expression * dimension = *idx++;
+
+			// xxx - may want to eventually issue a warning here if we can detect
+			// that the number of elements exceeds to dimension of the array
+			if ( idx == idxEnd ) {
+				if ( ListInit * listInit = dynamic_cast< ListInit * >( init ) ) {
+					for ( Initializer * init : *listInit ) {
+						buildCallExpr( callExpr->clone(), index, dimension, init, out );
+					}
+				} else {
+					buildCallExpr( callExpr->clone(), index, dimension, init, out );
+				}
+			} else {
+				std::list< Statement * > branches;
+
+				unsigned long cond = 0;
+				ListInit * listInit = dynamic_cast< ListInit * >( init );
+				if ( ! listInit ) {
+					// xxx - this shouldn't be an error, but need a way to
+					// terminate without creating output, so should catch this error
+					throw SemanticError( "unbalanced list initializers" );
+				}
+
+				static UniqueName targetLabel( "L__autogen__" );
+				Label switchLabel( targetLabel.newName(), 0, std::list< Attribute * >{ new Attribute("unused") } );
+				for ( Initializer * init : *listInit ) {
+					Expression * condition;
+					// check for designations
+					// if ( init-> ) {
+						condition = new ConstantExpr( Constant::from_ulong( cond ) );
+						++cond;
+					// } else {
+					// 	condition = // ... take designation
+					// 	cond = // ... take designation+1
+					// }
+					std::list< Statement * > stmts;
+					build( callExpr, idx, idxEnd, init, back_inserter( stmts ) );
+					stmts.push_back( new BranchStmt( noLabels, switchLabel, BranchStmt::Break ) );
+					CaseStmt * caseStmt = new CaseStmt( noLabels, condition, stmts );
+					branches.push_back( caseStmt );
+				}
+				*out++ = new SwitchStmt( noLabels, index->clone(), branches );
+				*out++ = new NullStmt( std::list<Label>{ switchLabel } );
+			}
+		}
+	}
+
+	// if array came with an initializer list: initialize each element
+	// may have more initializers than elements in the array - need to check at each index that
+	// we haven't exceeded size.
+	// may have fewer initializers than elements in the array - need to default construct
+	// remaining elements.
+	// To accomplish this, generate switch statement, consuming all of expander's elements
+	Statement * InitImpl::buildListInit( UntypedExpr * dst, std::list< Expression * > & indices ) {
+		if ( ! init ) return NULL;
+		CompoundStmt * block = new CompoundStmt( noLabels );
+		build( dst, indices.begin(), indices.end(), init, back_inserter( block->get_kids() ) );
+		if ( block->get_kids().empty() ) {
+			delete block;
+			return NULL;
+		} else {
+			init = NULL; // init was consumed in creating the list init
+			return block;
+		}
+	}
+
+	Statement * ExprImpl::buildListInit( UntypedExpr * dst, std::list< Expression * > & indices ) {
+		return NULL;
+	}
+
+	Statement * InitExpander::buildListInit( UntypedExpr * dst ) {
+		return expander->buildListInit( dst, indices );
+	}
+
 	bool tryConstruct( ObjectDecl * objDecl ) {
 		return ! LinkageSpec::isBuiltin( objDecl->get_linkage() ) &&
 			(objDecl->get_init() == NULL ||
 				( objDecl->get_init() != NULL && objDecl->get_init()->get_maybeConstructed() )) &&
-			! isDesignated( objDecl->get_init() );
+			! isDesignated( objDecl->get_init() )
+			&& objDecl->get_storageClass() != DeclarationNode::Extern;
+	}
+
+	class CallFinder : public Visitor {
+	public:
+		typedef Visitor Parent;
+		CallFinder( const std::list< std::string > & names ) : names( names ) {}
+
+		virtual void visit( ApplicationExpr * appExpr ) {
+			handleCallExpr( appExpr );
+		}
+
+		virtual void visit( UntypedExpr * untypedExpr ) {
+			handleCallExpr( untypedExpr );
+		}
+
+		std::list< Expression * > * matches;
+	private:
+		const std::list< std::string > names;
+
+		template< typename CallExpr >
+		void handleCallExpr( CallExpr * expr ) {
+			Parent::visit( expr );
+			std::string fname = getFunctionName( expr );
+			if ( std::find( names.begin(), names.end(), fname ) != names.end() ) {
+				matches->push_back( expr );
+			}
+		}
+	};
+
+	void collectCtorDtorCalls( Statement * stmt, std::list< Expression * > & matches ) {
+		static CallFinder finder( std::list< std::string >{ "?{}", "^?{}" } );
+		finder.matches = &matches;
+		maybeAccept( stmt, finder );
 	}
 
 	Expression * getCtorDtorCall( Statement * stmt ) {
-		if ( stmt == NULL ) return NULL;
-		if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( stmt ) ) {
-			return exprStmt->get_expr();
-		} else if ( CompoundStmt * compoundStmt = dynamic_cast< CompoundStmt * >( stmt ) ) {
-			// could also be a compound statement with a loop, in the case of an array
-			if( compoundStmt->get_kids().size() == 2 ) {
-				// loop variable and loop
-				ForStmt * forStmt = dynamic_cast< ForStmt * >( compoundStmt->get_kids().back() );
-				assert( forStmt && forStmt->get_body() );
-				return getCtorDtorCall( forStmt->get_body() );
-			} else if ( compoundStmt->get_kids().size() == 1 ) {
-				// should be the call statement, but in any case there's only one option
-				return getCtorDtorCall( compoundStmt->get_kids().front() );
-			} else {
-				assert( false && "too many statements in compoundStmt for getCtorDtorCall" );
-			}
-		} if ( ImplicitCtorDtorStmt * impCtorDtorStmt = dynamic_cast< ImplicitCtorDtorStmt * > ( stmt ) ) {
-			return getCtorDtorCall( impCtorDtorStmt->get_callStmt() );
-		} else {
-			// should never get here
-			assert( false && "encountered unknown call statement" );
-		}
-	}
-
-	bool isInstrinsicSingleArgCallStmt( Statement * stmt ) {
-		Expression * callExpr = getCtorDtorCall( stmt );
-		if ( ! callExpr ) return false;
-		ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( callExpr );
-		assert( appExpr );
-		VariableExpr * function = dynamic_cast< VariableExpr * >( appExpr->get_function() );
+		std::list< Expression * > matches;
+		collectCtorDtorCalls( stmt, matches );
+		assert( matches.size() <= 1 );
+		return matches.size() == 1 ? matches.front() : NULL;
+	}
+
+	namespace {
+		VariableExpr * getCalledFunction( ApplicationExpr * appExpr ) {
+			assert( appExpr );
+			// xxx - it's possible this can be other things, e.g. MemberExpr, so this is insufficient
+			return dynamic_cast< VariableExpr * >( appExpr->get_function() );
+		}
+	}
+
+	ApplicationExpr * isIntrinsicCallExpr( Expression * expr ) {
+		ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr );
+		if ( ! appExpr ) return NULL;
+		VariableExpr * function = getCalledFunction( appExpr );
 		assert( function );
 		// check for Intrinsic only - don't want to remove all overridable ctor/dtors because autogenerated ctor/dtor
 		// will call all member dtors, and some members may have a user defined dtor.
-		FunctionType * funcType = GenPoly::getFunctionType( function->get_var()->get_type() );
-		assert( funcType );
-		return function->get_var()->get_linkage() == LinkageSpec::Intrinsic && funcType->get_parameters().size() == 1;
+		return function->get_var()->get_linkage() == LinkageSpec::Intrinsic ? appExpr : NULL;
+	}
+
+	bool isIntrinsicSingleArgCallStmt( Statement * stmt ) {
+		std::list< Expression * > callExprs;
+		collectCtorDtorCalls( stmt, callExprs );
+		// if ( callExprs.empty() ) return false; // xxx - do I still need this check?
+		return std::all_of( callExprs.begin(), callExprs.end(), []( Expression * callExpr ){
+			if ( ApplicationExpr * appExpr = isIntrinsicCallExpr( callExpr ) ) {
+				assert( ! appExpr->get_function()->get_results().empty() );
+				FunctionType *funcType = GenPoly::getFunctionType( appExpr->get_function()->get_results().front() );
+				assert( funcType );
+				return funcType->get_parameters().size() == 1;
+			}
+			return false;
+		});
 	}
 
@@ -160,3 +367,56 @@
 		else return NULL;
 	}
+
+	class ConstExprChecker : public Visitor {
+	public:
+		ConstExprChecker() : isConstExpr( true ) {}
+
+		virtual void visit( ApplicationExpr *applicationExpr ) { isConstExpr = false; }
+		virtual void visit( UntypedExpr *untypedExpr ) { isConstExpr = false; }
+		virtual void visit( NameExpr *nameExpr ) { isConstExpr = false; }
+		virtual void visit( CastExpr *castExpr ) { isConstExpr = false; }
+		virtual void visit( LabelAddressExpr *labAddressExpr ) { isConstExpr = false; }
+		virtual void visit( UntypedMemberExpr *memberExpr ) { isConstExpr = false; }
+		virtual void visit( MemberExpr *memberExpr ) { isConstExpr = false; }
+		virtual void visit( VariableExpr *variableExpr ) { isConstExpr = false; }
+		virtual void visit( ConstantExpr *constantExpr ) { /* bottom out */ }
+		// these might be okay?
+		// virtual void visit( SizeofExpr *sizeofExpr );
+		// virtual void visit( AlignofExpr *alignofExpr );
+		// virtual void visit( UntypedOffsetofExpr *offsetofExpr );
+		// virtual void visit( OffsetofExpr *offsetofExpr );
+		// virtual void visit( OffsetPackExpr *offsetPackExpr );
+		// virtual void visit( AttrExpr *attrExpr );
+		// virtual void visit( CommaExpr *commaExpr );
+		// virtual void visit( LogicalExpr *logicalExpr );
+		// virtual void visit( ConditionalExpr *conditionalExpr );
+		virtual void visit( TupleExpr *tupleExpr ) { isConstExpr = false; }
+		virtual void visit( SolvedTupleExpr *tupleExpr ) { isConstExpr = false; }
+		virtual void visit( TypeExpr *typeExpr ) { isConstExpr = false; }
+		virtual void visit( AsmExpr *asmExpr ) { isConstExpr = false; }
+		virtual void visit( UntypedValofExpr *valofExpr ) { isConstExpr = false; }
+		virtual void visit( CompoundLiteralExpr *compLitExpr ) { isConstExpr = false; }
+
+		bool isConstExpr;
+	};
+
+	bool isConstExpr( Expression * expr ) {
+		if ( expr ) {
+			ConstExprChecker checker;
+			expr->accept( checker );
+			return checker.isConstExpr;
+		}
+		return true;
+	}
+
+	bool isConstExpr( Initializer * init ) {
+		if ( init ) {
+			ConstExprChecker checker;
+			init->accept( checker );
+			return checker.isConstExpr;
+		} // if
+		// for all intents and purposes, no initializer means const expr
+		return true;
+	}
+
 }
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/InitTweak/InitTweak.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -26,32 +26,70 @@
 // helper functions for initialization
 namespace InitTweak {
-  /// transform Initializer into an argument list that can be passed to a call expression
-  std::list< Expression * > makeInitList( Initializer * init );
+	/// transform Initializer into an argument list that can be passed to a call expression
+	std::list< Expression * > makeInitList( Initializer * init );
 
-  /// True if the resolver should try to construct objDecl
-  bool tryConstruct( ObjectDecl * objDecl );
+	/// True if the resolver should try to construct objDecl
+	bool tryConstruct( ObjectDecl * objDecl );
 
-  /// True if the Initializer contains designations
-  bool isDesignated( Initializer * init );
+	/// True if the Initializer contains designations
+	bool isDesignated( Initializer * init );
 
-  /// True if stmt is a call statement where the function called is intrinsic and takes one parameter.
-  /// Intended to be used for default ctor/dtor calls, but might have use elsewhere.
-  /// Currently has assertions that make it less than fully general.
-  bool isInstrinsicSingleArgCallStmt( Statement * expr );
+  /// Non-Null if expr is a call expression whose target function is intrinsic
+  ApplicationExpr * isIntrinsicCallExpr( Expression * expr );
 
-  /// get the Ctor/Dtor call expression from a Statement that looks like a generated ctor/dtor call
-  Expression * getCtorDtorCall( Statement * stmt );
+	/// True if stmt is a call statement where the function called is intrinsic and takes one parameter.
+	/// Intended to be used for default ctor/dtor calls, but might have use elsewhere.
+	/// Currently has assertions that make it less than fully general.
+	bool isIntrinsicSingleArgCallStmt( Statement * expr );
 
-  /// returns the name of the function being called
-  std::string getFunctionName( Expression * expr );
+	/// get all Ctor/Dtor call expressions from a Statement
+	void collectCtorDtorCalls( Statement * stmt, std::list< Expression * > & matches );
 
-  /// returns the argument to a call expression in position N indexed from 0
-  Expression *& getCallArg( Expression * callExpr, unsigned int pos );
+	/// get the Ctor/Dtor call expression from a Statement that looks like a generated ctor/dtor call
+	Expression * getCtorDtorCall( Statement * stmt );
 
-  /// returns the base type of a PointerType or ArrayType, else returns NULL
-  Type * getPointerBase( Type * );
+	/// returns the name of the function being called
+	std::string getFunctionName( Expression * expr );
 
-  /// returns the argument if it is a PointerType or ArrayType, else returns NULL
-  Type * isPointerType( Type * );
+	/// returns the argument to a call expression in position N indexed from 0
+	Expression *& getCallArg( Expression * callExpr, unsigned int pos );
+
+	/// returns the base type of a PointerType or ArrayType, else returns NULL
+	Type * getPointerBase( Type * );
+
+	/// returns the argument if it is a PointerType or ArrayType, else returns NULL
+	Type * isPointerType( Type * );
+
+	/// returns true if expr is trivially a compile-time constant
+	bool isConstExpr( Expression * expr );
+	bool isConstExpr( Initializer * init );
+
+	class InitExpander {
+	public:
+		// expand by stepping through init to get each list of arguments
+		InitExpander( Initializer * init );
+
+		// always expand to expr
+		InitExpander( Expression * expr );
+
+		// iterator-like interface
+		std::list< Expression * > operator*();
+		InitExpander & operator++();
+
+		// builds statement which has the same semantics as a C-style list initializer
+		// (for array initializers) using callExpr as the base expression to perform initialization
+		Statement * buildListInit( UntypedExpr * callExpr );
+		void addArrayIndex( Expression * index, Expression * dimension );
+		void clearArrayIndices();
+
+		class ExpanderImpl;
+	private:
+		std::shared_ptr< ExpanderImpl > expander;
+		std::list< Expression * > cur;
+
+		// invariant: list of size 2N (elements come in pairs [index, dimension])
+		typedef std::list< Expression * > IndexList;
+		IndexList indices;
+	};
 } // namespace
 
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Makefile.in	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -108,5 +108,4 @@
 	ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT) \
 	ControlStruct/driver_cfa_cpp-MLEMutator.$(OBJEXT) \
-	ControlStruct/driver_cfa_cpp-CaseRangeMutator.$(OBJEXT) \
 	ControlStruct/driver_cfa_cpp-Mutate.$(OBJEXT) \
 	ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT) \
@@ -122,4 +121,5 @@
 	GenPoly/driver_cfa_cpp-FindFunction.$(OBJEXT) \
 	GenPoly/driver_cfa_cpp-DeclMutator.$(OBJEXT) \
+	GenPoly/driver_cfa_cpp-InstantiateGeneric.$(OBJEXT) \
 	InitTweak/driver_cfa_cpp-GenInit.$(OBJEXT) \
 	InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT) \
@@ -372,18 +372,18 @@
 	Common/SemanticError.cc Common/UniqueName.cc \
 	ControlStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \
-	ControlStruct/MLEMutator.cc ControlStruct/CaseRangeMutator.cc \
-	ControlStruct/Mutate.cc ControlStruct/ForExprMutator.cc \
+	ControlStruct/MLEMutator.cc ControlStruct/Mutate.cc \
+	ControlStruct/ForExprMutator.cc \
 	ControlStruct/LabelTypeChecker.cc Designators/Processor.cc \
 	GenPoly/Box.cc GenPoly/GenPoly.cc GenPoly/PolyMutator.cc \
 	GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc GenPoly/Specialize.cc \
 	GenPoly/CopyParams.cc GenPoly/FindFunction.cc \
-	GenPoly/DeclMutator.cc InitTweak/GenInit.cc \
-	InitTweak/FixInit.cc InitTweak/FixGlobalInit.cc \
-	InitTweak/InitTweak.cc Parser/parser.yy Parser/lex.ll \
-	Parser/TypedefTable.cc Parser/ParseNode.cc \
-	Parser/DeclarationNode.cc Parser/ExpressionNode.cc \
-	Parser/StatementNode.cc Parser/InitializerNode.cc \
-	Parser/TypeData.cc Parser/LinkageSpec.cc \
-	Parser/parseutility.cc Parser/Parser.cc \
+	GenPoly/DeclMutator.cc GenPoly/InstantiateGeneric.cc \
+	InitTweak/GenInit.cc InitTweak/FixInit.cc \
+	InitTweak/FixGlobalInit.cc InitTweak/InitTweak.cc \
+	Parser/parser.yy Parser/lex.ll Parser/TypedefTable.cc \
+	Parser/ParseNode.cc Parser/DeclarationNode.cc \
+	Parser/ExpressionNode.cc Parser/StatementNode.cc \
+	Parser/InitializerNode.cc Parser/TypeData.cc \
+	Parser/LinkageSpec.cc Parser/parseutility.cc Parser/Parser.cc \
 	ResolvExpr/AlternativeFinder.cc ResolvExpr/Alternative.cc \
 	ResolvExpr/Unify.cc ResolvExpr/PtrsAssignable.cc \
@@ -542,7 +542,4 @@
 	ControlStruct/$(DEPDIR)/$(am__dirstamp)
 ControlStruct/driver_cfa_cpp-MLEMutator.$(OBJEXT):  \
-	ControlStruct/$(am__dirstamp) \
-	ControlStruct/$(DEPDIR)/$(am__dirstamp)
-ControlStruct/driver_cfa_cpp-CaseRangeMutator.$(OBJEXT):  \
 	ControlStruct/$(am__dirstamp) \
 	ControlStruct/$(DEPDIR)/$(am__dirstamp)
@@ -589,4 +586,6 @@
 GenPoly/driver_cfa_cpp-DeclMutator.$(OBJEXT): GenPoly/$(am__dirstamp) \
 	GenPoly/$(DEPDIR)/$(am__dirstamp)
+GenPoly/driver_cfa_cpp-InstantiateGeneric.$(OBJEXT):  \
+	GenPoly/$(am__dirstamp) GenPoly/$(DEPDIR)/$(am__dirstamp)
 InitTweak/$(am__dirstamp):
 	@$(MKDIR_P) InitTweak
@@ -820,5 +819,4 @@
 	-rm -f Common/driver_cfa_cpp-SemanticError.$(OBJEXT)
 	-rm -f Common/driver_cfa_cpp-UniqueName.$(OBJEXT)
-	-rm -f ControlStruct/driver_cfa_cpp-CaseRangeMutator.$(OBJEXT)
 	-rm -f ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT)
 	-rm -f ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT)
@@ -833,4 +831,5 @@
 	-rm -f GenPoly/driver_cfa_cpp-FindFunction.$(OBJEXT)
 	-rm -f GenPoly/driver_cfa_cpp-GenPoly.$(OBJEXT)
+	-rm -f GenPoly/driver_cfa_cpp-InstantiateGeneric.$(OBJEXT)
 	-rm -f GenPoly/driver_cfa_cpp-Lvalue.$(OBJEXT)
 	-rm -f GenPoly/driver_cfa_cpp-PolyMutator.$(OBJEXT)
@@ -930,5 +929,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-SemanticError.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-UniqueName.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-CaseRangeMutator.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-ForExprMutator.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelFixer.Po@am__quote@
@@ -943,4 +941,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-FindFunction.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-GenPoly.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-Lvalue.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@GenPoly/$(DEPDIR)/driver_cfa_cpp-PolyMutator.Po@am__quote@
@@ -1212,18 +1211,4 @@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-MLEMutator.obj `if test -f 'ControlStruct/MLEMutator.cc'; then $(CYGPATH_W) 'ControlStruct/MLEMutator.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/MLEMutator.cc'; fi`
 
-ControlStruct/driver_cfa_cpp-CaseRangeMutator.o: ControlStruct/CaseRangeMutator.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-CaseRangeMutator.o -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-CaseRangeMutator.Tpo -c -o ControlStruct/driver_cfa_cpp-CaseRangeMutator.o `test -f 'ControlStruct/CaseRangeMutator.cc' || echo '$(srcdir)/'`ControlStruct/CaseRangeMutator.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-CaseRangeMutator.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-CaseRangeMutator.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='ControlStruct/CaseRangeMutator.cc' object='ControlStruct/driver_cfa_cpp-CaseRangeMutator.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-CaseRangeMutator.o `test -f 'ControlStruct/CaseRangeMutator.cc' || echo '$(srcdir)/'`ControlStruct/CaseRangeMutator.cc
-
-ControlStruct/driver_cfa_cpp-CaseRangeMutator.obj: ControlStruct/CaseRangeMutator.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-CaseRangeMutator.obj -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-CaseRangeMutator.Tpo -c -o ControlStruct/driver_cfa_cpp-CaseRangeMutator.obj `if test -f 'ControlStruct/CaseRangeMutator.cc'; then $(CYGPATH_W) 'ControlStruct/CaseRangeMutator.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/CaseRangeMutator.cc'; fi`
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-CaseRangeMutator.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-CaseRangeMutator.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='ControlStruct/CaseRangeMutator.cc' object='ControlStruct/driver_cfa_cpp-CaseRangeMutator.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-CaseRangeMutator.obj `if test -f 'ControlStruct/CaseRangeMutator.cc'; then $(CYGPATH_W) 'ControlStruct/CaseRangeMutator.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/CaseRangeMutator.cc'; fi`
-
 ControlStruct/driver_cfa_cpp-Mutate.o: ControlStruct/Mutate.cc
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-Mutate.o -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-Mutate.Tpo -c -o ControlStruct/driver_cfa_cpp-Mutate.o `test -f 'ControlStruct/Mutate.cc' || echo '$(srcdir)/'`ControlStruct/Mutate.cc
@@ -1407,4 +1392,18 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o GenPoly/driver_cfa_cpp-DeclMutator.obj `if test -f 'GenPoly/DeclMutator.cc'; then $(CYGPATH_W) 'GenPoly/DeclMutator.cc'; else $(CYGPATH_W) '$(srcdir)/GenPoly/DeclMutator.cc'; fi`
+
+GenPoly/driver_cfa_cpp-InstantiateGeneric.o: GenPoly/InstantiateGeneric.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT GenPoly/driver_cfa_cpp-InstantiateGeneric.o -MD -MP -MF GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Tpo -c -o GenPoly/driver_cfa_cpp-InstantiateGeneric.o `test -f 'GenPoly/InstantiateGeneric.cc' || echo '$(srcdir)/'`GenPoly/InstantiateGeneric.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Tpo GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='GenPoly/InstantiateGeneric.cc' object='GenPoly/driver_cfa_cpp-InstantiateGeneric.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o GenPoly/driver_cfa_cpp-InstantiateGeneric.o `test -f 'GenPoly/InstantiateGeneric.cc' || echo '$(srcdir)/'`GenPoly/InstantiateGeneric.cc
+
+GenPoly/driver_cfa_cpp-InstantiateGeneric.obj: GenPoly/InstantiateGeneric.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT GenPoly/driver_cfa_cpp-InstantiateGeneric.obj -MD -MP -MF GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Tpo -c -o GenPoly/driver_cfa_cpp-InstantiateGeneric.obj `if test -f 'GenPoly/InstantiateGeneric.cc'; then $(CYGPATH_W) 'GenPoly/InstantiateGeneric.cc'; else $(CYGPATH_W) '$(srcdir)/GenPoly/InstantiateGeneric.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Tpo GenPoly/$(DEPDIR)/driver_cfa_cpp-InstantiateGeneric.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='GenPoly/InstantiateGeneric.cc' object='GenPoly/driver_cfa_cpp-InstantiateGeneric.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o GenPoly/driver_cfa_cpp-InstantiateGeneric.obj `if test -f 'GenPoly/InstantiateGeneric.cc'; then $(CYGPATH_W) 'GenPoly/InstantiateGeneric.cc'; else $(CYGPATH_W) '$(srcdir)/GenPoly/InstantiateGeneric.cc'; fi`
 
 InitTweak/driver_cfa_cpp-GenInit.o: InitTweak/GenInit.cc
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/DeclarationNode.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 20:49:31 2016
-// Update Count     : 164
+// Last Modified On : Mon Aug 15 20:48:55 2016
+// Update Count     : 178
 //
 
@@ -49,8 +49,8 @@
 	newnode->name = name;
 	newnode->storageClasses = storageClasses;
-	newnode->bitfieldWidth = maybeClone( bitfieldWidth );
+	newnode->bitfieldWidth = bitfieldWidth;
 	newnode->hasEllipsis = hasEllipsis;
 	newnode->initializer = initializer;
-	newnode->next = maybeClone( next );
+	newnode->set_next( maybeClone( get_next() ) );
 	newnode->linkage = linkage;
 	return newnode;
@@ -283,5 +283,5 @@
 	newnode->type->array->dimension = size;
 	newnode->type->array->isStatic = isStatic;
-	if ( newnode->type->array->dimension == 0 || dynamic_cast<ConstantNode *>( newnode->type->array->dimension ) ) {
+	if ( newnode->type->array->dimension == 0 || dynamic_cast< ConstantExpr * >( newnode->type->array->dimension->build() ) ) {
 		newnode->type->array->isVarLen = false;
 	} else {
@@ -469,6 +469,6 @@
 
 		// there may be typedefs chained onto the type
-		if ( o->get_link() ) {
-			set_link( o->get_link()->clone() );
+		if ( o->get_next() ) {
+			set_last( o->get_next()->clone() );
 		} // if
 	} // if
@@ -756,5 +756,5 @@
 DeclarationNode *DeclarationNode::appendList( DeclarationNode *node ) {
 	if ( node != 0 ) {
-		set_link( node );
+		set_last( node );
 	} // if
 	return this;
@@ -775,5 +775,5 @@
 void buildList( const DeclarationNode *firstNode, std::list< Declaration * > &outputList ) {
 	SemanticError errors;
-	std::back_insert_iterator< std::list< Declaration *> > out( outputList );
+	std::back_insert_iterator< std::list< Declaration * > > out( outputList );
 	const DeclarationNode *cur = firstNode;
 	while ( cur ) {
@@ -793,5 +793,5 @@
 			errors.append( e );
 		} // try
-		cur = dynamic_cast<DeclarationNode *>( cur->get_link() );
+		cur = dynamic_cast< DeclarationNode * >( cur->get_next() );
 	} // while
 	if ( ! errors.isEmpty() ) {
@@ -800,7 +800,7 @@
 }
 
-void buildList( const DeclarationNode *firstNode, std::list< DeclarationWithType *> &outputList ) {
+void buildList( const DeclarationNode *firstNode, std::list< DeclarationWithType * > &outputList ) {
 	SemanticError errors;
-	std::back_insert_iterator< std::list< DeclarationWithType *> > out( outputList );
+	std::back_insert_iterator< std::list< DeclarationWithType * > > out( outputList );
 	const DeclarationNode *cur = firstNode;
 	while ( cur ) {
@@ -816,11 +816,11 @@
 			Declaration *decl = cur->build();
 			if ( decl ) {
-				if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType *>( decl ) ) {
+				if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( decl ) ) {
 					*out++ = dwt;
-				} else if ( StructDecl *agg = dynamic_cast< StructDecl *>( decl ) ) {
+				} else if ( StructDecl *agg = dynamic_cast< StructDecl * >( decl ) ) {
 					StructInstType *inst = new StructInstType( Type::Qualifiers(), agg->get_name() );
 					*out++ = new ObjectDecl( "", DeclarationNode::NoStorageClass, linkage, 0, inst, 0 );
 					delete agg;
-				} else if ( UnionDecl *agg = dynamic_cast< UnionDecl *>( decl ) ) {
+				} else if ( UnionDecl *agg = dynamic_cast< UnionDecl * >( decl ) ) {
 					UnionInstType *inst = new UnionInstType( Type::Qualifiers(), agg->get_name() );
 					*out++ = new ObjectDecl( "", DeclarationNode::NoStorageClass, linkage, 0, inst, 0 );
@@ -830,5 +830,5 @@
 			errors.append( e );
 		} // try
-		cur = dynamic_cast< DeclarationNode *>( cur->get_link() );
+		cur = dynamic_cast< DeclarationNode * >( cur->get_next() );
 	} // while
 	if ( ! errors.isEmpty() ) {
@@ -837,7 +837,7 @@
 }
 
-void buildTypeList( const DeclarationNode *firstNode, std::list< Type *> &outputList ) {
+void buildTypeList( const DeclarationNode *firstNode, std::list< Type * > &outputList ) {
 	SemanticError errors;
-	std::back_insert_iterator< std::list< Type *> > out( outputList );
+	std::back_insert_iterator< std::list< Type * > > out( outputList );
 	const DeclarationNode *cur = firstNode;
 	while ( cur ) {
@@ -847,5 +847,5 @@
 			errors.append( e );
 		} // try
-		cur = dynamic_cast< DeclarationNode *>( cur->get_link() );
+		cur = dynamic_cast< DeclarationNode * >( cur->get_next() );
 	} // while
 	if ( ! errors.isEmpty() ) {
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/ExpressionNode.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,13 +10,14 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul  5 13:41:55 2016
-// Update Count     : 320
+// Last Modified On : Tue Aug 16 00:09:20 2016
+// Update Count     : 495
 //
 
 #include <cassert>
 #include <cctype>
+#include <climits>
+#include <cstdio>
 #include <algorithm>
 #include <sstream>
-#include <cstdio>
 
 #include "ParseNode.h"
@@ -31,771 +32,281 @@
 using namespace std;
 
-ExpressionNode::ExpressionNode() : ParseNode() {}
-
-ExpressionNode::ExpressionNode( const string *name ) : ParseNode( name ) {}
-
-ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other.name ), extension( other.extension ) {
-	if ( other.argName ) {
-		argName = other.argName->clone();
-	} else {
-		argName = 0;
-	} // if
-}
-
-ExpressionNode * ExpressionNode::set_argName( const std::string *aName ) {
-	argName = new VarRefNode( aName );
-	return this;
-}
-
-ExpressionNode * ExpressionNode::set_argName( ExpressionNode *aDesignator ) {
-	argName = aDesignator;
-	return this;
-}
-
-void ExpressionNode::printDesignation( std::ostream &os, int indent ) const {
-	if ( argName ) {
-		os << string( indent, ' ' ) << "(designated by:  ";
-		argName->printOneLine( os, indent );
-		os << ")" << std::endl;
-	} // if
-}
+ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other.get_name() ), extension( other.extension ) {}
 
 //##############################################################################
 
-NullExprNode::NullExprNode() {}
-
-NullExprNode *NullExprNode::clone() const {
-	return new NullExprNode();
-}
-
-void NullExprNode::print( std::ostream & os, int indent ) const {
-	printDesignation( os );
-	os << "null expression";
-}
-
-void NullExprNode::printOneLine( std::ostream & os, int indent ) const {
-	printDesignation( os );
-	os << "null";
-}
-
-Expression *NullExprNode::build() const {
-	return 0;
-}
-
-CommaExprNode *ExpressionNode::add_to_list( ExpressionNode *exp ) {
-	return new CommaExprNode( this, exp );
-}
-
-//##############################################################################
-
-ConstantNode::ConstantNode( ConstantExpr *expr ) : expr( expr ) {
-} // ConstantNode::ConstantNode
-
-ConstantNode *ConstantNode::appendstr( const std::string *newValue ) {
-	assert( newValue != 0 );
-
-	string value = expr->get_constant()->get_value();
-
-	// "abc" "def" "ghi" => "abcdefghi", remove new text from quotes and insert before last quote in old string.
-	value.insert( value.length() - 1, newValue->substr( 1, newValue->length() - 2 ) );
-	expr->get_constant()->set_value( value );
-
-	delete newValue;									// allocated by lexer
-	return this;
-}
-
-void ConstantNode::printOneLine( std::ostream &os, int indent ) const {
-	// os << string( indent, ' ' );
-	// printDesignation( os );
-
-	// switch ( type ) {
-	//   case Integer:
-	//   case Float:
-	// 	os << value ;
-	// 	break;
-	//   case Character:
-	// 	os << "'" << value << "'";
-	// 	break;
-	//   case String:
-	// 	os << '"' << value << '"';
-	// 	break;
-	// } // switch
-
-	// os << ' ';
-}
-
-void ConstantNode::print( std::ostream &os, int indent ) const {
-	printOneLine( os, indent );
-	os << endl;
-}
-
-Expression *ConstantNode::build() const {
-	return expr->clone();
-}
-
-//##############################################################################
-
-VarRefNode::VarRefNode() : isLabel( false ) {}
-
-VarRefNode::VarRefNode( const string *name_, bool labelp ) : ExpressionNode( name_ ), isLabel( labelp ) {}
-
-VarRefNode::VarRefNode( const VarRefNode &other ) : ExpressionNode( other ), isLabel( other.isLabel ) {
-}
-
-Expression *VarRefNode::build() const {
-	return new NameExpr( get_name(), maybeBuild< Expression >( get_argName() ) );
-}
-
-void VarRefNode::printOneLine( std::ostream &os, int indent ) const {
-	printDesignation( os );
-	os << get_name() << ' ';
-}
-
-void VarRefNode::print( std::ostream &os, int indent ) const {
-	printDesignation( os );
-	os << string( indent, ' ' ) << "Referencing: ";
-	os << "Variable: " << get_name();
-	os << endl;
-}
-
-//##############################################################################
-
-DesignatorNode::DesignatorNode( ExpressionNode *expr, bool isArrayIndex ) : isArrayIndex( isArrayIndex ) {
-	set_argName( expr );
-	assert( get_argName() );
-
-	if ( ! isArrayIndex ) {
-		if ( VarRefNode * var = dynamic_cast< VarRefNode * >( expr ) ) {
-
-			stringstream ss( var->get_name() );
-			double value;
-			if ( ss >> value ) {
-				// this is a floating point constant. It MUST be
-				// ".0" or ".1", otherwise the program is invalid
-				if ( ! (var->get_name() == ".0" || var->get_name() == ".1") ) {
-					throw SemanticError( "invalid designator name: " + var->get_name() );
-				} // if
-				var->set_name( var->get_name().substr(1) );
+// Difficult to separate extra parts of constants during lexing because actions are not allow in the middle of patterns:
+//
+//		prefix action constant action suffix
+//
+// Alternatively, breaking a pattern using BEGIN does not work if the following pattern can be empty:
+//
+//		constant BEGIN CONT ...
+//		<CONT>(...)? BEGIN 0 ... // possible empty suffix
+//
+// because the CONT rule is NOT triggered if the pattern is empty. Hence, constants are reparsed here to determine their
+// type.
+
+static Type::Qualifiers emptyQualifiers;				// no qualifiers on constants
+
+static inline bool checkU( char c ) { return c == 'u' || c == 'U'; }
+static inline bool checkL( char c ) { return c == 'l' || c == 'L'; }
+static inline bool checkF( char c ) { return c == 'f' || c == 'F'; }
+static inline bool checkD( char c ) { return c == 'd' || c == 'D'; }
+static inline bool checkI( char c ) { return c == 'i' || c == 'I'; }
+static inline bool checkX( char c ) { return c == 'x' || c == 'X'; }
+
+Expression *build_constantInteger( std::string & str ) {
+	static const BasicType::Kind kind[2][3] = {
+		{ BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt },
+		{ BasicType::UnsignedInt, BasicType::LongUnsignedInt, BasicType::LongLongUnsignedInt },
+	};
+	bool dec = true, Unsigned = false;					// decimal, unsigned constant
+	int size;											// 0 => int, 1 => long, 2 => long long
+	unsigned long long v;								// converted integral value
+	size_t last = str.length() - 1;						// last character of constant
+
+	if ( str[0] == '0' ) {								// octal/hex constant ?
+		dec = false;
+		if ( last != 0 && checkX( str[1] ) ) {			// hex constant ?
+			sscanf( (char *)str.c_str(), "%llx", &v );
+			//printf( "%llx %llu\n", v, v );
+		} else {										// octal constant
+			sscanf( (char *)str.c_str(), "%llo", &v );
+			//printf( "%llo %llu\n", v, v );
+		} // if
+	} else {											// decimal constant ?
+		sscanf( (char *)str.c_str(), "%llu", &v );
+		//printf( "%llu %llu\n", v, v );
+	} // if
+
+	if ( v <= INT_MAX ) {								// signed int
+		size = 0;
+	} else if ( v <= UINT_MAX && ! dec ) {				// unsigned int
+		size = 0;
+		Unsigned = true;								// unsigned
+	} else if ( v <= LONG_MAX ) {						// signed long int
+		size = 1;
+	} else if ( v <= ULONG_MAX && ( ! dec || LONG_MAX == LLONG_MAX ) ) { // signed long int
+		size = 1;
+		Unsigned = true;								// unsigned long int
+	} else if ( v <= LLONG_MAX ) {						// signed long long int
+		size = 2;
+	} else {											// unsigned long long int
+		size = 2;
+		Unsigned = true;								// unsigned long long int
+	} // if
+
+	if ( checkU( str[last] ) ) {						// suffix 'u' ?
+		Unsigned = true;
+		if ( last > 0 && checkL( str[last - 1] ) ) {	// suffix 'l' ?
+			size = 1;
+			if ( last > 1 && checkL( str[last - 2] ) ) { // suffix 'll' ?
+				size = 2;
 			} // if
 		} // if
-	} // if
-}
-
-DesignatorNode::DesignatorNode( const DesignatorNode &other ) : ExpressionNode( other ), isArrayIndex( other.isArrayIndex ) {
-}
-
-class DesignatorFixer : public Mutator {
-public:
-	virtual Expression* mutate( NameExpr *nameExpr ) {
-		if ( nameExpr->get_name() == "0" || nameExpr->get_name() == "1" ) {
-			Constant val( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nameExpr->get_name() );
-			delete nameExpr;
-			return new ConstantExpr( val );
-		}
-		return nameExpr;
-	}
-};
-
-Expression *DesignatorNode::build() const {
-	Expression * ret = maybeBuild<Expression>(get_argName());
-
-	if ( isArrayIndex ) {
-		// need to traverse entire structure and change any instances of 0 or 1 to
-		// ConstantExpr
-		DesignatorFixer fixer;
-		ret = ret->acceptMutator( fixer );
-	} // if
-
-	return ret;
-}
-
-void DesignatorNode::printOneLine( std::ostream &os, int indent ) const {
-	if ( get_argName() ) {
-		if ( isArrayIndex ) {
-			os << "[";
-			get_argName()->printOneLine( os, indent );
-			os << "]";
+	} else if ( checkL( str[ last ] ) ) {				// suffix 'l' ?
+		size = 1;
+		if ( last > 0 && checkL( str[last - 1] ) ) {	// suffix 'll' ?
+			size = 2;
+			if ( last > 1 && checkU( str[last - 2] ) ) { // suffix 'u' ?
+				Unsigned = true;
+			} // if
 		} else {
-			os << ".";
-			get_argName()->printOneLine( os, indent );
-		}
-	} // if
-}
-
-void DesignatorNode::print( std::ostream &os, int indent ) const {
-	if ( get_argName() ) {
-		if ( isArrayIndex ) {
-			os << "[";
-			get_argName()->print( os, indent );
-			os << "]";
-		} else {
-			os << ".";
-			get_argName()->print( os, indent );
-		}
-	} // if
-}
-
-//##############################################################################
-
-static const char *opName[] = {
-	"TupleC", "Comma", "TupleFieldSel", // "TuplePFieldSel", // n-adic
-	// triadic
-	"Cond", "NCond",
+			if ( last > 0 && checkU( str[last - 1] ) ) { // suffix 'u' ?
+				Unsigned = true;
+			} // if
+		} // if
+	} // if
+
+	return new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[Unsigned][size] ), str ) );
+} // build_constantInteger
+
+Expression *build_constantFloat( std::string & str ) {
+	static const BasicType::Kind kind[2][3] = {
+		{ BasicType::Float, BasicType::Double, BasicType::LongDouble },
+		{ BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex },
+	};
+
+	bool complx = false;								// real, complex
+	int size = 1;										// 0 => float, 1 => double (default), 2 => long double
+	// floating-point constant has minimum of 2 characters: 1. or .1
+	size_t last = str.length() - 1;
+
+	if ( checkI( str[last] ) ) {						// imaginary ?
+		complx = true;
+		last -= 1;										// backup one character
+	} // if
+
+	if ( checkF( str[last] ) ) {						// float ?
+		size = 0;
+	} else if ( checkD( str[last] ) ) {					// double ?
+		size = 1;
+	} else if ( checkL( str[last] ) ) {					// long double ?
+		size = 2;
+	} // if
+	if ( ! complx && checkI( str[last - 1] ) ) {		// imaginary ?
+		complx = true;
+	} // if
+
+	return new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[complx][size] ), str ) );
+} // build_constantFloat
+
+Expression *build_constantChar( std::string & str ) {
+	return new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::Char ), str ) );
+} // build_constantChar
+
+ConstantExpr *build_constantStr( std::string & str ) {
+	// string should probably be a primitive type
+	ArrayType *at = new ArrayType( emptyQualifiers, new BasicType( emptyQualifiers, BasicType::Char ),
+				new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::UnsignedInt ),
+											toString( str.size()+1-2 ) ) ),  // +1 for '\0' and -2 for '"'
+								   false, false );
+	return new ConstantExpr( Constant( at, str ) );
+} // build_constantStr
+
+NameExpr * build_varref( const string *name, bool labelp ) {
+	return new NameExpr( *name, nullptr );
+}
+
+static const char *OperName[] = {
 	// diadic
-	"SizeOf", "AlignOf", "OffsetOf", "Attr", "?+?", "?-?", "?*?", "?/?", "?%?", "||", "&&",
+	"SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?*?", "?/?", "?%?", "||", "&&",
 	"?|?", "?&?", "?^?", "Cast", "?<<?", "?>>?", "?<?", "?>?", "?<=?", "?>=?", "?==?", "?!=?",
 	"?=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
-	"?[?]", "FieldSel", "PFieldSel", "Range",
+	"?[?]", "...",
 	// monadic
 	"+?", "-?", "AddressOf", "*?", "!?", "~?", "++?", "?++", "--?", "?--", "&&"
 };
 
-OperatorNode::OperatorNode( Type t ) : type( t ) {}
-
-OperatorNode::OperatorNode( const OperatorNode &other ) : ExpressionNode( other ), type( other.type ) {
-}
-
-OperatorNode::~OperatorNode() {}
-
-OperatorNode::Type OperatorNode::get_type( void ) const{
-	return type;
-}
-
-void OperatorNode::printOneLine( std::ostream &os, int indent ) const {
-	printDesignation( os );
-	os << opName[ type ] << ' ';
-}
-
-void OperatorNode::print( std::ostream &os, int indent ) const{
-	printDesignation( os );
-	os << string( indent, ' ' ) << "Operator: " << opName[type] << endl;
-	return;
-}
-
-const char *OperatorNode::get_typename( void ) const{
-	return opName[ type ];
-}
-
-//##############################################################################
-
-CompositeExprNode::CompositeExprNode() : ExpressionNode(), function( 0 ), arguments( 0 ) {
-}
-
-CompositeExprNode::CompositeExprNode( const string *name_ ) : ExpressionNode( name_ ), function( 0 ), arguments( 0 ) {
-}
-
-CompositeExprNode::CompositeExprNode( ExpressionNode *f, ExpressionNode *args ):
-	function( f ), arguments( args ) {
-}
-
-CompositeExprNode::CompositeExprNode( ExpressionNode *f, ExpressionNode *arg1, ExpressionNode *arg2):
-	function( f ), arguments( arg1 ) {
-	arguments->set_link( arg2 );
-}
-
-CompositeExprNode::CompositeExprNode( const CompositeExprNode &other ) : ExpressionNode( other ), function( maybeClone( other.function ) ), arguments( 0 ) {
-	ParseNode *cur = other.arguments;
-	while ( cur ) {
-		if ( arguments ) {
-			arguments->set_link( cur->clone() );
-		} else {
-			arguments = ( ExpressionNode*)cur->clone();
-		} // if
-		cur = cur->get_link();
-	}
-}
-
-CompositeExprNode::~CompositeExprNode() {
-	delete function;
-	delete arguments;
-}
-
-#include "Common/utility.h"
-
-Expression *CompositeExprNode::build() const {
-	OperatorNode *op;
-	std::list<Expression *> args;
-
-	buildList( get_args(), args );
-
-	if ( ! ( op = dynamic_cast<OperatorNode *>( function ) ) ) { // function as opposed to operator
-		return new UntypedExpr( maybeBuild<Expression>(function), args, maybeBuild< Expression >( get_argName() ));
-	} // if
-
-	switch ( op->get_type()) {
-	  case OperatorNode::Incr:
-	  case OperatorNode::Decr:
-	  case OperatorNode::IncrPost:
-	  case OperatorNode::DecrPost:
-	  case OperatorNode::Assign:
-	  case OperatorNode::MulAssn:
-	  case OperatorNode::DivAssn:
-	  case OperatorNode::ModAssn:
-	  case OperatorNode::PlusAssn:
-	  case OperatorNode::MinusAssn:
-	  case OperatorNode::LSAssn:
-	  case OperatorNode::RSAssn:
-	  case OperatorNode::AndAssn:
-	  case OperatorNode::ERAssn:
-	  case OperatorNode::OrAssn:
-		// the rewrite rules for these expressions specify that the first argument has its address taken
-		assert( ! args.empty() );
-		args.front() = new AddressExpr( args.front() );
-		break;
-	  default:		// do nothing
-		;
-	} // switch
-
-	switch ( op->get_type() ) {
-	  case OperatorNode::Incr:
-	  case OperatorNode::Decr:
-	  case OperatorNode::IncrPost:
-	  case OperatorNode::DecrPost:
-	  case OperatorNode::Assign:
-	  case OperatorNode::MulAssn:
-	  case OperatorNode::DivAssn:
-	  case OperatorNode::ModAssn:
-	  case OperatorNode::PlusAssn:
-	  case OperatorNode::MinusAssn:
-	  case OperatorNode::LSAssn:
-	  case OperatorNode::RSAssn:
-	  case OperatorNode::AndAssn:
-	  case OperatorNode::ERAssn:
-	  case OperatorNode::OrAssn:
-	  case OperatorNode::Plus:
-	  case OperatorNode::Minus:
-	  case OperatorNode::Mul:
-	  case OperatorNode::Div:
-	  case OperatorNode::Mod:
-	  case OperatorNode::BitOr:
-	  case OperatorNode::BitAnd:
-	  case OperatorNode::Xor:
-	  case OperatorNode::LShift:
-	  case OperatorNode::RShift:
-	  case OperatorNode::LThan:
-	  case OperatorNode::GThan:
-	  case OperatorNode::LEThan:
-	  case OperatorNode::GEThan:
-	  case OperatorNode::Eq:
-	  case OperatorNode::Neq:
-	  case OperatorNode::Index:
-	  case OperatorNode::Range:
-	  case OperatorNode::UnPlus:
-	  case OperatorNode::UnMinus:
-	  case OperatorNode::PointTo:
-	  case OperatorNode::Neg:
-	  case OperatorNode::BitNeg:
-	  case OperatorNode::LabelAddress:
-		return new UntypedExpr( new NameExpr( opName[ op->get_type() ] ), args );
-	  case OperatorNode::AddressOf:
-		assert( args.size() == 1 );
-		assert( args.front() );
-
-		return new AddressExpr( args.front() );
-	  case OperatorNode::Cast:
-		{
-			TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args());
-			assert( arg );
-
-			DeclarationNode *decl_node = arg->get_decl();
-			ExpressionNode *expr_node = dynamic_cast<ExpressionNode *>( arg->get_link());
-
-			Type *targetType = decl_node->buildType();
-			if ( dynamic_cast< VoidType* >( targetType ) ) {
-				delete targetType;
-				return new CastExpr( maybeBuild<Expression>(expr_node), maybeBuild< Expression >( get_argName() ) );
-			} else {
-				return new CastExpr( maybeBuild<Expression>(expr_node),targetType, maybeBuild< Expression >( get_argName() ) );
-			} // if
-		}
-	  case OperatorNode::FieldSel:
-		{
-			assert( args.size() == 2 );
-
-			NameExpr *member = dynamic_cast<NameExpr *>( args.back());
-			// TupleExpr *memberTup = dynamic_cast<TupleExpr *>( args.back());
-
-			if ( member != 0 ) {
-				UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), args.front());
-				delete member;
-				return ret;
-				/* else if ( memberTup != 0 )
-				   {
-				   UntypedMemberExpr *ret = new UntypedMemberExpr( memberTup->get_name(), args.front());
-				   delete member;
-				   return ret;
-				   } */
-			} else
-				assert( false );
-		}
-	  case OperatorNode::PFieldSel:
-		{
-			assert( args.size() == 2 );
-
-			NameExpr *member = dynamic_cast<NameExpr *>( args.back());  // modify for Tuples   xxx
-			assert( member != 0 );
-
-			UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
-			deref->get_args().push_back( args.front() );
-
-			UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), deref );
-			delete member;
-			return ret;
-		}
-	  case OperatorNode::SizeOf:
-		{
-			if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args()) ) {
-				return new SizeofExpr( arg->get_decl()->buildType());
-			} else {
-				return new SizeofExpr( args.front());
-			} // if
-		}
-	  case OperatorNode::AlignOf:
-		{
-			if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args()) ) {
-				return new AlignofExpr( arg->get_decl()->buildType());
-			} else {
-				return new AlignofExpr( args.front());
-			} // if
-		}
-	  case OperatorNode::OffsetOf:
-		{
-			assert( args.size() == 2 );
-
-			if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args() ) ) {
-				NameExpr *member = dynamic_cast<NameExpr *>( args.back() );
-				assert( member != 0 );
-
-				return new UntypedOffsetofExpr( arg->get_decl()->buildType(), member->get_name() );
-			} else assert( false );
-		}
-	  case OperatorNode::Attr:
-		{
-			VarRefNode *var = dynamic_cast<VarRefNode *>( get_args());
-			assert( var );
-			if ( ! get_args()->get_link() ) {
-				return new AttrExpr( maybeBuild<Expression>(var), ( Expression*)0);
-			} else if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args()->get_link()) ) {
-				return new AttrExpr( maybeBuild<Expression>(var), arg->get_decl()->buildType());
-			} else {
-				return new AttrExpr( maybeBuild<Expression>(var), args.back());
-			} // if
-		}
-	  case OperatorNode::Or:
-	  case OperatorNode::And:
-		assert( args.size() == 2);
-		return new LogicalExpr( notZeroExpr( args.front() ), notZeroExpr( args.back() ), ( op->get_type() == OperatorNode::And ) );
-	  case OperatorNode::Cond:
-		{
-			assert( args.size() == 3);
-			std::list< Expression * >::const_iterator i = args.begin();
-			Expression *arg1 = notZeroExpr( *i++ );
-			Expression *arg2 = *i++;
-			Expression *arg3 = *i++;
-			return new ConditionalExpr( arg1, arg2, arg3 );
-		}
-	  case OperatorNode::NCond:
-		throw UnimplementedError( "GNU 2-argument conditional expression" );
-	  case OperatorNode::Comma:
-		{
-			assert( args.size() == 2);
-			std::list< Expression * >::const_iterator i = args.begin();
-			Expression *ret = *i++;
-			while ( i != args.end() ) {
-				ret = new CommaExpr( ret, *i++ );
-			}
-			return ret;
-		}
-		// Tuples
-	  case OperatorNode::TupleC:
-		{
-			TupleExpr *ret = new TupleExpr();
-			std::copy( args.begin(), args.end(), back_inserter( ret->get_exprs() ) );
-			return ret;
-		}
-	  default:
-		// shouldn't happen
-		assert( false );
-		return 0;
-	} // switch
-}
-
-void CompositeExprNode::printOneLine( std::ostream &os, int indent ) const {
-	printDesignation( os );
-	os << "( ";
-	function->printOneLine( os, indent );
-	for ( ExpressionNode *cur = arguments; cur != 0; cur = dynamic_cast< ExpressionNode* >( cur->get_link() ) ) {
-		cur->printOneLine( os, indent );
-	} // for
-	os << ") ";
-}
-
-void CompositeExprNode::print( std::ostream &os, int indent ) const {
-	printDesignation( os );
-	os << string( indent, ' ' ) << "Application of: " << endl;
-	function->print( os, indent + ParseNode::indent_by );
-
-	os << string( indent, ' ' ) ;
-	if ( arguments ) {
-		os << "... on arguments: " << endl;
-		arguments->printList( os, indent + ParseNode::indent_by );
-	} else
-		os << "... on no arguments: " << endl;
-}
-
-void CompositeExprNode::set_function( ExpressionNode *f ) {
-	function = f;
-}
-
-void CompositeExprNode::set_args( ExpressionNode *args ) {
-	arguments = args;
-}
-
-ExpressionNode *CompositeExprNode::get_function( void ) const {
-	return function;
-}
-
-ExpressionNode *CompositeExprNode::get_args( void ) const {
-	return arguments;
-}
-
-void CompositeExprNode::add_arg( ExpressionNode *arg ) {
-	if ( arguments )
-		arguments->set_link( arg );
-	else
-		set_args( arg );
-}
-
-//##############################################################################
-
-Expression *AsmExprNode::build() const {
-	return new AsmExpr( maybeBuild< Expression >( inout ), (ConstantExpr *)maybeBuild<Expression>(constraint), maybeBuild<Expression>(operand) );
-}
-
-void AsmExprNode::print( std::ostream &os, int indent ) const {
-	os << string( indent, ' ' ) << "Assembler Expression:" << endl;
-	if ( inout ) {
-		os << string( indent, ' ' ) << "inout: " << std::endl;
-		inout->print( os, indent + 2 );
-	} // if
-	if ( constraint ) {
-		os << string( indent, ' ' ) << "constraint: " << std::endl;
-		constraint->print( os, indent + 2 );
-	} // if
-	if ( operand ) {
-		os << string( indent, ' ' ) << "operand: " << std::endl;
-		operand->print( os, indent + 2 );
-	} // if
-}
-
-void AsmExprNode::printOneLine( std::ostream &os, int indent ) const {
-	printDesignation( os );
-	os << "( ";
-	if ( inout ) inout->printOneLine( os, indent + 2 );
-	os << ", ";
-	if ( constraint ) constraint->printOneLine( os, indent + 2 );
-	os << ", ";
-	if ( operand ) operand->printOneLine( os, indent + 2 );
-	os << ") ";
-}
-
-//##############################################################################
-
-void LabelNode::print( std::ostream &os, int indent ) const {}
-
-void LabelNode::printOneLine( std::ostream &os, int indent ) const {}
-
-//##############################################################################
-
-CommaExprNode::CommaExprNode(): CompositeExprNode( new OperatorNode( OperatorNode::Comma )) {}
-
-CommaExprNode::CommaExprNode( ExpressionNode *exp ) : CompositeExprNode( new OperatorNode( OperatorNode::Comma ), exp ) {
-}
-
-CommaExprNode::CommaExprNode( ExpressionNode *exp1, ExpressionNode *exp2) : CompositeExprNode( new OperatorNode( OperatorNode::Comma ), exp1, exp2) {
-}
-
-CommaExprNode *CommaExprNode::add_to_list( ExpressionNode *exp ) {
-	add_arg( exp );
-
-	return this;
-}
-
-CommaExprNode::CommaExprNode( const CommaExprNode &other ) : CompositeExprNode( other ) {
-}
-
-//##############################################################################
-
-ValofExprNode::ValofExprNode( StatementNode *s ): body( s ) {}
-
-ValofExprNode::ValofExprNode( const ValofExprNode &other ) : ExpressionNode( other ), body( maybeClone( body ) ) {
-}
-
-ValofExprNode::~ValofExprNode() {
-	delete body;
-}
-
-void ValofExprNode::print( std::ostream &os, int indent ) const {
-	printDesignation( os );
-	os << string( indent, ' ' ) << "Valof Expression:" << std::endl;
-	get_body()->print( os, indent + 4);
-}
-
-void ValofExprNode::printOneLine( std::ostream &, int indent ) const {
-	assert( false );
-}
-
-Expression *ValofExprNode::build() const {
-	return new UntypedValofExpr ( maybeBuild<Statement>(get_body()), maybeBuild< Expression >( get_argName() ) );
-}
-
-//##############################################################################
-
-ForCtlExprNode::ForCtlExprNode( ParseNode *init_, ExpressionNode *cond, ExpressionNode *incr ) throw ( SemanticError ) : condition( cond ), change( incr ) {
-	if ( init_ == 0 )
-		init = 0;
-	else {
-		DeclarationNode *decl;
-		ExpressionNode *exp;
-
-		if (( decl = dynamic_cast<DeclarationNode *>(init_) ) != 0)
-			init = new StatementNode( decl );
-		else if (( exp = dynamic_cast<ExpressionNode *>( init_)) != 0)
-			init = new StatementNode( StatementNode::Exp, exp );
-		else
-			throw SemanticError("Error in for control expression");
-	}
-}
-
-ForCtlExprNode::ForCtlExprNode( const ForCtlExprNode &other )
-	: ExpressionNode( other ), init( maybeClone( other.init ) ), condition( maybeClone( other.condition ) ), change( maybeClone( other.change ) ) {
-}
-
-ForCtlExprNode::~ForCtlExprNode() {
-	delete init;
-	delete condition;
-	delete change;
-}
-
-Expression *ForCtlExprNode::build() const {
-	// this shouldn't be used!
-	assert( false );
-	return 0;
-}
-
-void ForCtlExprNode::print( std::ostream &os, int indent ) const{
-	os << string( indent,' ' ) << "For Control Expression -- :" << endl;
-
-	os << string( indent + 2, ' ' ) << "initialization:" << endl;
-	if ( init != 0 )
-		init->printList( os, indent + 4 );
-
-	os << string( indent + 2, ' ' ) << "condition: " << endl;
-	if ( condition != 0 )
-		condition->print( os, indent + 4 );
-	os << string( indent + 2, ' ' ) << "increment: " << endl;
-	if ( change != 0 )
-		change->print( os, indent + 4 );
-}
-
-void ForCtlExprNode::printOneLine( std::ostream &, int indent ) const {
-	assert( false );
-}
-
-//##############################################################################
-
-TypeValueNode::TypeValueNode( DeclarationNode *decl ) : decl( decl ) {
-}
-
-TypeValueNode::TypeValueNode( const TypeValueNode &other ) : ExpressionNode( other ), decl( maybeClone( other.decl ) ) {
-}
-
-Expression *TypeValueNode::build() const {
+Expression *build_cast( DeclarationNode *decl_node, ExpressionNode *expr_node ) {
+	Type *targetType = decl_node->buildType();
+	if ( dynamic_cast< VoidType * >( targetType ) ) {
+		delete targetType;
+		return new CastExpr( maybeBuild< Expression >(expr_node) );
+	} else {
+		return new CastExpr( maybeBuild< Expression >(expr_node), targetType );
+	} // if
+}
+
+Expression *build_fieldSel( ExpressionNode *expr_node, NameExpr *member ) {
+	UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), maybeBuild< Expression >(expr_node) );
+	delete member;
+	return ret;
+}
+
+Expression *build_pfieldSel( ExpressionNode *expr_node, NameExpr *member ) {
+	UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
+	deref->get_args().push_back( maybeBuild< Expression >(expr_node) );
+	UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), deref );
+	delete member;
+	return ret;
+}
+
+Expression *build_addressOf( ExpressionNode *expr_node ) {
+		return new AddressExpr( maybeBuild< Expression >(expr_node) );
+}
+Expression *build_sizeOfexpr( ExpressionNode *expr_node ) {
+	return new SizeofExpr( maybeBuild< Expression >(expr_node) );
+}
+Expression *build_sizeOftype( DeclarationNode *decl_node ) {
+	return new SizeofExpr( decl_node->buildType() );
+}
+Expression *build_alignOfexpr( ExpressionNode *expr_node ) {
+	return new AlignofExpr( maybeBuild< Expression >(expr_node) );
+}
+Expression *build_alignOftype( DeclarationNode *decl_node ) {
+	return new AlignofExpr( decl_node->buildType() );
+}
+Expression *build_offsetOf( DeclarationNode *decl_node, NameExpr *member ) {
+	return new UntypedOffsetofExpr( decl_node->buildType(), member->get_name() );
+}
+
+Expression *build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind ) {
+	return new LogicalExpr( notZeroExpr( maybeBuild< Expression >(expr_node1) ), notZeroExpr( maybeBuild< Expression >(expr_node2) ), kind );
+}
+
+Expression *build_unary_val( OperKinds op, ExpressionNode *expr_node ) {
+	std::list< Expression * > args;
+	args.push_back( maybeBuild< Expression >(expr_node) );
+	return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
+}
+Expression *build_unary_ptr( OperKinds op, ExpressionNode *expr_node ) {
+	std::list< Expression * > args;
+	args.push_back( new AddressExpr( maybeBuild< Expression >(expr_node) ) );
+	return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
+}
+Expression *build_binary_val( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
+	std::list< Expression * > args;
+	args.push_back( maybeBuild< Expression >(expr_node1) );
+	args.push_back( maybeBuild< Expression >(expr_node2) );
+	return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
+}
+Expression *build_binary_ptr( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
+	std::list< Expression * > args;
+	args.push_back( new AddressExpr( maybeBuild< Expression >(expr_node1) ) );
+	args.push_back( maybeBuild< Expression >(expr_node2) );
+	return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
+}
+
+Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 ) {
+	return new ConditionalExpr( notZeroExpr( maybeBuild< Expression >(expr_node1) ), maybeBuild< Expression >(expr_node2), maybeBuild< Expression >(expr_node3) );
+}
+
+Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
+	return new CommaExpr( maybeBuild< Expression >(expr_node1), maybeBuild< Expression >(expr_node2) );
+}
+
+Expression *build_attrexpr( NameExpr *var, ExpressionNode * expr_node ) {
+	return new AttrExpr( var, maybeBuild< Expression >(expr_node) );
+}
+Expression *build_attrtype( NameExpr *var, DeclarationNode * decl_node ) {
+	return new AttrExpr( var, decl_node->buildType() );
+}
+
+Expression *build_tuple( ExpressionNode * expr_node ) {
+	TupleExpr *ret = new TupleExpr();
+	buildList( expr_node, ret->get_exprs() );
+	return ret;
+}
+
+Expression *build_func( ExpressionNode * function, ExpressionNode * expr_node ) {
+	std::list< Expression * > args;
+
+	buildList( expr_node, args );
+	return new UntypedExpr( maybeBuild< Expression >(function), args, nullptr );
+}
+
+Expression *build_range( ExpressionNode * low, ExpressionNode *high ) {
+	Expression *low_cexpr = maybeBuild< Expression >( low );
+	Expression *high_cexpr = maybeBuild< Expression >( high );
+	return new RangeExpr( low_cexpr, high_cexpr );
+}
+
+Expression *build_asmexpr( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand ) {
+	return new AsmExpr( maybeBuild< Expression >( inout ), constraint, maybeBuild< Expression >(operand) );
+}
+
+Expression *build_valexpr( StatementNode *s ) {
+	return new UntypedValofExpr( maybeBuild< Statement >(s), nullptr );
+}
+Expression *build_typevalue( DeclarationNode *decl ) {
 	return new TypeExpr( decl->buildType() );
 }
 
-void TypeValueNode::print( std::ostream &os, int indent ) const {
-	os << std::string( indent, ' ' ) << "Type:";
-	get_decl()->print( os, indent + 2);
-}
-
-void TypeValueNode::printOneLine( std::ostream &os, int indent ) const {
-	os << "Type:";
-	get_decl()->print( os, indent + 2);
-}
-
-
-CompoundLiteralNode::CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids ) : type( type ), kids( kids ) {}
-CompoundLiteralNode::CompoundLiteralNode( const CompoundLiteralNode &other ) : ExpressionNode( other ), type( other.type ), kids( other.kids ) {}
-
-CompoundLiteralNode::~CompoundLiteralNode() {
-	delete kids;
-	delete type;
-}
-
-CompoundLiteralNode *CompoundLiteralNode::clone() const {
-	return new CompoundLiteralNode( *this );
-}
-
-void CompoundLiteralNode::print( std::ostream &os, int indent ) const {
-	os << string( indent,' ' ) << "CompoundLiteralNode:" << endl;
-
-	os << string( indent + 2, ' ' ) << "type:" << endl;
-	if ( type != 0 )
-		type->print( os, indent + 4 );
-
-	os << string( indent + 2, ' ' ) << "initialization:" << endl;
-	if ( kids != 0 )
-		kids->printList( os, indent + 4 );
-}
-
-void CompoundLiteralNode::printOneLine( std::ostream &os, int indent ) const {
-	os << "( ";
-	if ( type ) type->print( os );
-	os << ", ";
-	if ( kids ) kids->printOneLine( os );
-	os << ") ";
-}
-
-Expression *CompoundLiteralNode::build() const {
-	Declaration * newDecl = maybeBuild<Declaration>(type); // compound literal type
+Expression *build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids ) {
+	Declaration * newDecl = maybeBuild< Declaration >(decl_node); // compound literal type
 	if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type
-		return new CompoundLiteralExpr( newDeclWithType->get_type(), maybeBuild<Initializer>(kids) );
+		return new CompoundLiteralExpr( newDeclWithType->get_type(), maybeBuild< Initializer >(kids) );
 	// these types do not have associated type information
 	} else if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( newDecl )  ) {
-		return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybeBuild<Initializer>(kids) );
+		return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybeBuild< Initializer >(kids) );
 	} else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( newDecl )  ) {
-		return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybeBuild<Initializer>(kids) );
+		return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybeBuild< Initializer >(kids) );
 	} else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( newDecl )  ) {
-		return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybeBuild<Initializer>(kids) );
+		return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybeBuild< Initializer >(kids) );
 	} else {
 		assert( false );
 	} // if
-}
-
-
-ExpressionNode *flattenCommas( ExpressionNode *list ) {
-	if ( CompositeExprNode *composite = dynamic_cast< CompositeExprNode * >( list ) ) {
-		OperatorNode *op;
-		if ( ( op = dynamic_cast< OperatorNode * >( composite->get_function() )) && ( op->get_type() == OperatorNode::Comma ) ) {
-			if ( ExpressionNode *next = dynamic_cast< ExpressionNode * >( list->get_link() ) )
-				composite->add_arg( next );
-			return flattenCommas( composite->get_args() );
-		} // if
-	} // if
-
-	if ( ExpressionNode *next = dynamic_cast< ExpressionNode * >( list->get_link() ) )
-		list->set_next( flattenCommas( next ) );
-
-	return list;
-}
-
-ExpressionNode *tupleContents( ExpressionNode *tuple ) {
-	if ( CompositeExprNode *composite = dynamic_cast< CompositeExprNode * >( tuple ) ) {
-		OperatorNode *op = 0;
-		if ( ( op = dynamic_cast< OperatorNode * >( composite->get_function() )) && ( op->get_type() == OperatorNode::TupleC ) )
-			return composite->get_args();
-	} // if
-	return tuple;
 }
 
Index: src/Parser/InitializerNode.cc
===================================================================
--- src/Parser/InitializerNode.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/InitializerNode.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:20:24 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jul  4 15:37:15 2016
-// Update Count     : 15
+// Last Modified On : Mon Aug 15 18:27:02 2016
+// Update Count     : 20
 //
 
@@ -25,8 +25,8 @@
 	: expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) {
 	if ( aggrp )
-		kids = dynamic_cast< InitializerNode *>( get_link() );
+		kids = dynamic_cast< InitializerNode * >( get_next() );
 
 	if ( kids != 0 )
-		set_link( 0 );
+		set_last( 0 );
 }
 
@@ -34,8 +34,8 @@
 	: expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) {
 	if ( init != 0 )
-		set_link(init);
+		set_last( init );
 
 	if ( aggrp )
-		kids = dynamic_cast< InitializerNode *>( get_link() );
+		kids = dynamic_cast< InitializerNode * >( get_next() );
 
 	if ( kids != 0 )
@@ -58,5 +58,5 @@
 			while ( curdes != 0) {
 				curdes->printOneLine(os);
-				curdes = (ExpressionNode *)(curdes->get_link());
+				curdes = (ExpressionNode *)(curdes->get_next());
 				if ( curdes ) os << ", ";
 			} // while
@@ -72,5 +72,5 @@
 
 	InitializerNode *moreInit;
-	if  ( get_link() != 0 && ((moreInit = dynamic_cast< InitializerNode * >( get_link() ) ) != 0) )
+	if  ( get_next() != 0 && ((moreInit = dynamic_cast< InitializerNode * >( get_next() ) ) != 0) )
 		moreInit->printOneLine( os );
 }
@@ -82,22 +82,22 @@
 		//assert( next_init() != 0 );
 
-		std::list< Initializer *> initlist;
-		buildList<Initializer, InitializerNode>( next_init(), initlist );
+		std::list< Initializer * > initlist;
+		buildList< Initializer, InitializerNode >( next_init(), initlist );
 
-		std::list< Expression *> designlist;
+		std::list< Expression * > designlist;
 
 		if ( designator != 0 ) {
-			buildList<Expression, ExpressionNode>( designator, designlist );
+			buildList< Expression, ExpressionNode >( designator, designlist );
 		} // if
 
 		return new ListInit( initlist, designlist, maybeConstructed );
 	} else {
-		std::list< Expression *> designators;
+		std::list< Expression * > designators;
 
 		if ( designator != 0 )
-			buildList<Expression, ExpressionNode>( designator, designators );
+			buildList< Expression, ExpressionNode >( designator, designators );
 
 		if ( get_expression() != 0)
-			return new SingleInit( maybeBuild<Expression>( get_expression() ), designators, maybeConstructed );
+			return new SingleInit( maybeBuild< Expression >( get_expression() ), designators, maybeConstructed );
 	} // if
 
Index: src/Parser/ParseNode.cc
===================================================================
--- src/Parser/ParseNode.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/ParseNode.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,180 +10,16 @@
 // Created On       : Sat May 16 13:26:29 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul 15 18:49:25 2016
-// Update Count     : 62
+// Last Modified On : Tue Aug 16 08:42:29 2016
+// Update Count     : 107
 // 
 
-#include <climits>
 #include "ParseNode.h"
 using namespace std;
 
-// Difficult to separate extra parts of constants during lexing because actions are not allow in the middle of patterns:
-//
-//		prefix action constant action suffix
-//
-// Alternatively, breaking a pattern using BEGIN does not work if the following pattern can be empty:
-//
-//		constant BEGIN CONT ...
-//		<CONT>(...)? BEGIN 0 ... // possible empty suffix
-//
-// because the CONT rule is NOT triggered if the pattern is empty. Hence, constants are reparsed here to determine their
-// type.
-
-static inline bool checkU( char c ) { return c == 'u' || c == 'U'; }
-static inline bool checkL( char c ) { return c == 'l' || c == 'L'; }
-static inline bool checkF( char c ) { return c == 'f' || c == 'F'; }
-static inline bool checkD( char c ) { return c == 'd' || c == 'D'; }
-static inline bool checkI( char c ) { return c == 'i' || c == 'I'; }
-static inline bool checkX( char c ) { return c == 'x' || c == 'X'; }
-
-BasicType::Kind literalType( ConstantNode::Type type, string &value ) {
-	BasicType::Kind btype;
-
-	// lexing divides constants into 4 kinds
-	switch ( type ) {
-	  case ConstantNode::Integer:
-		{
-			static const BasicType::Kind kind[2][3] = {
-				{ BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt },
-				{ BasicType::UnsignedInt, BasicType::LongUnsignedInt, BasicType::LongLongUnsignedInt },
-			};
-			bool dec = true, Unsigned = false;			// decimal, unsigned constant
-			int size;									// 0 => int, 1 => long, 2 => long long
-			unsigned long long v;						// converted integral value
-			size_t last = value.length() - 1;			// last character of constant
-
-			if ( value[0] == '0' ) {					// octal/hex constant ?
-				dec = false;
-				if ( last != 0 && checkX( value[1] ) ) { // hex constant ?
-					sscanf( (char *)value.c_str(), "%llx", &v );
-					//printf( "%llx %llu\n", v, v );
-				} else {								// octal constant
-					sscanf( (char *)value.c_str(), "%llo", &v );
-					//printf( "%llo %llu\n", v, v );
-				} // if
-			} else {									// decimal constant ?
-				sscanf( (char *)value.c_str(), "%llu", &v );
-				//printf( "%llu %llu\n", v, v );
-			} // if
-
-			if ( v <= INT_MAX ) {						// signed int
-				size = 0;
-			} else if ( v <= UINT_MAX && ! dec ) {		// unsigned int
-				size = 0;
-				Unsigned = true;						// unsigned
-			} else if ( v <= LONG_MAX ) {				// signed long int
-				size = 1;
-			} else if ( v <= ULONG_MAX && ( ! dec || LONG_MAX == LLONG_MAX ) ) { // signed long int
-				size = 1;
-				Unsigned = true;						// unsigned long int
-			} else if ( v <= LLONG_MAX ) {				// signed long long int
-				size = 2;
-			} else {									// unsigned long long int
-				size = 2;
-				Unsigned = true;						// unsigned long long int
-			} // if
-
-			if ( checkU( value[last] ) ) {				// suffix 'u' ?
-				Unsigned = true;
-				if ( last > 0 && checkL( value[ last - 1 ] ) ) { // suffix 'l' ?
-					size = 1;
-					if ( last > 1 && checkL( value[ last - 2 ] ) ) { // suffix 'll' ?
-						size = 2;
-					} // if
-				} // if
-			} else if ( checkL( value[ last ] ) ) {		// suffix 'l' ?
-				size = 1;
-				if ( last > 0 && checkL( value[ last - 1 ] ) ) { // suffix 'll' ?
-					size = 2;
-					if ( last > 1 && checkU( value[ last - 2 ] ) ) { // suffix 'u' ?
-						Unsigned = true;
-					} // if
-				} else {
-					if ( last > 0 && checkU( value[ last - 1 ] ) ) { // suffix 'u' ?
-						Unsigned = true;
-					} // if
-				} // if
-			} // if
-			btype = kind[Unsigned][size];				// lookup constant type
-			break;
-		}
-	  case ConstantNode::Float:
-		{
-			//long double v;
-			static const BasicType::Kind kind[2][3] = {
-				{ BasicType::Float, BasicType::Double, BasicType::LongDouble },
-				{ BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex },
-			};
-			bool complx = false;						// real, complex
-			int size = 1;								// 0 => float, 1 => double (default), 2 => long double
-			// floating-point constant has minimum of 2 characters: 1. or .1
-			size_t last = value.length() - 1;
-
-			if ( checkI( value[last] ) ) {				// imaginary ?
-				complx = true;
-				last -= 1;								// backup one character
-			} // if
-
-			//sscanf( (char *)value.c_str(), "%Lf", &v );
-			//printf( "%s %24.22Lf %Lf\n", value.c_str(), v, v );
-
-			if ( checkF( value[last] ) ) {				// float ?
-				size = 0;
-			} else if ( checkD( value[last] ) ) {		// double ?
-				size = 1;
-			} else if ( checkL( value[last] ) ) {		// long double ?
-				size = 2;
-			} // if
-			if ( ! complx && checkI( value[last - 1] ) ) { // imaginary ?
-				complx = true;
-			} // if
-			btype = kind[complx][size];					// lookup constant type
-			break;
-		}
-	  case ConstantNode::Character:
-		btype = BasicType::Char;						// default
-		if ( string( "LUu" ).find( value[0] ) != string::npos ) {
-			// ???
-		} // if
-		break;
-	  case ConstantNode::String:
-		assert( false );
-		// array of char
-		if ( string( "LUu" ).find( value[0] ) != string::npos ) {
-			if ( value[0] == 'u' && value[1] == '8' ) {
-				// ???
-			} else {
-				// ???
-			} // if
-		} // if
-		break;
-	} // switch
-	return btype;
-} // literalType
-
-
-ConstantNode *makeConstant( ConstantNode::Type type, std::string *str ) {
-	::Type::Qualifiers emptyQualifiers;					// no qualifiers on constants
-	return new ConstantNode( new ConstantExpr( Constant( new BasicType( emptyQualifiers, literalType( type, *str ) ), *str ), nullptr ) );
-}
-
-ConstantNode *makeConstantStr( ConstantNode::Type type, std::string *str ) {
-	::Type::Qualifiers emptyQualifiers;					// no qualifiers on constants
-	// string should probably be a primitive type
-	ArrayType *at = new ArrayType( emptyQualifiers, new BasicType( emptyQualifiers, BasicType::Char ),
-								   new ConstantExpr(
-									   Constant( new BasicType( emptyQualifiers, BasicType::UnsignedInt ),
-												 toString( str->size()+1-2 ) ) ),  // +1 for '\0' and -2 for '"'
-								   false, false );
-	return new ConstantNode( new ConstantExpr( Constant( at, *str ), nullptr ) );
-}
-
-
-// Builder
 int ParseNode::indent_by = 4;
 
-ParseNode::ParseNode() : next( 0 ) {};
-ParseNode::ParseNode( const string *name ) : name( *name ), next( 0 ) { delete name; }
-ParseNode::ParseNode( const string &name ) : name( name ), next( 0 ) { }
+ParseNode::ParseNode() : next( nullptr ) {};
+ParseNode::ParseNode( const string *name ) : name( *name ), next( nullptr ) { delete name; }
+ParseNode::ParseNode( const string &name ) : name( name ), next( nullptr ) { }
 
 ParseNode::~ParseNode() {
@@ -194,17 +30,13 @@
 	ParseNode *current = this;
 
-	while ( current->get_link() != 0 )
-	current = current->get_link();
-
+	while ( current->get_next() != 0 )
+	current = current->get_next();
 	return current;
 }
 
-ParseNode *ParseNode::set_link( ParseNode *next_ ) {
+ParseNode *ParseNode::set_last( ParseNode *next_ ) {
 	if ( next_ != 0 ) get_last()->next = next_;
 	return this;
 }
-
-void ParseNode::print( std::ostream &os, int indent ) const {}
-
 
 void ParseNode::printList( std::ostream &os, int indent ) const {
@@ -216,17 +48,4 @@
 }
 
-ParseNode &ParseNode::operator,( ParseNode &p ) {
-	set_link( &p );
-
-	return *this;
-}
-
-ParseNode *mkList( ParseNode &pn ) {
-	// it just relies on `operator,' to take care of the "arguments" and provides a nice interface to an awful-looking
-	// address-of, rendering, for example (StatementNode *)(&(*$5 + *$7)) into (StatementNode *)mkList(($5, $7))
-	// (although "nice" is probably not the word)
-	return &pn;
-}
-
 // Local Variables: //
 // tab-width: 4 //
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/ParseNode.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 20:50:21 2016
-// Update Count     : 261
+// Last Modified On : Tue Aug 16 08:37:47 2016
+// Update Count     : 527
 //
 
@@ -22,21 +22,20 @@
 #include <memory>
 
-#include "Common/utility.h"
 #include "Parser/LinkageSpec.h"
 #include "SynTree/Type.h"
 #include "SynTree/Expression.h"
-//#include "SynTree/Declaration.h"
+#include "SynTree/Statement.h"
+#include "SynTree/Label.h"
+#include "Common/utility.h"
 #include "Common/UniqueName.h"
-#include "SynTree/Label.h"
-
-class ExpressionNode;
-class CompositeExprNode;
-class CommaExprNode;
+
 class StatementNode;
 class CompoundStmtNode;
 class DeclarationNode;
+class ExpressionNode;
 class InitializerNode;
 
-// Builder
+//##############################################################################
+
 class ParseNode {
   public:
@@ -45,57 +44,78 @@
 	ParseNode( const std::string & );					// for copy constructing subclasses
 	virtual ~ParseNode();
-
-	ParseNode *get_link() const { return next; }
+	virtual ParseNode *clone() const { assert( false ); return nullptr; };
+
+	ParseNode *get_next() const { return next; }
+	ParseNode *set_next( ParseNode *newlink ) { next = newlink; return this; }
 	ParseNode *get_last();
-	ParseNode *set_link( ParseNode * );
-	void set_next( ParseNode *newlink ) { next = newlink; }
-
-	virtual ParseNode *clone() const { return 0; };
+	ParseNode *set_last( ParseNode * );
 
 	const std::string &get_name() const { return name; }
 	void set_name( const std::string &newValue ) { name = newValue; }
 
-	virtual void print( std::ostream &, int indent = 0 ) const;
-	virtual void printList( std::ostream &, int indent = 0 ) const;
-
-	ParseNode &operator,( ParseNode &);
-  protected:
+	virtual void print( std::ostream &os, int indent = 0 ) const {}
+	virtual void printList( std::ostream &os, int indent = 0 ) const;
+  private:
+	static int indent_by;
+
+	ParseNode *next;
 	std::string name;
-	static int indent_by;
-	ParseNode *next;
-};
-
-ParseNode *mkList( ParseNode & );
+}; // ParseNode
+
+//##############################################################################
+
+class InitializerNode : public ParseNode {
+  public:
+	InitializerNode( ExpressionNode *, bool aggrp = false,  ExpressionNode *des = 0 );
+	InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode *des = 0 );
+	~InitializerNode();
+
+	ExpressionNode *get_expression() const { return expr; }
+
+	InitializerNode *set_designators( ExpressionNode *des ) { designator = des; return this; }
+	ExpressionNode *get_designators() const { return designator; }
+
+	InitializerNode *set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }
+	bool get_maybeConstructed() const { return maybeConstructed; }
+
+	InitializerNode *next_init() const { return kids; }
+
+	void print( std::ostream &os, int indent = 0 ) const;
+	void printOneLine( std::ostream & ) const;
+
+	virtual Initializer *build() const;
+  private:
+	ExpressionNode *expr;
+	bool aggregate;
+	ExpressionNode *designator;							// may be list
+	InitializerNode *kids;
+	bool maybeConstructed;
+};
+
+//##############################################################################
 
 class ExpressionNode : public ParseNode {
   public:
-	ExpressionNode();
-	ExpressionNode( const std::string * );
+	ExpressionNode( Expression * expr = nullptr ) : expr( expr ) {}
+	ExpressionNode( Expression * expr, const std::string *name ) : ParseNode( name ), expr( expr ) {}
 	ExpressionNode( const ExpressionNode &other );
-	virtual ~ExpressionNode() { delete argName; } // cannot delete argName because it might be referenced elsewhere
-
-	virtual ExpressionNode *clone() const = 0;
-
-	virtual CommaExprNode *add_to_list( ExpressionNode * );
-
-	ExpressionNode *get_argName() const { return argName; }
-	ExpressionNode *set_argName( const std::string *aName );
-	ExpressionNode *set_argName( ExpressionNode *aDesignator );
+	virtual ~ExpressionNode() {}
+
+	virtual ExpressionNode *clone() const { assert( false ); return nullptr; }
+
 	bool get_extension() const { return extension; }
 	ExpressionNode *set_extension( bool exten ) { extension = exten; return this; }
 
-	virtual void print( std::ostream &, int indent = 0) const = 0;
-	virtual void printOneLine( std::ostream &, int indent = 0) const = 0;
-
-	virtual Expression *build() const = 0;
-  protected:
-	void printDesignation ( std::ostream &, int indent = 0) const;
-  private:
-	ExpressionNode *argName = 0;
+	virtual void print( std::ostream &os, int indent = 0 ) const {}
+	virtual void printOneLine( std::ostream &os, int indent = 0 ) const {}
+
+	virtual Expression *build() const { return expr; }
+  private:
 	bool extension = false;
+	Expression *expr;
 };
 
 template< typename T >
-struct maybeBuild_t<Expression, T> {
+struct maybeBuild_t< Expression, T > {
 	static inline Expression * doit( const T *orig ) {
 		if ( orig ) {
@@ -104,239 +124,59 @@
 			return p;
 		} else {
-			return 0;
+			return nullptr;
 		} // if
 	}
 };
 
-// NullExprNode is used in tuples as a place-holder where a tuple component is omitted e.g., [ 2, , 3 ]
-class NullExprNode : public ExpressionNode {
-  public:
-	NullExprNode();
-
-	virtual NullExprNode *clone() const;
-
-	virtual void print( std::ostream &, int indent = 0) const;
-	virtual void printOneLine( std::ostream &, int indent = 0) const;
-
-	virtual Expression *build() const;
-};
-
-class ConstantNode : public ExpressionNode {
-  public:
-	enum Type { Integer, Float, Character, String };
-
-	ConstantNode( ConstantExpr * );
-	ConstantNode( const ConstantNode &other ) : expr( other.expr->clone() ) {};
-	~ConstantNode() { delete expr; }
-
-	virtual ConstantNode *clone() const { return new ConstantNode( *this ); }
-	virtual void print( std::ostream &, int indent = 0) const;
-	virtual void printOneLine( std::ostream &, int indent = 0) const;
-
-	ConstantNode *appendstr( const std::string *newValue );
-
-	Expression *build() const;
-  private:
-	ConstantExpr *expr;
-};
-
-ConstantNode *makeConstant( ConstantNode::Type, std::string * );
-ConstantNode *makeConstantStr( ConstantNode::Type type, std::string *str );
-
-class VarRefNode : public ExpressionNode {
-  public:
-	VarRefNode();
-	VarRefNode( const std::string *, bool isLabel = false );
-	VarRefNode( const VarRefNode &other );
-
-	virtual Expression *build() const ;
-
-	virtual VarRefNode *clone() const { return new VarRefNode( *this ); }
-
-	virtual void print( std::ostream &, int indent = 0 ) const;
-	virtual void printOneLine( std::ostream &, int indent = 0 ) const;
-  private:
-	bool isLabel;
-};
-
-class DesignatorNode : public ExpressionNode {
-  public:
-	DesignatorNode( ExpressionNode *expr, bool isArrayIndex = false );
-	DesignatorNode( const DesignatorNode &other );
-
-	virtual Expression *build() const ;
-	virtual DesignatorNode *clone() const { return new DesignatorNode( *this ); }
-
-	virtual void print( std::ostream &, int indent = 0 ) const;
-	virtual void printOneLine( std::ostream &, int indent = 0 ) const;
-  private:
-	bool isArrayIndex;
-};
-
-class TypeValueNode : public ExpressionNode {
-  public:
-	TypeValueNode( DeclarationNode * );
-	TypeValueNode( const TypeValueNode &other );
-
-	DeclarationNode *get_decl() const { return decl; }
-
-	virtual Expression *build() const ;
-
-	virtual TypeValueNode *clone() const { return new TypeValueNode( *this ); }
-
-	virtual void print( std::ostream &, int indent = 0) const;
-	virtual void printOneLine( std::ostream &, int indent = 0) const;
-  private:
-	DeclarationNode *decl;
-};
-
-class OperatorNode : public ExpressionNode {
-  public:
-	enum Type { TupleC, Comma, TupleFieldSel, // n-adic
-				// triadic
-				Cond, NCond,
-				// diadic
-				SizeOf, AlignOf, OffsetOf, Attr, Plus, Minus, Mul, Div, Mod, Or, And,
-				BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq,
-				Assign, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
-				Index, FieldSel, PFieldSel, Range,
-				// monadic
-				UnPlus, UnMinus, AddressOf, PointTo, Neg, BitNeg, Incr, IncrPost, Decr, DecrPost, LabelAddress,
-				Ctor, Dtor,
-	};
-
-	OperatorNode( Type t );
-	OperatorNode( const OperatorNode &other );
-	virtual ~OperatorNode();
-
-	virtual OperatorNode *clone() const { return new OperatorNode( *this ); }
-
-	Type get_type() const;
-	const char *get_typename() const;
-
-	virtual void print( std::ostream &, int indent = 0) const;
-	virtual void printOneLine( std::ostream &, int indent = 0) const;
-
-	virtual Expression *build() const { return 0; }
-  private:
-	Type type;
-};
-
-class CompositeExprNode : public ExpressionNode {
-  public:
-	CompositeExprNode();
-	CompositeExprNode( const std::string * );
-	CompositeExprNode( ExpressionNode *f, ExpressionNode *args = 0 );
-	CompositeExprNode( ExpressionNode *f, ExpressionNode *arg1, ExpressionNode *arg2 );
-	CompositeExprNode( const CompositeExprNode &other );
-	virtual ~CompositeExprNode();
-
-	virtual CompositeExprNode *clone() const { return new CompositeExprNode( *this ); }
-	virtual Expression *build() const;
-
-	virtual void print( std::ostream &, int indent = 0) const;
-	virtual void printOneLine( std::ostream &, int indent = 0) const;
-
-	void set_function( ExpressionNode * );
-	void set_args( ExpressionNode * );
-
-	void add_arg( ExpressionNode * );
-
-	ExpressionNode *get_function() const;
-	ExpressionNode *get_args() const;
-  private:
-	ExpressionNode *function;
-	ExpressionNode *arguments;
-};
-
-class AsmExprNode : public ExpressionNode {
-  public:
-	AsmExprNode();
-	AsmExprNode( ExpressionNode *inout, ConstantNode *constraint, ExpressionNode *operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
-	virtual ~AsmExprNode() { delete inout; delete constraint; delete operand; }
-
-	virtual AsmExprNode *clone() const { return new AsmExprNode( *this ); }
-	virtual Expression *build() const;
-
-	virtual void print( std::ostream &, int indent = 0) const;
-	virtual void printOneLine( std::ostream &, int indent = 0) const;
-
-	ExpressionNode *get_inout() const { return inout; };
-	void set_inout( ExpressionNode *newValue ) { inout = newValue; }
-
-	ConstantNode *get_constraint() const { return constraint; };
-	void set_constraint( ConstantNode *newValue ) { constraint = newValue; }
-
-	ExpressionNode *get_operand() const { return operand; };
-	void set_operand( ExpressionNode *newValue ) { operand = newValue; }
-  private:
-	ExpressionNode *inout;
-	ConstantNode *constraint;
-	ExpressionNode *operand;
-};
-
-class LabelNode : public ExpressionNode {
-  public:
-	virtual Expression *build() const { return NULL; }
-	virtual LabelNode *clone() const { return new LabelNode( *this ); }
-
-	virtual void print( std::ostream &, int indent = 0) const;
-	virtual void printOneLine( std::ostream &, int indent = 0) const;
-
-	const std::list< Label > &get_labels() const { return labels; };
-	void append_label( std::string *label ) { labels.push_back( *label ); delete label; }
-  private:
+enum class OperKinds {
+	// diadic
+	SizeOf, AlignOf, OffsetOf, Plus, Minus, Mul, Div, Mod, Or, And,
+	BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq,
+	Assign, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
+	Index, Range,
+	// monadic
+	UnPlus, UnMinus, AddressOf, PointTo, Neg, BitNeg, Incr, IncrPost, Decr, DecrPost, LabelAddress,
+	Ctor, Dtor,
+};
+
+struct LabelNode {
 	std::list< Label > labels;
 };
 
-class CommaExprNode : public CompositeExprNode {
-  public:
-	CommaExprNode();
-	CommaExprNode( ExpressionNode * );
-	CommaExprNode( ExpressionNode *, ExpressionNode * );
-	CommaExprNode( const CommaExprNode &other );
-
-	virtual CommaExprNode *add_to_list( ExpressionNode * );
-	virtual CommaExprNode *clone() const { return new CommaExprNode( *this ); }
-};
-
-class ForCtlExprNode : public ExpressionNode {
-  public:
-	ForCtlExprNode( ParseNode *, ExpressionNode *, ExpressionNode * ) throw ( SemanticError );
-	ForCtlExprNode( const ForCtlExprNode &other );
-	~ForCtlExprNode();
-
-	StatementNode *get_init() const { return init; }
-	ExpressionNode *get_condition() const { return condition; }
-	ExpressionNode *get_change() const { return change; }
-
-	virtual ForCtlExprNode *clone() const { return new ForCtlExprNode( *this ); }
-	virtual Expression *build() const;
-
-	virtual void print( std::ostream &, int indent = 0 ) const;
-	virtual void printOneLine( std::ostream &, int indent = 0 ) const;
-  private:
-	StatementNode *init;
-	ExpressionNode *condition;
-	ExpressionNode *change;
-};
-
-class ValofExprNode : public ExpressionNode {
-  public:
-	ValofExprNode();
-	ValofExprNode( StatementNode *s = 0 );
-	ValofExprNode( const ValofExprNode &other );
-	~ValofExprNode();
-
-	virtual ValofExprNode *clone() const { return new ValofExprNode( *this ); }
-
-	StatementNode *get_body() const { return body; }
-	void print( std::ostream &, int indent = 0 ) const;
-	void printOneLine( std::ostream &, int indent = 0 ) const;
-	Expression *build() const;
-
-  private:
-	StatementNode *body;
-};
+Expression *build_constantInteger( std::string &str );
+Expression *build_constantFloat( std::string &str );
+Expression *build_constantChar( std::string &str );
+ConstantExpr *build_constantStr( std::string &str );
+
+NameExpr *build_varref( const std::string *name, bool labelp = false );
+Expression *build_typevalue( DeclarationNode *decl );
+
+Expression *build_cast( DeclarationNode * decl_node, ExpressionNode *expr_node );
+Expression *build_fieldSel( ExpressionNode *expr_node, NameExpr *member );
+Expression *build_pfieldSel( ExpressionNode *expr_node, NameExpr *member );
+Expression *build_addressOf( ExpressionNode *expr_node );
+Expression *build_sizeOfexpr( ExpressionNode *expr_node );
+Expression *build_sizeOftype( DeclarationNode *decl_node );
+Expression *build_alignOfexpr( ExpressionNode *expr_node );
+Expression *build_alignOftype( DeclarationNode *decl_node );
+Expression *build_offsetOf( DeclarationNode *decl_node, NameExpr *member );
+Expression *build_and( ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
+Expression *build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind );
+Expression *build_unary_val( OperKinds op, ExpressionNode *expr_node );
+Expression *build_unary_ptr( OperKinds op, ExpressionNode *expr_node );
+Expression *build_binary_val( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
+Expression *build_binary_ptr( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
+Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 );
+Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
+Expression *build_attrexpr( NameExpr *var, ExpressionNode * expr_node );
+Expression *build_attrtype( NameExpr *var, DeclarationNode * decl_node );
+Expression *build_tuple( ExpressionNode * expr_node = 0 );
+Expression *build_func( ExpressionNode * function, ExpressionNode * expr_node );
+Expression *build_range( ExpressionNode * low, ExpressionNode *high );
+Expression *build_asmexpr( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand );
+Expression *build_valexpr( StatementNode *s );
+Expression *build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids );
+
+//##############################################################################
 
 class TypeData;
@@ -386,4 +226,8 @@
 	static DeclarationNode *newBuiltinType( BuiltinType );
 
+	DeclarationNode();
+	~DeclarationNode();
+	DeclarationNode *clone() const;
+
 	DeclarationNode *addQualifiers( DeclarationNode *);
 	DeclarationNode *copyStorageClasses( DeclarationNode *);
@@ -401,5 +245,5 @@
 	DeclarationNode *addNewArray( DeclarationNode *array );
 	DeclarationNode *addParamList( DeclarationNode *list );
-	DeclarationNode *addIdList( DeclarationNode *list );       // old-style functions
+	DeclarationNode *addIdList( DeclarationNode *list ); // old-style functions
 	DeclarationNode *addInitializer( InitializerNode *init );
 
@@ -412,7 +256,6 @@
 	DeclarationNode *appendList( DeclarationNode * );
 
-	DeclarationNode *clone() const;
-	void print( std::ostream &, int indent = 0 ) const;
-	void printList( std::ostream &, int indent = 0 ) const;
+	void print( std::ostream &os, int indent = 0 ) const;
+	void printList( std::ostream &os, int indent = 0 ) const;
 
 	Declaration *build() const;
@@ -427,7 +270,4 @@
 	bool get_extension() const { return extension; }
 	DeclarationNode *set_extension( bool exten ) { extension = exten; return this; }
-
-	DeclarationNode();
-	~DeclarationNode();
   private:
 	StorageClass buildStorageClass() const;
@@ -448,154 +288,72 @@
 }; // DeclarationNode
 
+Type *buildType( TypeData *type );
+
+//##############################################################################
+
 class StatementNode : public ParseNode {
   public:
-	enum Type { Exp,   If,        Switch,  Case,    Default,  Choose,   Fallthru,
-				While, Do,        For,
-				Goto,  Continue,  Break,   Return,  Throw,
-				Try,   Catch,     Finally, Asm,
-				Decl
-	};
-
-	StatementNode();
-	StatementNode( const std::string *name );
-	StatementNode( Type t, ExpressionNode *control = 0, StatementNode *block = 0 );
-	StatementNode( Type t, std::string *target );
+	StatementNode() { stmt = nullptr; }
+	StatementNode( Statement *stmt ) : stmt( stmt ) {}
 	StatementNode( DeclarationNode *decl );
-
-	~StatementNode();
-
-	static StatementNode *newCatchStmt( DeclarationNode *d = 0, StatementNode *s = 0, bool catchRestP = false );
-
-	StatementNode *set_block( StatementNode *b ) {	block = b; return this; }
-	StatementNode *get_block() const { return block; }
-
-	void set_control( ExpressionNode *c ) { control = c; }
-	ExpressionNode *get_control() const { return control; }
-
-	StatementNode::Type get_type() const { return type; }
-
-	StatementNode *add_label( const std::string * );
-	const std::list<std::string> &get_labels() const { return labels; }
-
-	void addDeclaration( DeclarationNode *newDecl ) { decl = newDecl; }
-	void setCatchRest( bool newVal ) { isCatchRest = newVal; }
-
-	std::string get_target() const;
-
-	StatementNode *add_controlexp( ExpressionNode * );
-	StatementNode *append_block( StatementNode * );
-	StatementNode *append_last_case( StatementNode * );
-
-	void print( std::ostream &, int indent = 0) const;
-	virtual StatementNode *clone() const;
-	virtual Statement *build() const;
-  private:
-	static const char *StType[];
-	Type type;
-	ExpressionNode *control;
-	StatementNode *block;
-	std::list<std::string> labels;
-	std::string *target;				// target label for jump statements
-	DeclarationNode *decl;
-	bool isCatchRest;
+	virtual ~StatementNode() {}
+
+	virtual StatementNode *clone() const { assert( false ); return nullptr; }
+	virtual Statement *build() const { return stmt; }
+
+	virtual StatementNode *add_label( const std::string * name ) {
+		stmt->get_labels().emplace_back( *name );
+		return this;
+	}
+
+	virtual StatementNode *append_last_case( StatementNode * );
+
+	virtual void print( std::ostream &os, int indent = 0 ) {}
+	virtual void printList( std::ostream &os, int indent = 0 ) {}
+  private:
+	Statement *stmt;
 }; // StatementNode
 
-class CompoundStmtNode : public StatementNode {
-  public:
-	CompoundStmtNode();
-	CompoundStmtNode( const std::string * );
-	CompoundStmtNode( StatementNode * );
-	~CompoundStmtNode();
-
-	void add_statement( StatementNode * );
-
-	void print( std::ostream &, int indent = 0 ) const;
-	virtual Statement *build() const;
-  private:
-	StatementNode *first, *last;
-};
-
-class AsmStmtNode : public StatementNode {
-  public:
-	AsmStmtNode( Type, bool voltile, ConstantNode *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ConstantNode *clobber = 0, LabelNode *gotolabels = 0 );
-	~AsmStmtNode();
-
-	void print( std::ostream &, int indent = 0 ) const;
-	Statement *build() const;
-  private:
-	bool voltile;
-	ConstantNode *instruction;
-	ExpressionNode *output, *input;
-	ConstantNode *clobber;
-	std::list< Label > gotolabels;
-};
-
-class NullStmtNode : public CompoundStmtNode {
-  public:
-	Statement *build() const;
-	void print( std::ostream &, int indent = 0 ) const;
-};
-
-class InitializerNode : public ParseNode {
-  public:
-	InitializerNode( ExpressionNode *, bool aggrp = false,  ExpressionNode *des = 0 );
-	InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode *des = 0 );
-	~InitializerNode();
-
-	ExpressionNode *get_expression() const { return expr; }
-
-	InitializerNode *set_designators( ExpressionNode *des ) { designator = des; return this; }
-	ExpressionNode *get_designators() const { return designator; }
-
-	InitializerNode *set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }
-	bool get_maybeConstructed() const { return maybeConstructed; }
-
-	InitializerNode *next_init() const { return kids; }
-
-	void print( std::ostream &, int indent = 0 ) const;
-	void printOneLine( std::ostream & ) const;
-
-	virtual Initializer *build() const;
-  private:
-	ExpressionNode *expr;
-	bool aggregate;
-	ExpressionNode *designator; // may be list
-	InitializerNode *kids;
-	bool maybeConstructed;
-};
-
-class CompoundLiteralNode : public ExpressionNode {
-  public:
-	CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids );
-	CompoundLiteralNode( const CompoundLiteralNode &type );
-	~CompoundLiteralNode();
-
-	virtual CompoundLiteralNode *clone() const;
-
-	DeclarationNode *get_type() const { return type; }
-	CompoundLiteralNode *set_type( DeclarationNode *t ) { type = t; return this; }
-
-	InitializerNode *get_initializer() const { return kids; }
-	CompoundLiteralNode *set_initializer( InitializerNode *k ) { kids = k; return this; }
-
-	void print( std::ostream &, int indent = 0 ) const;
-	void printOneLine( std::ostream &, int indent = 0 ) const;
-
-	virtual Expression *build() const;
-  private:
-	DeclarationNode *type;
-	InitializerNode *kids;
-};
+Statement *build_expr( ExpressionNode *ctl );
+
+struct ForCtl {
+	ForCtl( ExpressionNode *expr, ExpressionNode *condition, ExpressionNode *change ) :
+		init( new StatementNode( build_expr( expr ) ) ), condition( condition ), change( change ) {}
+	ForCtl( DeclarationNode *decl, ExpressionNode *condition, ExpressionNode *change ) :
+		init( new StatementNode( decl ) ), condition( condition ), change( change ) {}
+
+	StatementNode *init;
+	ExpressionNode *condition;
+	ExpressionNode *change;
+};
+
+Statement *build_if( ExpressionNode *ctl, StatementNode *then_stmt, StatementNode *else_stmt );
+Statement *build_switch( ExpressionNode *ctl, StatementNode *stmt );
+Statement *build_case( ExpressionNode *ctl );
+Statement *build_default();
+Statement *build_while( ExpressionNode *ctl, StatementNode *stmt, bool kind = false );
+Statement *build_for( ForCtl *forctl, StatementNode *stmt );
+Statement *build_branch( std::string identifier, BranchStmt::Type kind );
+Statement *build_computedgoto( ExpressionNode *ctl );
+Statement *build_return( ExpressionNode *ctl );
+Statement *build_throw( ExpressionNode *ctl );
+Statement *build_try( StatementNode *try_stmt, StatementNode *catch_stmt, StatementNode *finally_stmt );
+Statement *build_catch( DeclarationNode *decl, StatementNode *stmt, bool catchAny = false );
+Statement *build_finally( StatementNode *stmt );
+Statement *build_compound( StatementNode *first );
+Statement *build_asmstmt( bool voltile, ConstantExpr *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ExpressionNode *clobber = 0, LabelNode *gotolabels = 0 );
+
+//##############################################################################
 
 template< typename SynTreeType, typename NodeType >
-void buildList( const NodeType *firstNode, std::list< SynTreeType *> &outputList ) {
+void buildList( const NodeType *firstNode, std::list< SynTreeType * > &outputList ) {
 	SemanticError errors;
-	std::back_insert_iterator< std::list< SynTreeType *> > out( outputList );
+	std::back_insert_iterator< std::list< SynTreeType * > > out( outputList );
 	const NodeType *cur = firstNode;
 
 	while ( cur ) {
 		try {
-//			SynTreeType *result = dynamic_cast< SynTreeType *>( maybeBuild<typename std::result_of<decltype(&NodeType::build)(NodeType)>::type>( cur ) );
-			SynTreeType *result = dynamic_cast< SynTreeType *>( maybeBuild<typename std::pointer_traits<decltype(cur->build())>::element_type>( cur ) );
+//			SynTreeType *result = dynamic_cast< SynTreeType * >( maybeBuild< typename std::result_of< decltype(&NodeType::build)(NodeType)>::type >( cur ) );
+			SynTreeType *result = dynamic_cast< SynTreeType * >( maybeBuild< typename std::pointer_traits< decltype(cur->build())>::element_type >( cur ) );
 			if ( result ) {
 				*out++ = result;
@@ -605,5 +363,5 @@
 			errors.append( e );
 		} // try
-		cur = dynamic_cast< NodeType *>( cur->get_link() );
+		cur = dynamic_cast< NodeType * >( cur->get_next() );
 	} // while
 	if ( ! errors.isEmpty() ) {
@@ -614,10 +372,6 @@
 // in DeclarationNode.cc
 void buildList( const DeclarationNode *firstNode, std::list< Declaration * > &outputList );
-void buildList( const DeclarationNode *firstNode, std::list< DeclarationWithType *> &outputList );
+void buildList( const DeclarationNode *firstNode, std::list< DeclarationWithType * > &outputList );
 void buildTypeList( const DeclarationNode *firstNode, std::list< Type * > &outputList );
-
-// in ExpressionNode.cc
-ExpressionNode *flattenCommas( ExpressionNode *list );
-ExpressionNode *tupleContents( ExpressionNode *tuple );
 
 #endif // PARSENODE_H
Index: src/Parser/Parser.cc
===================================================================
--- src/Parser/Parser.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/Parser.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 14:54:28 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Mar 21 18:04:47 2016
-// Update Count     : 5
+// Last Modified On : Mon Aug 15 17:44:22 2016
+// Update Count     : 7
 // 
 
Index: src/Parser/Parser.h
===================================================================
--- src/Parser/Parser.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/Parser.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 14:56:50 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat May 16 14:58:56 2015
-// Update Count     : 2
+// Last Modified On : Mon Aug 15 16:33:22 2016
+// Update Count     : 3
 //
 
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/StatementNode.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 14:59:41 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:21:02 2016
-// Update Count     : 133
+// Last Modified On : Mon Aug 15 20:47:11 2016
+// Update Count     : 322
 //
 
@@ -26,402 +26,169 @@
 using namespace std;
 
-const char *StatementNode::StType[] = {
-	"Exp",   "If",       "Switch", "Case",    "Default",  "Choose",   "Fallthru",
-	"While", "Do",       "For",
-	"Goto",  "Continue", "Break",  "Return",  "Throw",
-	"Try",   "Catch",    "Finally", "Asm",
-	"Decl"
-};
 
-StatementNode::StatementNode() : ParseNode(), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {}
-
-StatementNode::StatementNode( const string *name ) : ParseNode( name ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {}
-
-StatementNode::StatementNode( DeclarationNode *decl ) : type( Decl ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), isCatchRest ( false ) {
+StatementNode::StatementNode( DeclarationNode *decl ) {
 	if ( decl ) {
-		if ( DeclarationNode *agg = decl->extractAggregate() ) {
-			this->decl = agg;
-			StatementNode *nextStmt = new StatementNode;
-			nextStmt->type = Decl;
-			nextStmt->decl = decl;
-			next = nextStmt;
-			if ( decl->get_link() ) {
-				next->set_next( new StatementNode( dynamic_cast< DeclarationNode* >( decl->get_link() ) ) );
+		DeclarationNode *agg = decl->extractAggregate();
+		if ( agg ) {
+			StatementNode *nextStmt = new StatementNode( new DeclStmt( noLabels, maybeBuild< Declaration >( decl ) ) );
+			set_next( nextStmt );
+			if ( decl->get_next() ) {
+				get_next()->set_next( new StatementNode( dynamic_cast< DeclarationNode * >(decl->get_next()) ) );
 				decl->set_next( 0 );
 			} // if
 		} else {
-			if ( decl->get_link() ) {
-				next = new StatementNode( dynamic_cast< DeclarationNode* >( decl->get_link() ) );
+			if ( decl->get_next() ) {
+				set_next(new StatementNode( dynamic_cast< DeclarationNode * >( decl->get_next() ) ) );
 				decl->set_next( 0 );
 			} // if
-			this->decl = decl;
+			agg = decl;
 		} // if
+		stmt = new DeclStmt( noLabels, maybeBuild< Declaration >(agg) );
+	} else {
+		assert( false );
 	} // if
 }
 
-StatementNode::StatementNode( Type t, ExpressionNode *ctrl_label, StatementNode *block ) : type( t ), control( ctrl_label ), block( block ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {
-	this->control = ( t == Default ) ? 0 : control;
-}
-
-StatementNode::StatementNode( Type t, string *target ) : type( t ), control( 0 ), block( 0 ), labels( 0 ), target( target ), decl( 0 ), isCatchRest ( false ) {}
-
-StatementNode::~StatementNode() {
-	delete control;
-	delete block;
-	delete target;
-	delete decl;
-}
-
-StatementNode * StatementNode::newCatchStmt( DeclarationNode *d, StatementNode *s, bool catchRestP ) {
-	StatementNode *ret = new StatementNode( StatementNode::Catch, 0, s );
-	ret->addDeclaration( d );
-	ret->setCatchRest( catchRestP );
-
-	return ret;
-}
-
-std::string StatementNode::get_target() const{
-	if ( target )
-		return *target;
-
-	return string("");
-}
-
-StatementNode * StatementNode::clone() const {
-	StatementNode *newnode = new StatementNode( type, maybeClone( control ), maybeClone( block ) );
-	if ( target ) {
-		newnode->target = new string( *target );
-	} else {
-		newnode->target = 0;
-	} // if
-	newnode->decl = maybeClone( decl );
-	return newnode;
-}
-
-StatementNode *StatementNode::add_label( const std::string *l ) {
-	if ( l != 0 ) {
-		labels.push_front( *l );
-		delete l;
-	} // if
+StatementNode *StatementNode::append_last_case( StatementNode *stmt ) {
+	StatementNode *prev = this;
+	// find end of list and maintain previous pointer
+	for ( StatementNode * curr = prev; curr != nullptr; curr = (StatementNode *)curr->get_next() ) {
+		StatementNode *node = dynamic_cast< StatementNode * >(curr);
+		assert( node );
+		assert( dynamic_cast< CaseStmt * >(node->stmt) );
+		prev = curr;
+	} // for
+	// convert from StatementNode list to Statement list
+	StatementNode *node = dynamic_cast< StatementNode * >(prev);
+	std::list< Statement * > stmts;
+	buildList( stmt, stmts );
+	// splice any new Statements to end of current Statements
+	CaseStmt * caseStmt = dynamic_cast< CaseStmt * >(node->stmt);
+	caseStmt->get_statements().splice( caseStmt->get_statements().end(), stmts );
 	return this;
 }
 
-StatementNode *StatementNode::add_controlexp( ExpressionNode *e ) {
-	if ( control && e )
-		control->add_to_list( e ); // xxx - check this
-	return this;
+Statement *build_expr( ExpressionNode *ctl ) {
+	Expression *e = maybeBuild< Expression >( ctl );
+
+	if ( e )
+		return new ExprStmt( noLabels, e );
+	else
+		return new NullStmt( noLabels );
 }
 
-StatementNode *StatementNode::append_block( StatementNode *stmt ) {
-	if ( stmt != 0 ) {
-		if ( block == 0 )
-			block = stmt;
-		else
-			block->set_link( stmt );
+Statement *build_if( ExpressionNode *ctl, StatementNode *then_stmt, StatementNode *else_stmt ) {
+	Statement *thenb, *elseb = 0;
+	std::list< Statement * > branches;
+	buildList< Statement, StatementNode >( then_stmt, branches );
+	assert( branches.size() == 1 );
+	thenb = branches.front();
+
+	if ( else_stmt ) {
+		std::list< Statement * > branches;
+		buildList< Statement, StatementNode >( else_stmt, branches );
+		assert( branches.size() == 1 );
+		elseb = branches.front();
 	} // if
-	return this;
+	return new IfStmt( noLabels, notZeroExpr( maybeBuild< Expression >(ctl) ), thenb, elseb );
 }
 
-StatementNode *StatementNode::append_last_case( StatementNode *stmt ) {
-	if ( stmt != 0 ) {
-		StatementNode *next = ( StatementNode *)get_link();
-		if ( next && ( next->get_type() == StatementNode::Case || next->get_type() == StatementNode::Default ) )
-			next->append_last_case ( stmt );
-		else
-			if ( block == 0 )
-				block = stmt;
-			else
-				block->set_link( stmt );
-	} // if
-	return this;
+Statement *build_switch( ExpressionNode *ctl, StatementNode *stmt ) {
+	std::list< Statement * > branches;
+	buildList< Statement, StatementNode >( stmt, branches );
+	assert( branches.size() >= 0 );						// size == 0 for switch (...) {}, i.e., no declaration or statements
+	return new SwitchStmt( noLabels, maybeBuild< Expression >(ctl), branches );
+}
+Statement *build_case( ExpressionNode *ctl ) {
+	std::list< Statement * > branches;
+	return new CaseStmt( noLabels, maybeBuild< Expression >(ctl), branches );
+}
+Statement *build_default() {
+	std::list< Statement * > branches;
+	return new CaseStmt( noLabels, nullptr, branches, true );
 }
 
-void StatementNode::print( std::ostream &os, int indent ) const {
-	if ( ! labels.empty() ) {
-		std::list<std::string>::const_iterator i;
+Statement *build_while( ExpressionNode *ctl, StatementNode *stmt, bool kind ) {
+	std::list< Statement * > branches;
+	buildList< Statement, StatementNode >( stmt, branches );
+	assert( branches.size() == 1 );
+	return new WhileStmt( noLabels, notZeroExpr( maybeBuild< Expression >(ctl) ), branches.front(), kind );
+}
 
-		os << string( indent, ' ' );
-		for ( i = labels.begin(); i != labels.end(); i++ )
-			os << *i << ":";
-		os << endl;
+Statement *build_for( ForCtl *forctl, StatementNode *stmt ) {
+	std::list< Statement * > branches;
+	buildList< Statement, StatementNode >( stmt, branches );
+	assert( branches.size() == 1 );
+
+	std::list< Statement * > init;
+	if ( forctl->init != 0 ) {
+		buildList( forctl->init, init );
 	} // if
 
-	switch ( type ) {
-	  case Decl:
-		decl->print( os, indent );
-		break;
-	  case Exp:
-		if ( control ) {
-			os << string( indent, ' ' );
-			control->print( os, indent );
-			os << endl;
-		} else
-			os << string( indent, ' ' ) << "Null Statement" << endl;
-		break;
-	  default:
-		os << string( indent, ' ' ) << StatementNode::StType[type] << endl;
-		if ( type == Catch ) {
-			if ( decl ) {
-				os << string( indent + ParseNode::indent_by, ' ' ) << "Declaration: " << endl;
-				decl->print( os, indent + 2 * ParseNode::indent_by );
-			} else if ( isCatchRest ) {
-				os << string( indent + ParseNode::indent_by, ' ' ) << "Catches the rest " << endl;
-			} else {
-				; // should never reach here
-			} // if
-		} // if
-		if ( control ) {
-			os << string( indent + ParseNode::indent_by, ' ' ) << "Control: " << endl;
-			control->printList( os, indent + 2 * ParseNode::indent_by );
-		} // if
-		if ( block ) {
-			os << string( indent + ParseNode::indent_by, ' ' ) << "Branches of execution: " << endl;
-			block->printList( os, indent + 2 * ParseNode::indent_by );
-		} // if
-		if ( target ) {
-			os << string( indent + ParseNode::indent_by, ' ' ) << "Target: " << get_target() << endl;
-		} // if
-		break;
-	} // switch
+	Expression *cond = 0;
+	if ( forctl->condition != 0 )
+		cond = notZeroExpr( maybeBuild< Expression >(forctl->condition) );
+
+	Expression *incr = 0;
+	if ( forctl->change != 0 )
+		incr = maybeBuild< Expression >(forctl->change);
+
+	delete forctl;
+	return new ForStmt( noLabels, init, cond, incr, branches.front() );
 }
 
-Statement *StatementNode::build() const {
-	std::list<Statement *> branches;
-	std::list<Expression *> exps;
-	std::list<Label> labs;
-
-	if ( ! labels.empty() ) {
-		std::back_insert_iterator< std::list<Label> > lab_it( labs );
-		copy( labels.begin(), labels.end(), lab_it );
-	} // if
-
-	// try {
-	buildList<Statement, StatementNode>( get_block(), branches );
-
-	switch ( type ) {
-	  case Decl:
-		return new DeclStmt( labs, maybeBuild< Declaration >( decl ) );
-	  case Exp:
-		{
-			Expression *e = maybeBuild< Expression >( get_control() );
-
-			if ( e )
-				return new ExprStmt( labs, e );
-			else
-				return new NullStmt( labs );
-		}
-	  case If:
-		{
-			Statement *thenb = 0, *elseb = 0;
-			assert( branches.size() >= 1 );
-
-			thenb = branches.front();
-			branches.pop_front();
-			if ( ! branches.empty() ) {
-				elseb = branches.front();
-				branches.pop_front();
-			} // if
-			return new IfStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), thenb, elseb );
-		}
-	  case While:
-		assert( branches.size() == 1 );
-		return new WhileStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), branches.front() );
-	  case Do:
-		assert( branches.size() == 1 );
-		return new WhileStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), branches.front(), true );
-	  case For:
-		{
-			assert( branches.size() == 1 );
-
-			ForCtlExprNode *ctl = dynamic_cast<ForCtlExprNode *>( get_control() );
-			assert( ctl != 0 );
-
-			std::list<Statement *> init;
-			if ( ctl->get_init() != 0 ) {
-				buildList( ctl->get_init(), init );
-			} // if
-
-			Expression *cond = 0;
-			if ( ctl->get_condition() != 0 )
-				cond = notZeroExpr( maybeBuild<Expression>(ctl->get_condition()) );
-
-			Expression *incr = 0;
-			if ( ctl->get_change() != 0 )
-				incr = maybeBuild<Expression>(ctl->get_change());
-
-			return new ForStmt( labs, init, cond, incr, branches.front() );
-		}
-	  case Switch:
-		return new SwitchStmt( labs, maybeBuild<Expression>(get_control()), branches );
-	  case Case:
-		return new CaseStmt( labs, maybeBuild<Expression>(get_control()), branches );
-	  case Default:
-		return new CaseStmt( labs, 0, branches, true );
-	  case Goto:
-		{
-			if ( get_target() == "" ) {					// computed goto
-				assert( get_control() != 0 );
-				return new BranchStmt( labs, maybeBuild<Expression>(get_control()), BranchStmt::Goto );
-			} // if
-
-			return new BranchStmt( labs, get_target(), BranchStmt::Goto );
-		}
-	  case Break:
-		return new BranchStmt( labs, get_target(), BranchStmt::Break );
-	  case Continue:
-		return new BranchStmt( labs, get_target(), BranchStmt::Continue );
-	  case Return:
-	  case Throw :
-		buildList( get_control(), exps );
-		if ( exps.size() ==0 )
-			return new ReturnStmt( labs, 0, type == Throw );
-		if ( exps.size() > 0 )
-			return new ReturnStmt( labs, exps.back(), type == Throw );
-	  case Try:
-		{
-			assert( branches.size() >= 0 );
-			CompoundStmt *tryBlock = dynamic_cast<CompoundStmt *>( branches.front());
-			branches.pop_front();
-			FinallyStmt *finallyBlock = 0;
-			if ( ( finallyBlock = dynamic_cast<FinallyStmt *>( branches.back())) ) {
-				branches.pop_back();
-			} // if
-			return new TryStmt( labs, tryBlock, branches, finallyBlock );
-		}
-	  case Catch:
-		{
-			assert( branches.size() == 1 );
-
-			return new CatchStmt( labs, maybeBuild< Declaration >( decl ), branches.front(), isCatchRest );
-		}
-	  case Finally:
-		{
-			assert( branches.size() == 1 );
-			CompoundStmt *block = dynamic_cast<CompoundStmt *>( branches.front() );
-			assert( block != 0 );
-
-			return new FinallyStmt( labs, block );
-		}
-	  case Asm:
-		assert( false );
-	  default:
-		// shouldn't be here
-		return 0;
-	} // switch
+Statement *build_branch( std::string identifier, BranchStmt::Type kind ) {
+	return new BranchStmt( noLabels, identifier, kind );
+}
+Statement *build_computedgoto( ExpressionNode *ctl ) {
+	return new BranchStmt( noLabels, maybeBuild< Expression >(ctl), BranchStmt::Goto );
 }
 
-
-CompoundStmtNode::CompoundStmtNode() : first( 0 ), last( 0 ) {}
-
-CompoundStmtNode::CompoundStmtNode( const string *name_ ) : StatementNode( name_ ), first( 0 ), last( 0 ) {}
-
-CompoundStmtNode::CompoundStmtNode( StatementNode *stmt ) : first( stmt ) {
-	if ( first ) {
-		last = ( StatementNode *)( stmt->get_last());
-	} else {
-		last = 0;
-	} // if
+Statement *build_return( ExpressionNode *ctl ) {
+	std::list< Expression * > exps;
+	buildList( ctl, exps );
+	return new ReturnStmt( noLabels, exps.size() > 0 ? exps.back() : nullptr );
+}
+Statement *build_throw( ExpressionNode *ctl ) {
+	std::list< Expression * > exps;
+	buildList( ctl, exps );
+	return new ReturnStmt( noLabels, exps.size() > 0 ? exps.back() : nullptr, true );
 }
 
-CompoundStmtNode::~CompoundStmtNode() {
-	delete first;
+Statement *build_try( StatementNode *try_stmt, StatementNode *catch_stmt, StatementNode *finally_stmt ) {
+	std::list< Statement * > branches;
+	buildList< Statement, StatementNode >( catch_stmt, branches );
+	CompoundStmt *tryBlock = dynamic_cast< CompoundStmt * >(maybeBuild< Statement >(try_stmt));
+	assert( tryBlock );
+	FinallyStmt *finallyBlock = dynamic_cast< FinallyStmt * >(maybeBuild< Statement >(finally_stmt) );
+	return new TryStmt( noLabels, tryBlock, branches, finallyBlock );
+}
+Statement *build_catch( DeclarationNode *decl, StatementNode *stmt, bool catchAny ) {
+	std::list< Statement * > branches;
+	buildList< Statement, StatementNode >( stmt, branches );
+	assert( branches.size() == 1 );
+	return new CatchStmt( noLabels, maybeBuild< Declaration >(decl), branches.front(), catchAny );
+}
+Statement *build_finally( StatementNode *stmt ) {
+	std::list< Statement * > branches;
+	buildList< Statement, StatementNode >( stmt, branches );
+	assert( branches.size() == 1 );
+	return new FinallyStmt( noLabels, dynamic_cast< CompoundStmt * >( branches.front() ) );
 }
 
-void CompoundStmtNode::add_statement( StatementNode *stmt ) {
-	if ( stmt != 0 ) {
-		last->set_link( stmt );
-		last = ( StatementNode *)( stmt->get_link());
-	} // if
-}
-
-void CompoundStmtNode::print( ostream &os, int indent ) const {
-	if ( first ) {
-		first->printList( os, indent+2 );
-	} // if
-}
-
-Statement *CompoundStmtNode::build() const {
-	std::list<Label> labs;
-	const std::list<std::string> &labels = get_labels();
-
-	if ( ! labels.empty() ) {
-		std::back_insert_iterator< std::list<Label> > lab_it( labs );
-		copy( labels.begin(), labels.end(), lab_it );
-	} // if
-
-	CompoundStmt *cs = new CompoundStmt( labs );
+Statement *build_compound( StatementNode *first ) {
+	CompoundStmt *cs = new CompoundStmt( noLabels );
 	buildList( first, cs->get_kids() );
 	return cs;
 }
 
-
-AsmStmtNode::AsmStmtNode( Type t, bool voltile, ConstantNode *instruction, ExpressionNode *output, ExpressionNode *input, ConstantNode *clobber, LabelNode *gotolabels ) :
-	StatementNode( t ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ) {
-	if ( gotolabels ) {
-		this->gotolabels = gotolabels->get_labels();
-		delete gotolabels;
-	} // if
-}
-
-AsmStmtNode::~AsmStmtNode() {
-	delete instruction; delete output; delete input; delete clobber;
-}
-
-void AsmStmtNode::print( std::ostream &os, int indent ) const {
-	StatementNode::print( os, indent );					// print statement labels
-	os << string( indent + ParseNode::indent_by, ' ' ) << "volatile:" << voltile << endl;
-	if ( instruction ) {
-		os << string( indent + ParseNode::indent_by, ' ' ) << "Instruction:" << endl;
-		instruction->printList( os, indent + 2 * ParseNode::indent_by );
-	} // if
-	if ( output ) {
-		os << string( indent + ParseNode::indent_by, ' ' ) << "Output:" << endl;
-		output->printList( os, indent + 2 * ParseNode::indent_by );
-	} // if
-	if ( input ) {
-		os << string( indent + ParseNode::indent_by, ' ' ) << "Input:" << endl;
-		input->printList( os, indent + 2 * ParseNode::indent_by );
-	} // if
-	if ( clobber ) {
-		os << string( indent + ParseNode::indent_by, ' ' ) << "Clobber:" << endl;
-		clobber->printList( os, indent + 2 * ParseNode::indent_by );
-	} // if
-	if ( ! gotolabels.empty() ) {
-		os << string( indent + ParseNode::indent_by, ' ' ) << "Goto Labels:" << endl;
-		os << string( indent + 2 * ParseNode::indent_by, ' ' );
-		for ( std::list<Label>::const_iterator i = gotolabels.begin();; ) {
-			os << *i;
-			i++;
-		  if ( i == gotolabels.end() ) break;
-			os << ", ";
-		}
-		os << endl;
-	} // if
-}
-
-Statement *AsmStmtNode::build() const {
-	std::list<Label> labs;
-
-	if ( ! get_labels().empty() ) {
-		std::back_insert_iterator< std::list<Label> > lab_it( labs );
-		copy( get_labels().begin(), get_labels().end(), lab_it );
-	} // if
-
+Statement *build_asmstmt( bool voltile, ConstantExpr *instruction, ExpressionNode *output, ExpressionNode *input, ExpressionNode *clobber, LabelNode *gotolabels ) {
 	std::list< Expression * > out, in;
 	std::list< ConstantExpr * > clob;
+
 	buildList( output, out );
 	buildList( input, in );
 	buildList( clobber, clob );
-	std::list< Label > gotolabs = gotolabels;
-	return new AsmStmt( labs, voltile, (ConstantExpr *)maybeBuild< Expression >( instruction ), out, in, clob, gotolabs );
-}
-
-
-void NullStmtNode::print( ostream &os, int indent ) const {
-	os << string( indent, ' ' ) << "Null Statement:" << endl;
-}
-
-Statement *NullStmtNode::build() const {
-	return new NullStmt;
+	return new AsmStmt( noLabels, voltile, instruction, out, in, clob, gotolabels ? gotolabels->labels : noLabels );
 }
 
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/TypeData.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:12:51 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 13 18:03:29 2016
-// Update Count     : 56
+// Last Modified On : Mon Aug 15 20:48:52 2016
+// Update Count     : 62
 //
 
@@ -182,5 +182,5 @@
 		break;
 	  case Array:
-		newtype->array->dimension = maybeClone( array->dimension );
+		newtype->array->dimension = array->dimension;
 		newtype->array->isVarLen = array->isVarLen;
 		newtype->array->isStatic = array->isStatic;
@@ -488,11 +488,11 @@
 				decl = new FunctionDecl( name, sc, linkage, buildFunction(), body, isInline, isNoreturn );
 			} else {
-				// std::list<Label> ls;
-				decl = new FunctionDecl( name, sc, linkage, buildFunction(), new CompoundStmt( std::list<Label>() ), isInline, isNoreturn );
+				// std::list< Label > ls;
+				decl = new FunctionDecl( name, sc, linkage, buildFunction(), new CompoundStmt( std::list< Label >() ), isInline, isNoreturn );
 			} // if
 		} else {
 			decl = new FunctionDecl( name, sc, linkage, buildFunction(), 0, isInline, isNoreturn );
 		} // if
-		for ( DeclarationNode *cur = function->idList; cur != 0; cur = dynamic_cast< DeclarationNode* >( cur->get_link() ) ) {
+		for ( DeclarationNode *cur = function->idList; cur != 0; cur = dynamic_cast< DeclarationNode* >( cur->get_next() ) ) {
 			if ( cur->get_name() != "" ) {
 				decl->get_oldIdents().insert( decl->get_oldIdents().end(), cur->get_name() );
@@ -510,5 +510,5 @@
 		return buildVariable();
 	} else {
-		return new ObjectDecl( name, sc, linkage, bitfieldWidth, build(), init, isInline, isNoreturn );
+		return new ObjectDecl( name, sc, linkage, bitfieldWidth, build(), init, std::list< Attribute * >(),  isInline, isNoreturn );
 	} // if
 	return 0;
@@ -908,7 +908,7 @@
 	buildList( enumeration->constants, ret->get_members() );
 	std::list< Declaration * >::iterator members = ret->get_members().begin();
-	for ( const DeclarationNode *cur = enumeration->constants; cur != NULL; cur = dynamic_cast<DeclarationNode *>( cur->get_link() ), ++members ) {
+	for ( const DeclarationNode *cur = enumeration->constants; cur != NULL; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ), ++members ) {
 		if ( cur->get_enumeratorValue() != NULL ) {
-			ObjectDecl *member = dynamic_cast<ObjectDecl *>(*members);
+			ObjectDecl *member = dynamic_cast< ObjectDecl * >(*members);
 			member->set_init( new SingleInit( maybeBuild< Expression >( cur->get_enumeratorValue() ), std::list< Expression * >() ) );
 		} // if
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/TypeData.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:18:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 20:52:02 2016
-// Update Count     : 20
+// Last Modified On : Mon Aug 15 14:28:32 2016
+// Update Count     : 21
 //
 
Index: src/Parser/TypedefTable.cc
===================================================================
--- src/Parser/TypedefTable.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/TypedefTable.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:20:13 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Apr 13 16:57:30 2016
-// Update Count     : 24
+// Last Modified On : Mon Aug 15 18:24:42 2016
+// Update Count     : 25
 //
 
@@ -64,9 +64,9 @@
 		tableType::iterator curPos = table.find( identifier );
 		if ( curPos == table.end()) {
-			list<Entry> newList;
+			list< Entry > newList;
 			newList.push_front( newEntry );
 			table[identifier] = newList;
 		} else {
-			list<Entry>::iterator listPos = (*curPos ).second.begin();
+			list< Entry >::iterator listPos = (*curPos ).second.begin();
 			while ( listPos != (*curPos ).second.end() && listPos->scope > scope ) {
 				listPos++;
@@ -127,5 +127,5 @@
 	debugPrint( "Leaving scope " << currentScope << endl );
 	for ( tableType::iterator i = table.begin(); i != table.end(); ) {
-		list<Entry> &declList = (*i).second;
+		list< Entry > &declList = (*i).second;
 		while ( ! declList.empty() && declList.front().scope == currentScope ) {
 			declList.pop_front();
@@ -157,6 +157,6 @@
 	for ( tableType::const_iterator i = table.begin(); i != table.end(); i++) {
 		debugPrint( (*i ).first << ": " );
-		list<Entry> declList = (*i).second;
-		for ( list<Entry>::const_iterator j = declList.begin(); j != declList.end(); j++ ) {
+		list< Entry > declList = (*i).second;
+		for ( list< Entry >::const_iterator j = declList.begin(); j != declList.end(); j++ ) {
 			debugPrint( "(" << (*j).scope << " " << (*j).kind << ") " );
 		}
Index: src/Parser/TypedefTable.h
===================================================================
--- src/Parser/TypedefTable.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/TypedefTable.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:24:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Apr 13 16:59:56 2016
-// Update Count     : 27
+// Last Modified On : Mon Aug 15 18:25:04 2016
+// Update Count     : 28
 //
 
@@ -39,5 +39,5 @@
 	};
 
-	typedef std::map<std::string, std::list<Entry> > tableType;
+	typedef std::map< std::string, std::list< Entry > > tableType;
 	tableType table;
 
Index: src/Parser/lex.cc
===================================================================
--- src/Parser/lex.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/lex.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -382,6 +382,6 @@
 	(yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 180
-#define YY_END_OF_BUFFER 181
+#define YY_NUM_RULES 181
+#define YY_END_OF_BUFFER 182
 /* This struct is not used in this scanner,
    but its presence is necessary. */
@@ -391,103 +391,105 @@
 	flex_int32_t yy_nxt;
 	};
-static yyconst flex_int16_t yy_accept[888] =
+static yyconst flex_int16_t yy_accept[892] =
     {   0,
-        0,    0,    0,    0,    0,    0,  115,  115,  118,  118,
-      181,  179,    7,    9,    8,  138,  117,  102,  143,  146,
-      114,  125,  126,  141,  139,  129,  140,  132,  142,  107,
-      108,  109,  130,  131,  148,  150,  149,  151,  179,  102,
-      123,  179,  124,  144,  102,  104,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  127,  147,  128,  145,    7,  179,    4,    4,
-      180,  105,  180,  106,  115,  116,  122,  118,  119,    7,
-        9,    0,    8,  155,  174,  102,    0,  167,  137,  160,
-      168,  165,  152,  163,  153,  164,  162,    0,  112,    3,
-
-        0,  166,  112,  110,    0,    0,  110,  110,    0,    0,
-      110,  109,  109,  109,    0,  109,  135,  136,  134,  156,
-      158,  154,  159,  157,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  103,
-      173,    0,  117,  114,  102,    0,    0,  170,    0,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,   38,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,   56,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  169,  161,    7,    0,    0,    0,
-
-        2,    0,    5,  105,    0,    0,    0,  115,    0,  121,
-      120,  120,    0,    0,    0,  118,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  116,  116,  119,  119,
+      182,  180,    7,    9,    8,  139,  118,  103,  144,  147,
+      115,  126,  127,  142,  140,  130,  141,  133,  143,  108,
+      109,  110,  131,  132,  149,  151,  150,  152,  180,  103,
+      124,  180,  125,  145,  103,  105,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  128,  148,  129,  146,    7,  180,    4,    4,
+      181,  106,  181,  107,  116,  117,  123,  119,  120,    7,
+        9,    0,    8,  156,  175,  103,    0,  168,  138,  161,
+      169,  166,  153,  164,  154,  165,  163,    0,  113,    3,
+
+        0,  167,  113,  111,    0,    0,  111,  111,    0,    0,
+      111,  110,  110,  110,    0,  110,  136,  137,  135,  157,
+      159,  155,  160,  158,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  104,
+      174,    0,  118,  115,  103,    0,    0,  171,    0,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,   38,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,   57,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  170,  162,    7,    0,    0,    0,
+
+        2,    0,    5,  106,    0,    0,    0,  116,    0,  122,
+      121,  121,    0,    0,    0,  119,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  133,  112,  112,    0,  112,  112,    0,    0,    6,
-        0,  110,    0,    0,    0,  112,    0,  110,  110,  110,
-      110,    0,  111,    0,    0,  109,  109,  109,  109,    0,
-      171,  172,    0,  177,  175,    0,    0,    0,  103,    0,
-        0,    0,    0,    0,    0,    0,    0,  102,   17,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,   14,  102,  102,
-
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,   50,  102,  102,  102,
-       63,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,   89,  102,  102,  102,  102,
-      102,  102,  102,    0,    0,    0,    0,    0,    0,    0,
-        0,  120,    0,    0,    0,    0,    0,  120,    0,    0,
-      178,    0,    0,    0,    0,    0,    0,    0,  112,    0,
-      112,    0,  112,    0,    0,  112,    0,  110,  110,    0,
-        0,  111,  111,    0,  111,    0,  111,  109,  109,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,  176,
-
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,   21,  102,   24,  102,   27,  102,  102,
-      102,  102,  102,  102,  102,   41,  102,   43,  102,  102,
-      102,  102,  102,  102,  102,   55,  102,   66,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,   97,  102,  102,    0,    0,    0,
+        0,  134,  113,  113,    0,  113,  113,    0,    0,    6,
+        0,  111,    0,    0,    0,  113,    0,  111,  111,  111,
+      111,    0,  112,    0,    0,  110,  110,  110,  110,    0,
+      172,  173,    0,  178,  176,    0,    0,    0,  104,    0,
+        0,    0,    0,    0,    0,    0,    0,  103,   17,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,   14,  103,  103,
+
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,   51,  103,  103,  103,
+       64,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,   90,  103,  103,  103,  103,
+      103,  103,  103,    0,    0,    0,    0,    0,    0,    0,
+        0,  121,    0,    0,    0,    0,    0,  121,    0,    0,
+      179,    0,    0,    0,    0,    0,    0,    0,  113,    0,
+      113,    0,  113,    0,    0,  113,    0,  111,  111,    0,
+        0,  112,  112,    0,  112,    0,  112,  110,  110,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  177,
+
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,   21,  103,   24,  103,   27,  103,  103,
+      103,  103,  103,  103,  103,   41,  103,   43,  103,  103,
+      103,  103,  103,  103,  103,   56,  103,   67,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,   98,  103,  103,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,  120,    0,    0,    0,    0,    0,  112,    0,    0,
-        0,    0,    0,    0,  111,  111,    0,  113,    0,  111,
-
-      111,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,  102,  102,   22,  102,  102,  102,
-      102,  102,  102,  102,   15,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,   23,
-       25,  102,   32,  102,  102,  102,  102,   40,  102,  102,
-      102,  102,   48,  102,  102,   53,  102,  102,   70,  102,
-      102,  102,   76,  102,  102,  102,  102,  102,   86,   88,
-      102,  102,   94,  102,  102,  101,    0,    0,    0,    0,
+        0,  121,    0,    0,    0,    0,    0,  113,    0,    0,
+        0,    0,    0,    0,  112,  112,    0,  114,    0,  112,
+
+      112,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  103,  103,   22,  103,  103,  103,
+      103,  103,  103,  103,   15,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,   23,
+       25,  103,   32,  103,  103,  103,  103,   40,  103,  103,
+      103,  103,   49,  103,  103,   54,  103,  103,   71,  103,
+      103,  103,   77,  103,  103,  103,  103,  103,   87,   89,
+      103,  103,   95,  103,  103,  102,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  113,    0,    0,  111,  113,
-
-      113,  113,  113,    0,  111,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,  102,    0,  102,  102,  102,
-      102,  102,  102,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,   58,  102,  102,  102,  102,  102,  102,
-      102,  102,   28,  102,  102,  102,   39,   42,   45,  102,
-      102,   51,  102,   60,   67,  102,  102,   75,   77,   80,
-       81,   83,   84,  102,  102,   91,  102,  102,    0,    1,
-        0,    0,    0,    0,    0,    0,  105,    0,    0,    0,
-      120,    0,    0,    0,    0,  113,    0,  113,  113,    0,
-        0,    0,    0,    0,    0,    0,    0,    0,  102,  102,
-
-       18,  102,  102,  102,  102,  102,  102,  102,   16,  102,
-      102,  102,   33,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,  102,   36,   37,  102,   47,   52,
-      102,  102,  102,   90,  102,  102,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  114,    0,    0,  112,  114,
+
+      114,  114,  114,    0,  112,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  103,    0,  103,  103,  103,
+      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,   59,  103,  103,  103,  103,  103,  103,
+      103,  103,   28,  103,  103,  103,   39,   42,   45,  103,
+      103,   52,  103,   61,   68,  103,  103,   76,   78,   81,
+       82,   84,   85,  103,  103,   92,  103,  103,    0,    1,
+        0,    0,    0,    0,    0,    0,  106,    0,    0,    0,
+      121,    0,    0,    0,    0,  114,    0,  114,  114,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  103,  103,
+
+       18,  103,  103,  103,  103,  103,  103,  103,   16,  103,
+      103,  103,   33,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,  103,   36,   37,  103,   48,   53,
+      103,  103,  103,   91,  103,  103,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,   10,
-       11,   29,   54,  102,  102,  102,  102,  102,  102,  102,
-      102,  102,  102,  102,   59,   61,   64,  102,  102,   78,
-       92,  102,  102,   35,   46,   71,   72,  102,   95,   98,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  102,   68,  102,  102,   12,  102,  102,   30,
-
-       34,  102,  102,  102,   65,  102,  102,  102,  102,  102,
-      102,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,   57,  102,  102,  102,  102,  102,
-      102,  102,   49,   62,   73,   79,   93,   99,  102,  102,
-        0,    0,    0,    0,    0,    0,    0,    0,  102,  102,
-       13,   19,  102,  102,   31,  102,  102,  102,   26,   87,
-        0,    0,  102,  102,  102,  102,  102,  102,   74,  100,
-      102,   85,   20,  102,  102,   44,   82,  102,  102,  102,
-      102,  102,  102,  102,   96,   69,    0
+       11,   29,   55,  103,  103,  103,  103,  103,  103,  103,
+      103,  103,  103,  103,   60,   62,   65,  103,  103,   79,
+       93,  103,  103,   35,  103,   47,   72,   73,  103,   96,
+       99,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  103,   69,  103,  103,   12,  103,  103,
+
+       30,   34,  103,  103,  103,   66,  103,  103,  103,  103,
+      103,  103,  103,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,   58,  103,  103,  103,
+      103,  103,  103,  103,   50,   63,   74,   80,   94,  100,
+      103,  103,  103,    0,    0,    0,    0,    0,    0,    0,
+        0,  103,  103,   13,   19,  103,  103,   31,  103,  103,
+      103,   26,   46,   88,    0,    0,  103,  103,  103,  103,
+      103,  103,   75,  101,  103,   86,   20,  103,  103,   44,
+       83,  103,  103,  103,  103,  103,  103,  103,   97,   70,
+        0
+
     } ;
 
@@ -537,247 +539,247 @@
     } ;
 
-static yyconst flex_int16_t yy_base[1062] =
+static yyconst flex_int16_t yy_base[1066] =
     {   0,
-        0,   84, 2272, 2269,   94,    0,  177,  178,  179,  180,
-     2285, 2822,  191, 2822,  197,   55, 2822, 2231,   60,  173,
-     2822, 2822, 2822,   56,  188, 2822,  191,  189,  204,  216,
-      275,    0, 2249, 2822,  216, 2247,  152,  344,  155,  220,
-     2822,  159, 2822,  217,  226, 2822,  185,  154,  212,  251,
+        0,   84, 2285, 2282,   94,    0,  177,  178,  179,  180,
+     2298, 2825,  191, 2825,  197,   55, 2825, 2244,   60,  173,
+     2825, 2825, 2825,   56,  188, 2825,  191,  189,  204,  216,
+      275,    0, 2262, 2825,  216, 2260,  152,  344,  155,  220,
+     2825,  159, 2825,  217,  226, 2825,  185,  154,  212,  251,
       237,  270,  235,  257,  241,  205,  193,  305,  314,  333,
-      238,  228, 2822,  225, 2822, 2242,  402,  390, 2822, 2253,
-     2822, 2221,  235, 2822,    0, 2822,  426,    0, 2822,  417,
-     2822,  439,  451, 2822,  498, 2219,  264, 2822, 2822, 2822,
-     2822, 2822, 2235, 2822, 2232, 2822, 2822, 2244,  559, 2822,
-
-     2261, 2822,  438,  444,  511,  534,  289,  253,  197,  380,
-      305,    0,  319,  280,  198,  322, 2822, 2822, 2822, 2230,
-     2822, 2822, 2822, 2227, 2224,  218,  255, 2239,  298,  350,
-      368,  312,  440,  398,  405, 2220,  441, 2168,  446, 2196,
-     2822,  335, 2822, 2822,  468, 2190, 2189, 2822, 2162,  439,
+      238,  228, 2825,  225, 2825, 2255,  402,  390, 2825, 2266,
+     2825, 2234,  235, 2825,    0, 2825,  426,    0, 2825,  417,
+     2825,  439,  451, 2825,  498, 2232,  264, 2825, 2825, 2825,
+     2825, 2825, 2248, 2825, 2245, 2825, 2825, 2257,  559, 2825,
+
+     2274, 2825,  438,  444,  511,  534,  289,  253,  197,  380,
+      305,    0,  319,  280,  198,  322, 2825, 2825, 2825, 2243,
+     2825, 2825, 2825, 2240, 2237,  218,  255, 2252,  298,  350,
+      368,  312,  440,  398,  405, 2233,  441, 2181,  446, 2209,
+     2825,  335, 2825, 2825,  468, 2203, 2202, 2825, 2175,  439,
       282,  433,  372,  281,  437,  434,  428,  570,  444,  466,
       464,  469,  475,  321,  492,  438,  471,  445,  474,  512,
-      489,  503,  496,  521,  276,  515,  516, 2189,  526,  510,
+      489,  503,  496,  521,  276,  515,  516, 2202,  526,  510,
       519,  525,  543,  522,  560,  553,  523,  561,  551,  544,
-      599,  582,  593,  584, 2822, 2822,  660,  651, 2236,  666,
-
-     2822,  678, 2822, 2183,  607, 2179, 2178,    0,  693, 2822,
-     2822,  684, 2176, 2156, 2154,    0, 2177,  578,  608,  617,
-      654,  679,  650,  683,  684,  687, 2172,  690,  691, 2147,
-     2146, 2822,    0,  683,  710,  686,  700, 2145, 2196, 2822,
-      714,    0,  427,  746,  764,  786,  808,  621, 2822, 2152,
-     2125,    0,  794, 2171,  795,  709, 2822, 2147, 2121,  832,
-     2822, 2822, 2152, 2822, 2822,  711,  714, 2129, 2129,  717,
-     2125, 2123, 2120,    0, 2117,    0, 2088,  694,  679,  712,
+      599,  582,  593,  584, 2825, 2825,  660,  651, 2249,  666,
+
+     2825,  678, 2825, 2196,  607, 2192, 2191,    0,  693, 2825,
+     2825,  684, 2189, 2186, 2183,    0, 2206,  578,  608,  617,
+      654,  679,  650,  683,  684,  687, 2203,  690,  691, 2179,
+     2159, 2825,    0,  683,  710,  686,  700, 2157, 2209, 2825,
+      714,    0,  427,  746,  764,  786,  808,  621, 2825, 2165,
+     2138,    0,  794, 2184,  795,  709, 2825, 2160, 2134,  832,
+     2825, 2825, 2165, 2825, 2825,  711,  714, 2142, 2142,  717,
+     2138, 2136, 2133,    0, 2130,    0, 2101,  694,  679,  712,
       709,  711,  698,  566,  726,  743,  771,  741,  790,  784,
-      800,  795,  742,  744,  814,  816,  818, 2118,  819,  745,
+      800,  795,  742,  744,  814,  816,  818, 2131,  819,  745,
 
       820,  821,  822,  823,  824,  746,  825,  748,  659,  831,
       826,  833,  838,  839,  848,  850,  851,  844,  834,  857,
-     2116,  858,  859,  860,  862,  861,  864,  865,  867,  868,
-      866,  871,  876,  872,  878, 2113,  880,  689,  881,  882,
-      892,  896,  893,  953,  954, 2109, 2108, 2106,    0, 2103,
-        0,  941,  945, 2102,    0, 2101,    0, 2099,    0, 2118,
-     2822,  940,  941, 2094, 2088,    0, 2086,    0, 2822,  953,
-      975,  964, 2822,  981,  997, 1021, 2084, 2822, 2822,  939,
-      940, 1006,  982, 1041,  310, 1039, 1004, 2822, 2822, 2081,
-     2079, 2077,    0, 2074,    0, 2071,    0, 2070,    0, 2822,
+     2129,  858,  859,  860,  862,  861,  864,  865,  867,  868,
+      866,  871,  876,  872,  878, 2126,  880,  689,  881,  882,
+      892,  896,  893,  953,  954, 2120, 2119, 2118,    0, 2116,
+        0,  941,  945, 2113,    0, 2112,    0, 2111,    0, 2131,
+     2825,  940,  941, 2108, 2105,    0, 2104,    0, 2825,  953,
+      975,  964, 2825,  981,  997, 1021, 2102, 2825, 2825,  939,
+      940, 1006,  982, 1041,  310, 1039, 1004, 2825, 2825, 2099,
+     2095, 2091,    0, 2089,    0, 2087,    0, 2084,    0, 2825,
 
       886,  941,  960,  962,  977,  976,  980,  982, 1017, 1010,
      1002,  998, 1022, 1031, 1028, 1033, 1034, 1037, 1040, 1043,
-     1038, 1041, 1053, 2072, 1055, 2070, 1045, 2067, 1056, 1061,
-     1063, 1065, 1066, 1067, 1070, 2064, 1071, 2063, 1073, 1074,
-     1075, 1078, 1080, 1081, 1085, 2062, 1087, 2060, 1084, 1089,
+     1038, 1041, 1053, 2085, 1055, 2083, 1045, 2080, 1056, 1061,
+     1063, 1065, 1066, 1067, 1070, 2077, 1071, 2076, 1073, 1074,
+     1075, 1078, 1080, 1081, 1085, 2075, 1087, 2073, 1084, 1089,
      1091, 1097, 1099, 1092, 1102, 1103, 1105, 1106, 1108,  905,
-     1109, 1116, 1110, 1122, 2057, 1120, 1123, 1179, 2051,    0,
-     2050,    0, 2049,    0, 2047,    0, 1166, 2044,    0, 2041,
-        0, 2040, 2039, 2037,    0, 2034,    0, 1173, 2031, 1179,
-     1137, 1195, 1181, 1178, 1176, 2822, 1219, 1231, 1253, 2042,
-
-     2017, 2027, 2024,    0, 2021,    0, 2020,    0, 2019,    0,
-     2017,    0, 2014,    0, 1141, 1172, 2014, 1180, 1155, 1196,
+     1109, 1116, 1110, 1122, 2070, 1120, 1123, 1179, 2064,    0,
+     2063,    0, 2062,    0, 2060,    0, 1166, 2057,    0, 2054,
+        0, 2053, 2052, 2050,    0, 2047,    0, 1173, 2044, 1179,
+     1137, 1195, 1181, 1178, 1176, 2825, 1219, 1231, 1253, 2055,
+
+     2030, 2040, 2037,    0, 2034,    0, 2033,    0, 2032,    0,
+     2030,    0, 2027,    0, 1141, 1172, 2027, 1180, 1155, 1196,
      1157, 1216, 1207, 1231, 1125, 1210, 1232, 1214, 1187, 1236,
-     1235, 1237, 1238, 1272, 1249, 1252, 1250, 1253, 1254, 2013,
-     1261, 1256, 2012, 1260, 1263, 1264, 1257, 2010, 1271, 1268,
-     1269, 1273, 2007, 1275, 1282, 2006, 1283, 1284, 2005, 1276,
-     1286, 1289, 2003, 1294, 1291, 1296, 1295, 1297, 1310, 2000,
-     1305, 1308, 1999, 1307, 1300, 1998, 2046, 1960,    0, 1958,
-        0, 1957,    0, 1954,    0, 1951,    0, 1950,    0, 1949,
-        0, 1947,    0, 1355, 1361, 1389, 1372, 1944, 2822, 1378,
-
-     1325, 1365, 1379, 1941, 2822, 1940,    0, 1939,    0, 1937,
-        0, 1934,    0,    0,    0, 1936,    0, 1366, 1312, 1311,
+     1235, 1237, 1238, 1272, 1249, 1252, 1250, 1253, 1254, 2026,
+     1261, 1256, 2025, 1260, 1263, 1264, 1257, 2023, 1271, 1268,
+     1269, 1273, 2020, 1275, 1282, 2017, 1283, 1284, 2016, 1276,
+     1286, 1289, 2015, 1294, 1291, 1296, 1295, 1297, 1310, 2013,
+     1305, 1308, 2010, 1307, 1300, 2009, 2058, 2003,    0, 2000,
+        0, 1999,    0, 1998,    0, 1996,    0, 1963,    0, 1961,
+        0, 1960,    0, 1355, 1361, 1389, 1372, 1957, 2825, 1378,
+
+     1325, 1365, 1379, 1954, 2825, 1953,    0, 1952,    0, 1950,
+        0, 1947,    0,    0,    0, 1947,    0, 1366, 1312, 1311,
      1341, 1323, 1368, 1369, 1374, 1356, 1383, 1372, 1388, 1390,
      1393, 1395, 1396, 1398, 1400, 1431, 1406, 1407, 1411, 1408,
-     1413, 1414, 1935, 1409, 1416, 1419, 1933, 1930, 1929, 1422,
-     1424, 1928, 1429, 1926, 1923, 1425, 1430, 1919, 1915, 1911,
-     1895, 1894, 1893, 1436, 1433, 1891, 1439, 1440, 1938, 2822,
-     1884,    0, 1883,    0,    0,    0, 1884,    0,    0,    0,
-     2822,    0,    0,    0,    0, 1486, 1878, 2822, 2822, 1492,
-     1877,    0, 1876,    0,    0,    0,    0, 1874, 1447, 1444,
-
-     1874, 1449, 1471, 1479, 1450, 1480, 1482, 1469, 1873, 1486,
+     1413, 1414, 1946, 1409, 1416, 1419, 1945, 1943, 1940, 1422,
+     1424, 1939, 1429, 1938, 1936, 1425, 1430, 1933, 1932, 1931,
+     1929, 1926, 1922, 1436, 1433, 1918, 1439, 1440, 1964, 2825,
+     1895,    0, 1894,    0,    0,    0, 1896,    0,    0,    0,
+     2825,    0,    0,    0,    0, 1486, 1891, 2825, 2825, 1492,
+     1888,    0, 1887,    0,    0,    0,    0, 1886, 1447, 1444,
+
+     1887, 1449, 1471, 1479, 1450, 1480, 1482, 1469, 1884, 1486,
      1490, 1488, 1502, 1452, 1510, 1504, 1491, 1519, 1506, 1498,
-     1508, 1512, 1513, 1514, 1515, 1872, 1870, 1517, 1867, 1866,
-     1518, 1520, 1523, 1865, 1521, 1525,    0,    0,    0, 1860,
-     1857, 1856, 1575,    0, 1855, 1853, 1850, 1849, 1848, 1849,
-     1846, 1845, 1844, 1531, 1536, 1527, 1528, 1552, 1533, 1537,
-     1539, 1555, 1557, 1569, 1842, 1560, 1839, 1561, 1559, 1568,
-     1572, 1567, 1573, 1838, 1837, 1835, 1828, 1574, 1826, 1825,
-     1819, 1818, 1817, 1815, 1798, 1789, 1788, 1785, 1778, 1775,
-     1768, 1766, 1576, 1768, 1577, 1581, 1580, 1579, 1584, 1585,
-
-     1747, 1586, 1615, 1590, 1746, 1591, 1592, 1602, 1600, 1594,
-     1606, 1742, 1735, 1733, 1732, 1690, 1689, 1686, 1685, 1683,
-     1682, 1678, 1677, 1674, 1676, 1607, 1611, 1614, 1612, 1608,
-     1616, 1620, 1675, 1623, 1624, 1530, 1453, 1630, 1625, 1629,
-     1438, 1354, 1319, 1318, 1267, 1212, 1210, 1208, 1631, 1636,
-     1178, 1639, 1635, 1643, 1177, 1644, 1646, 1650, 1126,  964,
-      937,  903, 1651, 1652, 1654, 1655, 1656, 1658,  788,  752,
-     1660,  607,  487, 1662, 1663,  394,  357, 1664, 1666, 1668,
-     1670, 1669, 1672, 1674,  233,  137, 2822, 1747, 1760, 1773,
-     1783, 1793, 1806, 1816, 1829, 1842, 1855, 1863, 1873, 1880,
-
-     1887, 1894, 1901, 1908, 1915, 1922, 1929, 1936, 1949, 1956,
-     1960, 1968, 1971, 1978, 1985, 1992, 1995, 2002, 2008, 2021,
-     2034, 2041, 2048, 2055, 2062, 2065, 2072, 2075, 2082, 2085,
-     2092, 2095, 2102, 2105, 2112, 2115, 2122, 2125, 2132, 2140,
-     2147, 2154, 2161, 2168, 2171, 2178, 2181, 2188, 2191, 2198,
-     2204, 2217, 2224, 2231, 2234, 2241, 2244, 2251, 2254, 2261,
-     2264, 2271, 2274, 2281, 2284, 2291, 2298, 2301, 2308, 2311,
-     2318, 2325, 2332, 2335, 2342, 2345, 2352, 2355, 2362, 2365,
-     2372, 2375, 2382, 2388, 2401, 2408, 2415, 2418, 2425, 2428,
-     2435, 2438, 2445, 2448, 2455, 2458, 2465, 2468, 2475, 2478,
-
-     2485, 2488, 2495, 2502, 2505, 2512, 2515, 2522, 2525, 2532,
-     2535, 2538, 2544, 2551, 2560, 2567, 2574, 2577, 2584, 2587,
-     2590, 2596, 2603, 2606, 2609, 2612, 2615, 2618, 2621, 2624,
-     2631, 2634, 2641, 2644, 2647, 2650, 2653, 2663, 2670, 2673,
-     2676, 2679, 2686, 2693, 2700, 2703, 2710, 2717, 2724, 2731,
-     2738, 2745, 2752, 2759, 2766, 2773, 2780, 2787, 2794, 2801,
-     2808
+     1508, 1512, 1513, 1514, 1515, 1883, 1882, 1518, 1880, 1877,
+     1517, 1520, 1523, 1876, 1521, 1525,    0,    0,    0, 1872,
+     1870, 1867, 1575,    0, 1866, 1865, 1863, 1860, 1859, 1861,
+     1859, 1856, 1855, 1531, 1538, 1527, 1528, 1530, 1533, 1552,
+     1539, 1554, 1553, 1586, 1854, 1559, 1852, 1560, 1561, 1564,
+     1570, 1572, 1571, 1849, 1574, 1848, 1847, 1845, 1575, 1842,
+     1841, 1837, 1835, 1828, 1826, 1825, 1822, 1821, 1820, 1818,
+     1801, 1792, 1791, 1576, 1791, 1579, 1577, 1580, 1582, 1581,
+
+     1585, 1784, 1589, 1616, 1593, 1781, 1591, 1599, 1605, 1592,
+     1606, 1609, 1610, 1771, 1769, 1768, 1747, 1746, 1745, 1738,
+     1736, 1735, 1693, 1689, 1688, 1687, 1689, 1611, 1612, 1614,
+     1615, 1618, 1625, 1621, 1686, 1683, 1627, 1682, 1681, 1631,
+     1635, 1441, 1637, 1677, 1674, 1354, 1319, 1318, 1267, 1212,
+     1210, 1639, 1640, 1211, 1647, 1623, 1649, 1178, 1652, 1653,
+     1657, 1177, 1126,  964,  937,  903, 1641, 1643, 1659, 1663,
+     1664, 1665,  788,  752, 1629,  607,  487, 1666, 1669,  394,
+      357, 1670, 1672, 1671, 1674, 1676, 1675, 1678,  233,  137,
+     2825, 1750, 1763, 1776, 1786, 1796, 1809, 1819, 1832, 1845,
+
+     1858, 1866, 1876, 1883, 1890, 1897, 1904, 1911, 1918, 1925,
+     1932, 1939, 1952, 1959, 1963, 1971, 1974, 1981, 1988, 1995,
+     1998, 2005, 2011, 2024, 2037, 2044, 2051, 2058, 2065, 2068,
+     2075, 2078, 2085, 2088, 2095, 2098, 2105, 2108, 2115, 2118,
+     2125, 2128, 2135, 2143, 2150, 2157, 2164, 2171, 2174, 2181,
+     2184, 2191, 2194, 2201, 2207, 2220, 2227, 2234, 2237, 2244,
+     2247, 2254, 2257, 2264, 2267, 2274, 2277, 2284, 2287, 2294,
+     2301, 2304, 2311, 2314, 2321, 2328, 2335, 2338, 2345, 2348,
+     2355, 2358, 2365, 2368, 2375, 2378, 2385, 2391, 2404, 2411,
+     2418, 2421, 2428, 2431, 2438, 2441, 2448, 2451, 2458, 2461,
+
+     2468, 2471, 2478, 2481, 2488, 2491, 2498, 2505, 2508, 2515,
+     2518, 2525, 2528, 2535, 2538, 2541, 2547, 2554, 2563, 2570,
+     2577, 2580, 2587, 2590, 2593, 2599, 2606, 2609, 2612, 2615,
+     2618, 2621, 2624, 2627, 2634, 2637, 2644, 2647, 2650, 2653,
+     2656, 2666, 2673, 2676, 2679, 2682, 2689, 2696, 2703, 2706,
+     2713, 2720, 2727, 2734, 2741, 2748, 2755, 2762, 2769, 2776,
+     2783, 2790, 2797, 2804, 2811
     } ;
 
-static yyconst flex_int16_t yy_def[1062] =
+static yyconst flex_int16_t yy_def[1066] =
     {   0,
-      887,    1,  888,  888,  887,    5,  889,  889,  890,  890,
-      887,  887,  887,  887,  887,  887,  887,  891,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,   31,  887,  887,  887,  887,  887,  887,  892,  891,
-      887,  887,  887,  887,  891,  887,  891,  891,  891,  891,
+      891,    1,  892,  892,  891,    5,  893,  893,  894,  894,
+      891,  891,  891,  891,  891,  891,  891,  895,  891,  891,
       891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
-      891,  891,  887,  887,  887,  887,  887,  893,  887,  887,
-      887,  894,  887,  887,  895,  887,  887,  896,  887,  887,
-      887,  887,  887,  887,  887,  891,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-
-      897,  887,   99,   30,  887,  887,  887,  887,  898,   30,
-      887,   31,  887,  887,   31,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  899,
-      887,  887,  887,  887,  891,  900,  901,  887,  887,  891,
+      891,   31,  891,  891,  891,  891,  891,  891,  896,  895,
+      891,  891,  891,  891,  895,  891,  895,  895,  895,  895,
+      895,  895,  895,  895,  895,  895,  895,  895,  895,  895,
+      895,  895,  891,  891,  891,  891,  891,  897,  891,  891,
+      891,  898,  891,  891,  899,  891,  891,  900,  891,  891,
+      891,  891,  891,  891,  891,  895,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+
+      901,  891,   99,   30,  891,  891,  891,  891,  902,   30,
+      891,   31,  891,  891,   31,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  903,
+      891,  891,  891,  891,  895,  904,  905,  891,  891,  895,
+      895,  895,  895,  895,  895,  895,  895,  895,  895,  895,
+      895,  895,  895,  895,  895,  895,  895,  895,  895,  895,
+      895,  895,  895,  895,  895,  895,  895,  895,  895,  895,
+      895,  895,  895,  895,  895,  895,  895,  895,  895,  895,
+      895,  895,  895,  895,  891,  891,  891,  897,  897,  897,
+
+      891,  897,  891,  898,  891,  906,  907,  899,  891,  891,
+      891,  891,  908,  909,  910,  900,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  911,
+      912,  891,   99,  891,  891,  891,  891,   99,  913,  891,
+      891,  104,  104,  891,  891,  891,  891,  891,  891,  891,
+      891,  914,  915,  916,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  903,  891,
+      917,  918,  919,  920,  921,  922,  891,  923,  923,  923,
+      923,  923,  923,  923,  923,  923,  923,  923,  923,  923,
+      923,  923,  923,  923,  923,  923,  923,  923,  923,  923,
+
+      923,  923,  923,  923,  923,  923,  923,  923,  923,  923,
+      923,  923,  923,  923,  923,  923,  923,  923,  923,  923,
+      923,  923,  923,  923,  923,  923,  923,  923,  923,  923,
+      923,  923,  923,  923,  923,  923,  923,  923,  923,  923,
+      923,  923,  923,  924,  925,  926,  927,  928,  929,  930,
+      931,  891,  891,  932,  933,  934,  935,  936,  937,  891,
+      891,  891,  891,  891,  938,  939,  940,  941,  891,  891,
+      891,  891,  891,  891,  891,  371,  376,  891,  891,  942,
+      943,  944,  891,  891,  891,  944,  891,  891,  891,  945,
+      946,  947,  948,  949,  950,  951,  952,  953,  954,  891,
+
+      955,  955,  955,  955,  955,  955,  955,  955,  955,  955,
+      955,  955,  955,  955,  955,  955,  955,  955,  955,  955,
+      955,  955,  955,  955,  955,  955,  955,  955,  955,  955,
+      955,  955,  955,  955,  955,  955,  955,  955,  955,  955,
+      955,  955,  955,  955,  955,  955,  955,  955,  955,  955,
+      955,  955,  955,  955,  955,  955,  955,  955,  955,  955,
+      955,  955,  955,  955,  955,  955,  955,  956,  957,  958,
+      959,  960,  961,  962,  963,  964,  891,  965,  966,  967,
+      968,  969,  969,  970,  971,  972,  973,  891,  488,  891,
+      974,  891,  974,  891,  891,  891,  891,  891,  891,  891,
+
+      891,  975,  976,  977,  978,  979,  980,  981,  982,  983,
+      984,  985,  986,  987,  988,  988,  988,  988,  988,  988,
+      988,  988,  988,  988,  988,  988,  988,  988,  988,  988,
+      988,  988,  988,  988,  988,  988,  988,  988,  988,  988,
+      988,  988,  988,  988,  988,  988,  988,  988,  988,  988,
+      988,  988,  988,  988,  988,  988,  988,  988,  988,  988,
+      988,  988,  988,  988,  988,  988,  988,  988,  988,  988,
+      988,  988,  988,  988,  988,  988,  989,  990,  991,  992,
+      993,  994,  995,  996,  997,  998,  999, 1000, 1001, 1002,
+     1003, 1004, 1005,  891,  891,  891,  891, 1006,  891,  596,
+
+      891,  891,  891,  600,  891, 1007, 1008, 1009, 1010, 1011,
+     1012, 1013, 1014, 1015, 1016, 1017, 1018, 1017, 1017, 1017,
+     1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017,
+     1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017,
+     1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017,
+     1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017,
+     1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1019,  891,
+     1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029,
+      891, 1030, 1031, 1032, 1033,  891,  686,  891,  891,  891,
+     1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1042,
+
+     1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1042, 1042, 1042, 1043, 1044, 1045, 1046,
+     1047, 1048,  891, 1049, 1034, 1036, 1050, 1051, 1041, 1042,
+     1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+     1042, 1052, 1053, 1046, 1054, 1047, 1055, 1048, 1056, 1057,
+     1050, 1058, 1051, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+
+     1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1059, 1052, 1060, 1053, 1061, 1054, 1062,
+     1055, 1063, 1056, 1064, 1057, 1058, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1065, 1059, 1060, 1061, 1062, 1036, 1063,
+     1064, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1042, 1065, 1036, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+     1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042,
+        0,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+
       891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
       891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
       891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
       891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
-      891,  891,  891,  891,  887,  887,  887,  893,  893,  893,
-
-      887,  893,  887,  894,  887,  902,  903,  895,  887,  887,
-      887,  887,  904,  905,  906,  896,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  907,
-      908,  887,   99,  887,  887,  887,  887,   99,  909,  887,
-      887,  104,  104,  887,  887,  887,  887,  887,  887,  887,
-      887,  910,  911,  912,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  899,  887,
-      913,  914,  915,  916,  917,  918,  887,  919,  919,  919,
-      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
-      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
-
-      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
-      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
-      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
-      919,  919,  919,  919,  919,  919,  919,  919,  919,  919,
-      919,  919,  919,  920,  921,  922,  923,  924,  925,  926,
-      927,  887,  887,  928,  929,  930,  931,  932,  933,  887,
-      887,  887,  887,  887,  934,  935,  936,  937,  887,  887,
-      887,  887,  887,  887,  887,  371,  376,  887,  887,  938,
-      939,  940,  887,  887,  887,  940,  887,  887,  887,  941,
-      942,  943,  944,  945,  946,  947,  948,  949,  950,  887,
-
-      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
-      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
-      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
-      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
-      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
-      951,  951,  951,  951,  951,  951,  951,  951,  951,  951,
-      951,  951,  951,  951,  951,  951,  951,  952,  953,  954,
-      955,  956,  957,  958,  959,  960,  887,  961,  962,  963,
-      964,  965,  965,  966,  967,  968,  969,  887,  488,  887,
-      970,  887,  970,  887,  887,  887,  887,  887,  887,  887,
-
-      887,  971,  972,  973,  974,  975,  976,  977,  978,  979,
-      980,  981,  982,  983,  984,  984,  984,  984,  984,  984,
-      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
-      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
-      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
-      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
-      984,  984,  984,  984,  984,  984,  984,  984,  984,  984,
-      984,  984,  984,  984,  984,  984,  985,  986,  987,  988,
-      989,  990,  991,  992,  993,  994,  995,  996,  997,  998,
-      999, 1000, 1001,  887,  887,  887,  887, 1002,  887,  596,
-
-      887,  887,  887,  600,  887, 1003, 1004, 1005, 1006, 1007,
-     1008, 1009, 1010, 1011, 1012, 1013, 1014, 1013, 1013, 1013,
-     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
-     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
-     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
-     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
-     1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1015,  887,
-     1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025,
-      887, 1026, 1027, 1028, 1029,  887,  686,  887,  887,  887,
-     1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1038,
-
-     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1038, 1038, 1038, 1038, 1038, 1038, 1039, 1040, 1041, 1042,
-     1043, 1044,  887, 1045, 1030, 1032, 1046, 1047, 1037, 1038,
-     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1048, 1049, 1042, 1050, 1043, 1051, 1044, 1052, 1053, 1046,
-     1054, 1047, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-
-     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1038, 1055, 1048, 1056, 1049, 1057, 1050, 1058, 1051, 1059,
-     1052, 1060, 1053, 1054, 1038, 1038, 1038, 1038, 1038, 1038,
-     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1061, 1055, 1056, 1057, 1058, 1032, 1059, 1060, 1038, 1038,
-     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1061, 1032, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038,
-     1038, 1038, 1038, 1038, 1038, 1038,    0,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891
     } ;
 
-static yyconst flex_int16_t yy_nxt[2908] =
+static yyconst flex_int16_t yy_nxt[2911] =
     {   0,
        12,   13,   14,   15,   15,   15,   13,   16,   17,   12,
@@ -804,5 +806,5 @@
 
        83,   83,   83,   82,   91,   93,   87,  142,  146,   98,
-       95,   99,   99,   99,   99,   99,   99,  252,  887,   94,
+       95,   99,   99,   99,   99,   99,   99,  252,  891,   94,
       100,   85,   96,   97,   85,  101,  161,  118,  143,   77,
        77,   77,   77,  144,  147,  102,  103,   87,  104,  104,
@@ -825,18 +827,18 @@
       305,  200,  201,  190,  257,  136,  200,  257,  137,  263,
 
-      887,  264,  192,  197,   81,   82,   82,   82,  197,   87,
+      891,  264,  192,  197,   81,   82,   82,   82,  197,   87,
       272,  198,  202,  202,  202,  202,  202,  202,   80,   81,
        82,   82,   82,   80,   87,  138,  139,  209,  210,  263,
-      887,  264,  209,  282,  211,  255,  263,  267,  264,  211,
-       82,   81,   82,   82,   82,   82,   87,  887,  212,  212,
-      212,  212,   82,   81,   83,   83,   83,   82,  887,  211,
+      891,  264,  209,  282,  211,  255,  263,  267,  264,  211,
+       82,   81,   82,   82,   82,   82,   87,  891,  212,  212,
+      212,  212,   82,   81,   83,   83,   83,   82,  891,  211,
        99,   99,   99,   99,   99,   99,  242,  242,  242,  242,
       266,  263,  263,  264,  264,  213,  143,  263,  211,  264,
        87,  144,  375,  211,  211,   87,   87,  211,  211,   87,
-       87,   87,  286,  241,  887,  211,   87,   87,  211,  243,
+       87,   87,  286,  241,  891,  211,   87,   87,  211,  243,
 
       211,  214,  211,  281,  215,  217,  278,  284,  285,  218,
       219,  307,  298,  279,  220,  221,   87,  222,   87,  223,
-       87,   87,  887,   87,  309,  300,   87,   87,  224,  225,
+       87,   87,  891,   87,  309,  300,   87,   87,  224,  225,
       226,  103,  303,  105,  105,  105,  105,  105,  105,   87,
       299,   87,  301,  302,   87,  304,  308,  310,   87,  227,
@@ -885,9 +887,9 @@
        87,  450,   87,   87,   87,  452,  455,  454,   87,  453,
       457,  462,  460,  461,   87,   87,  458,  464,   87,  515,
-      459,  463,  465,  466,  344,  201,  201,   87,  887,  344,
+      459,  463,  465,  466,  344,  201,  201,   87,  891,  344,
       467,  345,  199,  211,  211,  211,  211,  352,  352,  352,
       352,  360,  360,  361,  361,  371,  371,  371,  371,  371,
       371,  370,  569,  370,  492,  492,  371,  371,  371,  371,
-      371,  371,  887,   87,  493,  494,  477,  488,  488,  488,
+      371,  371,  891,   87,  493,  494,  477,  488,  488,  488,
 
       488,  488,  488,  233,  233,  233,  233,  233,  233,  516,
@@ -896,5 +898,5 @@
       489,  496,   87,  518,   87,  236,  374,  236,  519,  520,
       237,  521,  236,  376,  376,  376,  376,  376,  376,  383,
-       87,  384,  375,  496,   87,  385,  522,  496,  497,  887,
+       87,  384,  375,  496,   87,  385,  522,  496,  497,  891,
       497,  386,   87,  498,  498,  498,  498,  498,  498,   87,
       525,  495,  526,  387,   87,  524,  377,  384,  523,  496,
@@ -919,5 +921,5 @@
       236,  498,  498,  498,  498,  498,  498,  620,   87,  492,
       597,  599,  492,  600,  600,  600,  600,  600,  600,   87,
-      631,  622,   87,  887,  625,  887,   87,  862,   87,  601,
+      631,  622,   87,   87,  625,  891,   87,  891,   87,  601,
       497,  602,  497,  603,  602,  498,  498,  498,  498,  498,
       498,  624,  628,   87,   87,  630,  604,   87,   87,   87,
@@ -926,14 +928,14 @@
       634,   87,   87,  635,   87,   87,   87,  642,   87,   87,
       637,  641,   87,   87,  640,   87,   87,  643,  647,  639,
-       87,   87,  887,   87,   87,   87,  638,   87,   87,  644,
+       87,   87,  866,   87,   87,   87,  638,   87,   87,  644,
       645,  646,  648,  650,   87,   87,   87,  649,   87,  653,
       651,   87,  652,   87,  654,  655,   87,   87,   87,   87,
       656,  657,   87,  660,  659,  661,  664,   87,  658,   87,
        87,  663,   87,   87,   87,  668,  665,  688,  688,  662,
-      666,  701,  702,  887,  887,   87,  667,  488,  488,  488,
+      666,  701,  702,  891,  891,   87,  667,  488,  488,  488,
       488,  488,  488,  596,  596,  596,  596,  596,  596,  595,
       688,  595,  704,   87,  596,  596,  596,  596,  596,  596,
 
-      600,  600,  600,  600,  600,  600,  703,  688,   87,  887,
+      600,  600,  600,  600,  600,  600,  703,  688,   87,  891,
       594,  686,  686,  686,  686,  686,  686,  689,   87,  689,
        87,   87,  689,  699,   87,  708,   87,  601,  706,  602,
@@ -944,7 +946,7 @@
       715,   87,  721,  719,   87,  724,   87,   87,  722,  720,
       727,   87,   87,   87,  725,   87,  731,  723,   87,  732,
-      726,   87,   87,  861,  728,  734,   87,  733,  730,   87,
-
-      735,   87,   87,  729,   87,   87,  751,  736,  686,  686,
+      726,   87,   87,   87,  728,  734,   87,  733,  730,   87,
+
+      735,   87,   87,  729,   87,  863,  751,  736,  686,  686,
       686,  686,  686,  686,  600,  600,  600,  600,  600,  600,
       750,   87,  755,   87,  601,  763,  602,  752,  603,  602,
@@ -954,154 +956,154 @@
        87,  768,   87,  769,   87,   87,   87,   87,  770,   87,
        87,   87,   87,   87,  771,   87,  774,   87,  772,   87,
-       87,  779,   87,   87,  795,   87,  780,  773,   87,   87,
-      776,   87,  775,  803,  777,  796,  778,  686,  686,  686,
-
-      686,  686,  686,  793,   87,  794,  799,   87,  798,   87,
-      801,   87,   87,   87,  797,  804,  805,  800,  806,   87,
-       87,   87,  802,  807,   87,   87,   87,  808,   87,   87,
-      743,   87,   87,   87,  809,  828,   87,   87,   87,  830,
-      831,  833,   87,   87,   87,  834,   87,  836,  810,  811,
-      826,  827,   87,  829,   87,  825,  832,  837,   87,   87,
-       87,  838,  839,   87,   87,  835,   87,   87,   87,  851,
-      850,  855,   87,  852,  840,   87,   87,   87,  853,  857,
-      849,   87,   87,   87,  854,  858,  859,   87,   87,  856,
-      860,   87,  863,  864,  865,   87,   87,  866,   87,  868,
-
-      867,  869,   87,   87,   87,  870,   87,   87,   87,  873,
-       87,  875,   87,  876,   87,   87,   87,  874,   87,  872,
-       87,   87,   87,  871,   87,  880,   87,   87,   87,  887,
-      879,  881,  887,  848,  877,  878,  886,  887,  847,  884,
-      887,  845,  882,  883,  887,  844,  885,   69,   69,   69,
+       87,  780,   87,   87,  796,   87,  781,  773,  775,  777,
+       87,   87,  798,  776,  778,  797,  779,  686,  686,  686,
+
+      686,  686,  686,  794,   87,   87,   87,  795,  799,  802,
+      804,   87,   87,   87,  805,  806,   87,  801,  803,  808,
+      807,  800,   87,   87,   87,  809,   87,   87,   87,   87,
+      743,   87,   87,   87,   87,  830,  832,   87,   87,  810,
+      833,   87,  835,   87,   87,   87,  811,  829,  836,  812,
+      813,   87,  828,  840,  838,  827,  831,   87,   87,  834,
+      839,   87,   87,   87,   87,  837,   87,   87,   87,  854,
+       87,  853,  842,   87,  841,   87,  855,   87,  843,   87,
+      858,   87,  860,   87,  852,  870,  861,   87,  856,   87,
+      859,   87,   87,   87,  857,   87,  862,  868,  864,   87,
+
+      867,   87,  869,  881,   87,   87,  871,  872,  873,   87,
+      876,   87,  874,  875,  877,   87,   87,   87,   87,  879,
+      880,   87,   87,   87,   87,  878,   87,   87,   87,  891,
+       87,  884,  865,   87,   87,   87,  883,  885,   87,  882,
+      890,   87,  891,  891,  851,  886,  888,  887,  891,  889,
        69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
-       75,   75,   75,   75,   75,   75,   75,   75,   75,   75,
-       75,   75,   75,   78,   78,   78,   78,   78,   78,   78,
-       78,   78,   78,   78,   78,   78,   86,  887,  843,   86,
-      887,   86,   86,   86,   86,   86,  140,  842,   87,   87,
-
-      140,  140,  140,  140,  140,  140,  199,  199,  199,  199,
-      199,  199,  199,  199,  199,  199,  199,  199,  199,  204,
-       87,  887,  204,  824,  204,  204,  204,  204,  204,  208,
-      887,  208,  208,  823,  208,  208,  208,  208,  208,  208,
-      821,  208,  216,  887,  819,  216,  216,  216,  216,  216,
-      216,  216,  216,  887,  216,  239,  239,  239,  239,  239,
-      239,  239,  239,  239,  239,  239,  239,  239,  253,  253,
-      817,  253,  887,  815,  813,  253,  269,   87,   87,  269,
-       87,  269,  269,  269,  269,  269,  273,   87,  273,   87,
-       87,   87,  273,  275,   87,  275,   87,   87,   87,  275,
-
-      348,   87,  348,  887,  792,  790,  348,  350,  887,  350,
-      887,  787,  785,  350,  354,  783,  354,   87,   87,   87,
-      354,  356,   87,  356,   87,   87,   87,  356,  358,  749,
-      358,  746,  745,  743,  358,  365,  205,  365,  739,  738,
-      670,  365,  367,   87,  367,   87,   87,   87,  367,  239,
+       69,   69,   69,   75,   75,   75,   75,   75,   75,   75,
+       75,   75,   75,   75,   75,   75,   78,   78,   78,   78,
+       78,   78,   78,   78,   78,   78,   78,   78,   78,   86,
+      850,  891,   86,  848,   86,   86,   86,   86,   86,  140,
+
+      891,  847,  891,  140,  140,  140,  140,  140,  140,  199,
+      199,  199,  199,  199,  199,  199,  199,  199,  199,  199,
+      199,  199,  204,  846,  891,  204,  845,  204,  204,  204,
+      204,  204,  208,   87,  208,  208,   87,  208,  208,  208,
+      208,  208,  208,   87,  208,  216,  891,  826,  216,  216,
+      216,  216,  216,  216,  216,  216,  891,  216,  239,  239,
       239,  239,  239,  239,  239,  239,  239,  239,  239,  239,
-      239,  239,  380,   87,  380,  382,  382,   87,  382,  382,
-      382,   87,  382,  253,  253,   87,  253,  392,   87,  392,
-       87,   87,   87,  392,  394,   87,  394,   87,   87,  697,
-      394,  396,  696,  396,  694,  692,  690,  396,  273,  598,
-
-      273,  398,  685,  398,  684,  682,  680,  398,  275,  678,
-      275,   86,  676,  674,   86,  672,   86,   86,   86,   86,
-       86,  199,  199,  199,  199,  199,  199,  199,  199,  199,
-      199,  199,  199,  199,  468,  468,  468,  468,  468,  468,
-      468,  468,  468,  468,  468,  468,  468,  469,  670,  469,
-       87,   87,   87,  469,  471,   87,  471,   87,   87,   87,
-      471,  473,   87,  473,   87,   87,   87,  473,  348,  617,
-      348,  475,  615,  475,  613,  611,  609,  475,  350,  607,
-      350,  478,  502,  478,  605,  605,  594,  478,  354,  593,
-      354,  480,  591,  480,  483,  483,  589,  480,  356,  587,
-
-      356,  482,  585,  482,  583,  581,  579,  482,  358,   87,
-      358,  484,   87,  484,   87,   87,   87,  484,  365,   87,
-      365,  486,   87,  486,   87,  514,  512,  486,  367,  510,
-      367,  491,  508,  491,  506,  491,  504,  491,  380,  490,
-      380,  487,  380,  485,  380,  382,  382,  361,  382,  382,
-      382,  361,  382,  503,  483,  503,  481,  479,  476,  503,
-      505,  474,  505,  472,  470,   87,  505,  507,   87,  507,
-       87,  400,  399,  507,  392,  397,  392,  509,  395,  509,
-      393,  270,  265,  509,  394,  264,  394,  511,  389,  511,
-      389,  252,  379,  511,  396,  379,  396,  513,  240,  513,
-
-      374,  368,  366,  513,  398,  364,  398,   86,  360,  359,
-       86,  357,   86,   86,   86,   86,   86,  468,  468,  468,
+      239,  253,  253,  825,  253,  823,  891,  821,  253,  269,
+      891,  819,  269,  891,  269,  269,  269,  269,  269,  273,
+      817,  273,  815,   87,   87,  273,  275,   87,  275,   87,
+
+       87,   87,  275,  348,   87,  348,   87,   87,   87,  348,
+      350,   87,  350,   87,  891,  793,  350,  354,  791,  354,
+      891,  891,  788,  354,  356,  786,  356,  784,   87,   87,
+      356,  358,   87,  358,   87,   87,   87,  358,  365,   87,
+      365,  749,  746,  745,  365,  367,  743,  367,  205,  739,
+      738,  367,  239,  239,  239,  239,  239,  239,  239,  239,
+      239,  239,  239,  239,  239,  380,  670,  380,  382,  382,
+       87,  382,  382,  382,   87,  382,  253,  253,   87,  253,
+      392,   87,  392,   87,   87,   87,  392,  394,   87,  394,
+       87,   87,   87,  394,  396,   87,  396,   87,   87,   87,
+
+      396,  273,  697,  273,  398,  696,  398,  694,  692,  690,
+      398,  275,  598,  275,   86,  685,  684,   86,  682,   86,
+       86,   86,   86,   86,  199,  199,  199,  199,  199,  199,
+      199,  199,  199,  199,  199,  199,  199,  468,  468,  468,
       468,  468,  468,  468,  468,  468,  468,  468,  468,  468,
-      578,  355,  578,  351,  349,  205,  578,  469,  201,  469,
-      580,   87,  580,  277,  276,  274,  580,  471,  270,  471,
-      582,  265,  582,  268,  265,  263,  582,  473,  262,  473,
-      584,  261,  584,  240,  232,   85,  584,  475,   85,  475,
-      586,   87,  586,  205,  203,   85,  586,  478,  122,  478,
-      588,  117,  588,   87,  887,   70,  588,  480,   70,  480,
-      482,  887,  482,  887,  887,  887,  482,  590,  887,  590,
-
-      887,  887,  887,  590,  484,  887,  484,  592,  887,  592,
-      887,  887,  887,  592,  486,  887,  486,  491,  887,  491,
-      887,  491,  887,  491,  382,  887,  382,  887,  887,  887,
-      382,  606,  887,  606,  887,  887,  887,  606,  503,  887,
-      503,  608,  887,  608,  887,  887,  887,  608,  505,  887,
-      505,  610,  887,  610,  887,  887,  887,  610,  507,  887,
-      507,  612,  887,  612,  887,  887,  887,  612,  509,  887,
-      509,  614,  887,  614,  887,  887,  887,  614,  511,  887,
-      511,  616,  887,  616,  887,  887,  887,  616,  513,  887,
-      513,   86,  887,  887,   86,  887,   86,   86,   86,   86,
-
-       86,  669,  669,  669,  669,  669,  669,  669,  669,  669,
-      669,  669,  669,  669,  671,  887,  671,  887,  887,  887,
-      671,  578,  887,  578,  673,  887,  673,  887,  887,  887,
-      673,  580,  887,  580,  675,  887,  675,  887,  887,  887,
-      675,  582,  887,  582,  677,  887,  677,  887,  887,  887,
-      677,  584,  887,  584,  679,  887,  679,  887,  887,  887,
-      679,  586,  887,  586,  681,  887,  681,  887,  887,  887,
-      681,  588,  887,  588,  683,  887,  683,  887,  887,  887,
-      683,  590,  887,  590,   86,  887,   86,  887,  887,  887,
-       86,  592,  887,  592,  491,  887,  491,  887,  887,  887,
-
-      491,  691,  887,  691,  887,  887,  887,  691,  606,  887,
-      606,  693,  887,  693,  887,  887,  887,  693,  608,  887,
-      608,  695,  887,  695,  887,  887,  887,  695,  610,  887,
-      610,  140,  887,  140,  887,  887,  887,  140,  612,  887,
-      612,  698,  887,  698,  614,  887,  614,   86,  887,  887,
-       86,  887,   86,   86,   86,   86,   86,  616,  887,  616,
-      669,  669,  669,  669,  669,  669,  669,  669,  669,  669,
-      669,  669,  669,  737,  887,  737,  887,  887,  887,  737,
-      671,  887,  671,  204,  887,  204,  887,  887,  887,  204,
-      673,  887,  673,  740,  887,  740,  675,  887,  675,  204,
-
-      887,  887,  204,  887,  204,  204,  204,  204,  204,  677,
-      887,  677,  741,  887,  741,  679,  887,  679,  681,  887,
-      681,  742,  887,  742,  683,  887,  683,   86,  887,   86,
-      744,  887,  744,  887,  887,  887,  744,  691,  887,  691,
-      269,  887,  269,  887,  887,  887,  269,  693,  887,  693,
-      747,  887,  747,  695,  887,  695,  140,  887,  140,  748,
-      887,  748,  887,  887,  887,  748,   86,  887,  887,   86,
-      887,   86,   86,   86,   86,   86,  781,  887,  781,  737,
-      887,  737,  204,  887,  204,  782,  887,  782,  887,  887,
-      887,  782,  784,  887,  784,  887,  887,  887,  784,  786,
-
-      887,  786,  887,  887,  887,  786,  788,  887,  788,  789,
-      887,  789,  887,  887,  887,  789,  791,  887,  791,  887,
-      887,  887,  791,  812,  887,  812,  887,  887,  887,  812,
-      814,  887,  814,  887,  887,  887,  814,  816,  887,  816,
-      887,  887,  887,  816,  818,  887,  818,  887,  887,  887,
-      818,  820,  887,  820,  887,  887,  887,  820,  822,  887,
-      822,  887,  887,  887,  822,  616,  887,  616,  887,  887,
-      887,  616,  841,  887,  841,  887,  887,  887,  841,  677,
-      887,  677,  887,  887,  887,  677,  681,  887,  681,  887,
-      887,  887,  681,   86,  887,   86,  887,  887,  887,   86,
-
-      846,  887,  846,  887,  887,  887,  846,  140,  887,  140,
-      887,  887,  887,  140,  204,  887,  204,  887,  887,  887,
-      204,   11,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-
-      887,  887,  887,  887,  887,  887,  887
+      469,  680,  469,  678,  676,  674,  469,  471,  672,  471,
+      670,   87,   87,  471,  473,   87,  473,   87,   87,   87,
+      473,  348,   87,  348,  475,   87,  475,   87,   87,   87,
+      475,  350,  617,  350,  478,  615,  478,  613,  611,  609,
+      478,  354,  607,  354,  480,  502,  480,  605,  605,  594,
+
+      480,  356,  593,  356,  482,  591,  482,  483,  483,  589,
+      482,  358,  587,  358,  484,  585,  484,  583,  581,  579,
+      484,  365,   87,  365,  486,   87,  486,   87,   87,   87,
+      486,  367,   87,  367,  491,   87,  491,   87,  491,  514,
+      491,  380,  512,  380,  510,  380,  508,  380,  382,  382,
+      506,  382,  382,  382,  504,  382,  503,  490,  503,  487,
+      485,  361,  503,  505,  361,  505,  483,  481,  479,  505,
+      507,  476,  507,  474,  472,  470,  507,  392,   87,  392,
+      509,   87,  509,   87,  400,  399,  509,  394,  397,  394,
+      511,  395,  511,  393,  270,  265,  511,  396,  264,  396,
+
+      513,  389,  513,  389,  252,  379,  513,  398,  379,  398,
+       86,  240,  374,   86,  368,   86,   86,   86,   86,   86,
+      468,  468,  468,  468,  468,  468,  468,  468,  468,  468,
+      468,  468,  468,  578,  366,  578,  364,  360,  359,  578,
+      469,  357,  469,  580,  355,  580,  351,  349,  205,  580,
+      471,  201,  471,  582,   87,  582,  277,  276,  274,  582,
+      473,  270,  473,  584,  265,  584,  268,  265,  263,  584,
+      475,  262,  475,  586,  261,  586,  240,  232,   85,  586,
+      478,   85,  478,  588,   87,  588,  205,  203,   85,  588,
+      480,  122,  480,  482,  117,  482,   87,  891,   70,  482,
+
+      590,   70,  590,  891,  891,  891,  590,  484,  891,  484,
+      592,  891,  592,  891,  891,  891,  592,  486,  891,  486,
+      491,  891,  491,  891,  491,  891,  491,  382,  891,  382,
+      891,  891,  891,  382,  606,  891,  606,  891,  891,  891,
+      606,  503,  891,  503,  608,  891,  608,  891,  891,  891,
+      608,  505,  891,  505,  610,  891,  610,  891,  891,  891,
+      610,  507,  891,  507,  612,  891,  612,  891,  891,  891,
+      612,  509,  891,  509,  614,  891,  614,  891,  891,  891,
+      614,  511,  891,  511,  616,  891,  616,  891,  891,  891,
+      616,  513,  891,  513,   86,  891,  891,   86,  891,   86,
+
+       86,   86,   86,   86,  669,  669,  669,  669,  669,  669,
+      669,  669,  669,  669,  669,  669,  669,  671,  891,  671,
+      891,  891,  891,  671,  578,  891,  578,  673,  891,  673,
+      891,  891,  891,  673,  580,  891,  580,  675,  891,  675,
+      891,  891,  891,  675,  582,  891,  582,  677,  891,  677,
+      891,  891,  891,  677,  584,  891,  584,  679,  891,  679,
+      891,  891,  891,  679,  586,  891,  586,  681,  891,  681,
+      891,  891,  891,  681,  588,  891,  588,  683,  891,  683,
+      891,  891,  891,  683,  590,  891,  590,   86,  891,   86,
+      891,  891,  891,   86,  592,  891,  592,  491,  891,  491,
+
+      891,  891,  891,  491,  691,  891,  691,  891,  891,  891,
+      691,  606,  891,  606,  693,  891,  693,  891,  891,  891,
+      693,  608,  891,  608,  695,  891,  695,  891,  891,  891,
+      695,  610,  891,  610,  140,  891,  140,  891,  891,  891,
+      140,  612,  891,  612,  698,  891,  698,  614,  891,  614,
+       86,  891,  891,   86,  891,   86,   86,   86,   86,   86,
+      616,  891,  616,  669,  669,  669,  669,  669,  669,  669,
+      669,  669,  669,  669,  669,  669,  737,  891,  737,  891,
+      891,  891,  737,  671,  891,  671,  204,  891,  204,  891,
+      891,  891,  204,  673,  891,  673,  740,  891,  740,  675,
+
+      891,  675,  204,  891,  891,  204,  891,  204,  204,  204,
+      204,  204,  677,  891,  677,  741,  891,  741,  679,  891,
+      679,  681,  891,  681,  742,  891,  742,  683,  891,  683,
+       86,  891,   86,  744,  891,  744,  891,  891,  891,  744,
+      691,  891,  691,  269,  891,  269,  891,  891,  891,  269,
+      693,  891,  693,  747,  891,  747,  695,  891,  695,  140,
+      891,  140,  748,  891,  748,  891,  891,  891,  748,   86,
+      891,  891,   86,  891,   86,   86,   86,   86,   86,  782,
+      891,  782,  737,  891,  737,  204,  891,  204,  783,  891,
+      783,  891,  891,  891,  783,  785,  891,  785,  891,  891,
+
+      891,  785,  787,  891,  787,  891,  891,  891,  787,  789,
+      891,  789,  790,  891,  790,  891,  891,  891,  790,  792,
+      891,  792,  891,  891,  891,  792,  814,  891,  814,  891,
+      891,  891,  814,  816,  891,  816,  891,  891,  891,  816,
+      818,  891,  818,  891,  891,  891,  818,  820,  891,  820,
+      891,  891,  891,  820,  822,  891,  822,  891,  891,  891,
+      822,  824,  891,  824,  891,  891,  891,  824,  616,  891,
+      616,  891,  891,  891,  616,  844,  891,  844,  891,  891,
+      891,  844,  677,  891,  677,  891,  891,  891,  677,  681,
+      891,  681,  891,  891,  891,  681,   86,  891,   86,  891,
+
+      891,  891,   86,  849,  891,  849,  891,  891,  891,  849,
+      140,  891,  140,  891,  891,  891,  140,  204,  891,  204,
+      891,  891,  891,  204,   11,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891
     } ;
 
-static yyconst flex_int16_t yy_chk[2908] =
+static yyconst flex_int16_t yy_chk[2911] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -1124,5 +1126,5 @@
         5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
         5,    5,    5,    5,    5,    5,    5,    5,    5,    7,
-        8,    9,   10,   37,   37,   20,   39,    9,   10,  886,
+        8,    9,   10,   37,   37,   20,   39,    9,   10,  890,
         7,    8,   13,   13,   13,   13,   13,   13,   15,   15,
 
@@ -1135,5 +1137,5 @@
        47,   45,   45,   45,   49,   30,   30,   45,   45,   49,
        45,   30,   40,   45,   45,   40,   49,   30,   45,   56,
-       62,   45,   49,   30,   73,  885,  127,   53,  127,   51,
+       62,   45,   49,   30,   73,  889,  127,   53,  127,   51,
        61,   30,   62,   55,   30,   31,  108,   31,   31,   31,
 
@@ -1149,9 +1151,9 @@
       164,   68,   68,   59,  113,   38,   68,  116,   38,  131,
 
-      110,  131,   60,   67,   67,   67,   67,   67,   67,  877,
+      110,  131,   60,   67,   67,   67,   67,   67,   67,  881,
       142,   67,   68,   68,   68,   68,   68,   68,   80,   80,
        80,   80,   80,   80,  153,   38,   38,   77,   77,  134,
       110,  134,   77,  153,   77,  110,  135,  135,  135,   77,
-       82,   82,   82,   82,   82,   82,  876,  243,   77,   77,
+       82,   82,   82,   82,   82,   82,  880,  243,   77,   77,
        77,   77,   83,   83,   83,   83,   83,   83,  110,   77,
       103,  103,  103,  103,  103,  103,  104,  104,  104,  104,
@@ -1163,5 +1165,5 @@
        85,  166,  159,  150,   85,   85,  161,   85,  160,   85,
       145,  162,  104,  167,  168,  161,  169,  163,   85,   85,
-       85,  105,  163,  105,  105,  105,  105,  105,  105,  873,
+       85,  105,  163,  105,  105,  105,  105,  105,  105,  877,
       160,  171,  162,  162,  165,  163,  167,  169,  173,   85,
       105,  106,   85,  106,  165,  172,  106,  106,  106,  106,
@@ -1176,5 +1178,5 @@
       189,  158,  158,  188,  192,  158,  194,  158,  284,  219,
       185,  219,  158,  158,  158,  193,  158,  192,  220,  194,
-      220,  191,  198,  198,  191,  192,  205,  198,  193,  872,
+      220,  191,  198,  198,  191,  192,  205,  198,  193,  876,
       193,  197,  197,  197,  197,  197,  197,  200,  200,  197,
       248,  221,  200,  198,  198,  198,  198,  198,  198,  202,
@@ -1193,9 +1195,9 @@
       245,  245,  270,  288,  293,  286,  294,  300,  306,  293,
 
-      308,  244,  300,  306,  870,  294,  308,  244,  246,  246,
+      308,  244,  300,  306,  874,  294,  308,  244,  246,  246,
       246,  246,  246,  246,  253,  286,  288,  255,  255,  255,
       255,  255,  255,  287,  246,  247,  246,  247,  246,  246,
       247,  247,  247,  247,  247,  247,  290,  253,  287,  253,
-      869,  246,  289,  253,  287,  287,  246,  292,  246,  253,
+      873,  246,  289,  253,  287,  287,  246,  292,  246,  253,
       255,  246,  291,  246,  260,  260,  260,  260,  260,  260,
       289,  253,  290,  292,  292,  253,  295,  291,  296,  253,
@@ -1209,12 +1211,12 @@
       335,  324,  337,  339,  340,  326,  329,  328,  401,  327,
       331,  337,  334,  335,  341,  343,  332,  340,  342,  401,
-      333,  339,  341,  342,  344,  344,  345,  460,  862,  344,
+      333,  339,  341,  342,  344,  344,  345,  460,  866,  344,
       343,  344,  345,  352,  352,  352,  352,  353,  353,  353,
       353,  362,  363,  362,  363,  370,  370,  370,  370,  370,
       370,  372,  460,  372,  380,  381,  372,  372,  372,  372,
-      372,  372,  861,  402,  380,  381,  352,  371,  371,  371,
+      372,  372,  865,  402,  380,  381,  352,  371,  371,  371,
 
       371,  371,  371,  374,  374,  374,  374,  374,  374,  402,
-      380,  381,  403,  371,  404,  371,  860,  371,  371,  375,
+      380,  381,  403,  371,  404,  371,  864,  371,  371,  375,
       375,  375,  375,  375,  375,  383,  382,  403,  406,  405,
       371,  383,  407,  404,  408,  371,  374,  371,  405,  406,
@@ -1233,5 +1235,5 @@
       450,  453,  442,  444,  455,  456,  447,  457,  458,  449,
       459,  461,  463,  455,  451,  458,  454,  459,  462,  452,
-      457,  453,  466,  456,  464,  467,  462,  525,  859,  463,
+      457,  453,  466,  456,  464,  467,  462,  525,  863,  463,
       525,  468,  491,  461,  467,  464,  462,  468,  477,  477,
       477,  477,  491,  515,  466,  488,  488,  488,  488,  488,
@@ -1239,9 +1241,9 @@
       488,  490,  490,  490,  490,  490,  490,  519,  491,  521,
       515,  488,  492,  488,  492,  488,  488,  492,  492,  492,
-      492,  492,  492,  494,  516,  495,  493,  519,  488,  855,
-      851,  521,  518,  488,  490,  488,  493,  516,  488,  529,
+      492,  492,  492,  494,  516,  495,  493,  519,  488,  862,
+      858,  521,  518,  488,  490,  488,  493,  516,  488,  529,
       488,  497,  497,  497,  497,  497,  497,  518,  520,  494,
       492,  495,  493,  498,  498,  498,  498,  498,  498,  523,
-      529,  520,  526,  848,  523,  847,  528,  846,  522,  498,
+      529,  520,  526,  854,  523,  851,  528,  850,  522,  498,
       499,  498,  499,  498,  498,  499,  499,  499,  499,  499,
       499,  522,  526,  524,  527,  528,  498,  531,  530,  532,
@@ -1250,14 +1252,14 @@
       532,  535,  537,  533,  536,  538,  539,  541,  542,  547,
       535,  539,  544,  541,  538,  545,  546,  542,  547,  537,
-      550,  551,  845,  549,  534,  552,  536,  554,  560,  544,
+      550,  551,  849,  549,  534,  552,  536,  554,  560,  544,
       545,  546,  549,  551,  555,  557,  558,  550,  561,  555,
       552,  562,  554,  565,  557,  558,  564,  567,  566,  568,
       560,  561,  575,  565,  564,  566,  569,  571,  562,  574,
       572,  568,  569,  620,  619,  575,  571,  601,  601,  567,
-      572,  619,  620,  844,  843,  622,  574,  594,  594,  594,
+      572,  619,  620,  848,  847,  622,  574,  594,  594,  594,
       594,  594,  594,  595,  595,  595,  595,  595,  595,  597,
       601,  597,  622,  621,  597,  597,  597,  597,  597,  597,
 
-      600,  600,  600,  600,  600,  600,  621,  602,  626,  842,
+      600,  600,  600,  600,  600,  600,  621,  602,  626,  846,
       594,  596,  596,  596,  596,  596,  596,  603,  618,  603,
       623,  624,  603,  618,  628,  626,  625,  596,  624,  596,
@@ -1268,7 +1270,7 @@
       633,  646,  639,  637,  650,  642,  651,  656,  640,  638,
       646,  653,  657,  636,  644,  665,  656,  641,  664,  657,
-      645,  667,  668,  841,  650,  665,  700,  664,  653,  699,
-
-      667,  702,  705,  651,  714,  837,  700,  668,  686,  686,
+      645,  667,  668,  842,  650,  665,  700,  664,  653,  699,
+
+      667,  702,  705,  651,  714,  842,  700,  668,  686,  686,
       686,  686,  686,  686,  690,  690,  690,  690,  690,  690,
       699,  708,  705,  703,  686,  714,  686,  702,  686,  686,
@@ -1276,157 +1278,157 @@
       712,  686,  711,  717,  710,  718,  686,  690,  686,  712,
       720,  686,  717,  686,  713,  711,  716,  713,  719,  716,
-      721,  719,  715,  720,  722,  723,  724,  725,  721,  728,
-      731,  718,  732,  735,  722,  733,  725,  736,  723,  756,
-      757,  735,  836,  754,  756,  759,  736,  724,  755,  760,
-      731,  761,  728,  764,  732,  757,  733,  743,  743,  743,
-
-      743,  743,  743,  754,  758,  755,  760,  762,  759,  763,
-      762,  769,  766,  768,  758,  766,  768,  761,  769,  772,
-      770,  764,  763,  770,  771,  773,  778,  771,  793,  795,
-      743,  798,  797,  796,  772,  797,  799,  800,  802,  799,
-      800,  803,  804,  806,  807,  804,  810,  807,  773,  778,
-      795,  796,  809,  798,  808,  793,  802,  808,  811,  826,
-      830,  809,  810,  827,  829,  806,  828,  803,  831,  828,
-      827,  831,  832,  829,  811,  834,  835,  839,  830,  835,
-      826,  840,  838,  849,  830,  838,  839,  853,  850,  832,
-      840,  852,  849,  850,  852,  854,  856,  853,  857,  856,
-
-      854,  857,  858,  863,  864,  858,  865,  866,  867,  865,
-      868,  867,  871,  868,  874,  875,  878,  866,  879,  864,
-      880,  882,  881,  863,  883,  878,  884,  833,  825,  824,
-      875,  879,  823,  822,  871,  874,  884,  821,  820,  882,
-      819,  818,  880,  881,  817,  816,  883,  888,  888,  888,
-      888,  888,  888,  888,  888,  888,  888,  888,  888,  888,
-      889,  889,  889,  889,  889,  889,  889,  889,  889,  889,
-      889,  889,  889,  890,  890,  890,  890,  890,  890,  890,
-      890,  890,  890,  890,  890,  890,  891,  815,  814,  891,
-      813,  891,  891,  891,  891,  891,  892,  812,  805,  801,
-
-      892,  892,  892,  892,  892,  892,  893,  893,  893,  893,
-      893,  893,  893,  893,  893,  893,  893,  893,  893,  894,
-      794,  792,  894,  791,  894,  894,  894,  894,  894,  895,
-      790,  895,  895,  789,  895,  895,  895,  895,  895,  895,
-      788,  895,  896,  787,  786,  896,  896,  896,  896,  896,
-      896,  896,  896,  785,  896,  897,  897,  897,  897,  897,
-      897,  897,  897,  897,  897,  897,  897,  897,  898,  898,
-      784,  898,  783,  782,  781,  898,  899,  780,  779,  899,
-      777,  899,  899,  899,  899,  899,  900,  776,  900,  775,
-      774,  767,  900,  901,  765,  901,  753,  752,  751,  901,
-
-      902,  750,  902,  749,  748,  747,  902,  903,  746,  903,
-      745,  742,  741,  903,  904,  740,  904,  734,  730,  729,
-      904,  905,  727,  905,  726,  709,  701,  905,  906,  698,
-      906,  693,  691,  687,  906,  907,  677,  907,  673,  671,
-      669,  907,  908,  666,  908,  663,  662,  661,  908,  909,
-      909,  909,  909,  909,  909,  909,  909,  909,  909,  909,
-      909,  909,  910,  660,  910,  911,  911,  659,  911,  911,
-      911,  658,  911,  912,  912,  655,  912,  913,  654,  913,
-      652,  649,  648,  913,  914,  647,  914,  643,  616,  612,
-      914,  915,  610,  915,  608,  606,  604,  915,  916,  598,
-
-      916,  917,  592,  917,  590,  588,  586,  917,  918,  584,
-      918,  919,  582,  580,  919,  578,  919,  919,  919,  919,
-      919,  920,  920,  920,  920,  920,  920,  920,  920,  920,
-      920,  920,  920,  920,  921,  921,  921,  921,  921,  921,
-      921,  921,  921,  921,  921,  921,  921,  922,  577,  922,
-      576,  573,  570,  922,  923,  563,  923,  559,  556,  553,
-      923,  924,  548,  924,  543,  540,  517,  924,  925,  513,
-      925,  926,  511,  926,  509,  507,  505,  926,  927,  503,
-      927,  928,  502,  928,  501,  500,  489,  928,  929,  486,
-      929,  930,  484,  930,  483,  482,  480,  930,  931,  478,
-
-      931,  932,  475,  932,  473,  471,  469,  932,  933,  465,
-      933,  934,  448,  934,  446,  438,  436,  934,  935,  428,
-      935,  936,  426,  936,  424,  398,  396,  936,  937,  394,
-      937,  938,  392,  938,  391,  938,  390,  938,  939,  377,
-      939,  367,  939,  365,  939,  940,  940,  364,  940,  940,
-      940,  360,  940,  941,  358,  941,  356,  354,  350,  941,
-      942,  348,  942,  347,  346,  336,  942,  943,  321,  943,
-      298,  277,  275,  943,  944,  273,  944,  945,  272,  945,
-      271,  269,  268,  945,  946,  263,  946,  947,  259,  947,
-      258,  254,  251,  947,  948,  250,  948,  949,  239,  949,
-
-      238,  231,  230,  949,  950,  227,  950,  951,  217,  215,
-      951,  214,  951,  951,  951,  951,  951,  952,  952,  952,
-      952,  952,  952,  952,  952,  952,  952,  952,  952,  952,
-      953,  213,  953,  207,  206,  204,  953,  954,  199,  954,
-      955,  178,  955,  149,  147,  146,  955,  956,  140,  956,
-      957,  138,  957,  136,  128,  125,  957,  958,  124,  958,
-      959,  120,  959,  101,   98,   95,  959,  960,   93,  960,
-      961,   86,  961,   72,   70,   66,  961,  962,   36,  962,
-      963,   33,  963,   18,   11,    4,  963,  964,    3,  964,
-      965,    0,  965,    0,    0,    0,  965,  966,    0,  966,
-
-        0,    0,    0,  966,  967,    0,  967,  968,    0,  968,
-        0,    0,    0,  968,  969,    0,  969,  970,    0,  970,
-        0,  970,    0,  970,  971,    0,  971,    0,    0,    0,
-      971,  972,    0,  972,    0,    0,    0,  972,  973,    0,
-      973,  974,    0,  974,    0,    0,    0,  974,  975,    0,
-      975,  976,    0,  976,    0,    0,    0,  976,  977,    0,
-      977,  978,    0,  978,    0,    0,    0,  978,  979,    0,
-      979,  980,    0,  980,    0,    0,    0,  980,  981,    0,
-      981,  982,    0,  982,    0,    0,    0,  982,  983,    0,
-      983,  984,    0,    0,  984,    0,  984,  984,  984,  984,
-
-      984,  985,  985,  985,  985,  985,  985,  985,  985,  985,
-      985,  985,  985,  985,  986,    0,  986,    0,    0,    0,
-      986,  987,    0,  987,  988,    0,  988,    0,    0,    0,
-      988,  989,    0,  989,  990,    0,  990,    0,    0,    0,
-      990,  991,    0,  991,  992,    0,  992,    0,    0,    0,
-      992,  993,    0,  993,  994,    0,  994,    0,    0,    0,
-      994,  995,    0,  995,  996,    0,  996,    0,    0,    0,
-      996,  997,    0,  997,  998,    0,  998,    0,    0,    0,
-      998,  999,    0,  999, 1000,    0, 1000,    0,    0,    0,
-     1000, 1001,    0, 1001, 1002,    0, 1002,    0,    0,    0,
-
-     1002, 1003,    0, 1003,    0,    0,    0, 1003, 1004,    0,
-     1004, 1005,    0, 1005,    0,    0,    0, 1005, 1006,    0,
-     1006, 1007,    0, 1007,    0,    0,    0, 1007, 1008,    0,
-     1008, 1009,    0, 1009,    0,    0,    0, 1009, 1010,    0,
-     1010, 1011,    0, 1011, 1012,    0, 1012, 1013,    0,    0,
-     1013,    0, 1013, 1013, 1013, 1013, 1013, 1014,    0, 1014,
-     1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015,
-     1015, 1015, 1015, 1016,    0, 1016,    0,    0,    0, 1016,
-     1017,    0, 1017, 1018,    0, 1018,    0,    0,    0, 1018,
-     1019,    0, 1019, 1020,    0, 1020, 1021,    0, 1021, 1022,
-
-        0,    0, 1022,    0, 1022, 1022, 1022, 1022, 1022, 1023,
-        0, 1023, 1024,    0, 1024, 1025,    0, 1025, 1026,    0,
-     1026, 1027,    0, 1027, 1028,    0, 1028, 1029,    0, 1029,
-     1030,    0, 1030,    0,    0,    0, 1030, 1031,    0, 1031,
-     1032,    0, 1032,    0,    0,    0, 1032, 1033,    0, 1033,
-     1034,    0, 1034, 1035,    0, 1035, 1036,    0, 1036, 1037,
-        0, 1037,    0,    0,    0, 1037, 1038,    0,    0, 1038,
-        0, 1038, 1038, 1038, 1038, 1038, 1039,    0, 1039, 1040,
-        0, 1040, 1041,    0, 1041, 1042,    0, 1042,    0,    0,
-        0, 1042, 1043,    0, 1043,    0,    0,    0, 1043, 1044,
-
-        0, 1044,    0,    0,    0, 1044, 1045,    0, 1045, 1046,
-        0, 1046,    0,    0,    0, 1046, 1047,    0, 1047,    0,
-        0,    0, 1047, 1048,    0, 1048,    0,    0,    0, 1048,
-     1049,    0, 1049,    0,    0,    0, 1049, 1050,    0, 1050,
-        0,    0,    0, 1050, 1051,    0, 1051,    0,    0,    0,
-     1051, 1052,    0, 1052,    0,    0,    0, 1052, 1053,    0,
-     1053,    0,    0,    0, 1053, 1054,    0, 1054,    0,    0,
-        0, 1054, 1055,    0, 1055,    0,    0,    0, 1055, 1056,
-        0, 1056,    0,    0,    0, 1056, 1057,    0, 1057,    0,
-        0,    0, 1057, 1058,    0, 1058,    0,    0,    0, 1058,
-
-     1059,    0, 1059,    0,    0,    0, 1059, 1060,    0, 1060,
-        0,    0,    0, 1060, 1061,    0, 1061,    0,    0,    0,
-     1061,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-      887,  887,  887,  887,  887,  887,  887,  887,  887,  887,
-
-      887,  887,  887,  887,  887,  887,  887
+      721,  719,  715,  720,  722,  723,  724,  725,  721,  731,
+      728,  718,  732,  735,  722,  733,  725,  736,  723,  756,
+      757,  735,  758,  754,  756,  759,  736,  724,  728,  731,
+      755,  761,  758,  728,  732,  757,  733,  743,  743,  743,
+
+      743,  743,  743,  754,  760,  763,  762,  755,  759,  762,
+      764,  766,  768,  769,  766,  768,  770,  761,  763,  770,
+      769,  760,  771,  773,  772,  771,  775,  779,  794,  797,
+      743,  796,  798,  800,  799,  798,  800,  801,  764,  772,
+      801,  803,  804,  807,  810,  805,  773,  797,  805,  775,
+      779,  808,  796,  810,  808,  794,  799,  809,  811,  803,
+      809,  812,  813,  828,  829,  807,  830,  831,  804,  830,
+      832,  829,  812,  834,  811,  856,  831,  833,  813,  837,
+      833,  875,  837,  840,  828,  856,  840,  841,  832,  843,
+      834,  852,  853,  867,  832,  868,  841,  853,  843,  855,
+
+      852,  857,  855,  875,  859,  860,  857,  859,  860,  861,
+      868,  869,  861,  867,  869,  870,  871,  872,  878,  871,
+      872,  879,  882,  884,  883,  870,  885,  887,  886,  845,
+      888,  882,  844,  839,  838,  836,  879,  883,  835,  878,
+      888,  827,  826,  825,  824,  884,  886,  885,  823,  887,
+      892,  892,  892,  892,  892,  892,  892,  892,  892,  892,
+      892,  892,  892,  893,  893,  893,  893,  893,  893,  893,
+      893,  893,  893,  893,  893,  893,  894,  894,  894,  894,
+      894,  894,  894,  894,  894,  894,  894,  894,  894,  895,
+      822,  821,  895,  820,  895,  895,  895,  895,  895,  896,
+
+      819,  818,  817,  896,  896,  896,  896,  896,  896,  897,
+      897,  897,  897,  897,  897,  897,  897,  897,  897,  897,
+      897,  897,  898,  816,  815,  898,  814,  898,  898,  898,
+      898,  898,  899,  806,  899,  899,  802,  899,  899,  899,
+      899,  899,  899,  795,  899,  900,  793,  792,  900,  900,
+      900,  900,  900,  900,  900,  900,  791,  900,  901,  901,
+      901,  901,  901,  901,  901,  901,  901,  901,  901,  901,
+      901,  902,  902,  790,  902,  789,  788,  787,  902,  903,
+      786,  785,  903,  784,  903,  903,  903,  903,  903,  904,
+      783,  904,  782,  781,  780,  904,  905,  778,  905,  777,
+
+      776,  774,  905,  906,  767,  906,  765,  753,  752,  906,
+      907,  751,  907,  750,  749,  748,  907,  908,  747,  908,
+      746,  745,  742,  908,  909,  741,  909,  740,  734,  730,
+      909,  910,  729,  910,  727,  726,  709,  910,  911,  701,
+      911,  698,  693,  691,  911,  912,  687,  912,  677,  673,
+      671,  912,  913,  913,  913,  913,  913,  913,  913,  913,
+      913,  913,  913,  913,  913,  914,  669,  914,  915,  915,
+      666,  915,  915,  915,  663,  915,  916,  916,  662,  916,
+      917,  661,  917,  660,  659,  658,  917,  918,  655,  918,
+      654,  652,  649,  918,  919,  648,  919,  647,  643,  616,
+
+      919,  920,  612,  920,  921,  610,  921,  608,  606,  604,
+      921,  922,  598,  922,  923,  592,  590,  923,  588,  923,
+      923,  923,  923,  923,  924,  924,  924,  924,  924,  924,
+      924,  924,  924,  924,  924,  924,  924,  925,  925,  925,
+      925,  925,  925,  925,  925,  925,  925,  925,  925,  925,
+      926,  586,  926,  584,  582,  580,  926,  927,  578,  927,
+      577,  576,  573,  927,  928,  570,  928,  563,  559,  556,
+      928,  929,  553,  929,  930,  548,  930,  543,  540,  517,
+      930,  931,  513,  931,  932,  511,  932,  509,  507,  505,
+      932,  933,  503,  933,  934,  502,  934,  501,  500,  489,
+
+      934,  935,  486,  935,  936,  484,  936,  483,  482,  480,
+      936,  937,  478,  937,  938,  475,  938,  473,  471,  469,
+      938,  939,  465,  939,  940,  448,  940,  446,  438,  436,
+      940,  941,  428,  941,  942,  426,  942,  424,  942,  398,
+      942,  943,  396,  943,  394,  943,  392,  943,  944,  944,
+      391,  944,  944,  944,  390,  944,  945,  377,  945,  367,
+      365,  364,  945,  946,  360,  946,  358,  356,  354,  946,
+      947,  350,  947,  348,  347,  346,  947,  948,  336,  948,
+      949,  321,  949,  298,  277,  275,  949,  950,  273,  950,
+      951,  272,  951,  271,  269,  268,  951,  952,  263,  952,
+
+      953,  259,  953,  258,  254,  251,  953,  954,  250,  954,
+      955,  239,  238,  955,  231,  955,  955,  955,  955,  955,
+      956,  956,  956,  956,  956,  956,  956,  956,  956,  956,
+      956,  956,  956,  957,  230,  957,  227,  217,  215,  957,
+      958,  214,  958,  959,  213,  959,  207,  206,  204,  959,
+      960,  199,  960,  961,  178,  961,  149,  147,  146,  961,
+      962,  140,  962,  963,  138,  963,  136,  128,  125,  963,
+      964,  124,  964,  965,  120,  965,  101,   98,   95,  965,
+      966,   93,  966,  967,   86,  967,   72,   70,   66,  967,
+      968,   36,  968,  969,   33,  969,   18,   11,    4,  969,
+
+      970,    3,  970,    0,    0,    0,  970,  971,    0,  971,
+      972,    0,  972,    0,    0,    0,  972,  973,    0,  973,
+      974,    0,  974,    0,  974,    0,  974,  975,    0,  975,
+        0,    0,    0,  975,  976,    0,  976,    0,    0,    0,
+      976,  977,    0,  977,  978,    0,  978,    0,    0,    0,
+      978,  979,    0,  979,  980,    0,  980,    0,    0,    0,
+      980,  981,    0,  981,  982,    0,  982,    0,    0,    0,
+      982,  983,    0,  983,  984,    0,  984,    0,    0,    0,
+      984,  985,    0,  985,  986,    0,  986,    0,    0,    0,
+      986,  987,    0,  987,  988,    0,    0,  988,    0,  988,
+
+      988,  988,  988,  988,  989,  989,  989,  989,  989,  989,
+      989,  989,  989,  989,  989,  989,  989,  990,    0,  990,
+        0,    0,    0,  990,  991,    0,  991,  992,    0,  992,
+        0,    0,    0,  992,  993,    0,  993,  994,    0,  994,
+        0,    0,    0,  994,  995,    0,  995,  996,    0,  996,
+        0,    0,    0,  996,  997,    0,  997,  998,    0,  998,
+        0,    0,    0,  998,  999,    0,  999, 1000,    0, 1000,
+        0,    0,    0, 1000, 1001,    0, 1001, 1002,    0, 1002,
+        0,    0,    0, 1002, 1003,    0, 1003, 1004,    0, 1004,
+        0,    0,    0, 1004, 1005,    0, 1005, 1006,    0, 1006,
+
+        0,    0,    0, 1006, 1007,    0, 1007,    0,    0,    0,
+     1007, 1008,    0, 1008, 1009,    0, 1009,    0,    0,    0,
+     1009, 1010,    0, 1010, 1011,    0, 1011,    0,    0,    0,
+     1011, 1012,    0, 1012, 1013,    0, 1013,    0,    0,    0,
+     1013, 1014,    0, 1014, 1015,    0, 1015, 1016,    0, 1016,
+     1017,    0,    0, 1017,    0, 1017, 1017, 1017, 1017, 1017,
+     1018,    0, 1018, 1019, 1019, 1019, 1019, 1019, 1019, 1019,
+     1019, 1019, 1019, 1019, 1019, 1019, 1020,    0, 1020,    0,
+        0,    0, 1020, 1021,    0, 1021, 1022,    0, 1022,    0,
+        0,    0, 1022, 1023,    0, 1023, 1024,    0, 1024, 1025,
+
+        0, 1025, 1026,    0,    0, 1026,    0, 1026, 1026, 1026,
+     1026, 1026, 1027,    0, 1027, 1028,    0, 1028, 1029,    0,
+     1029, 1030,    0, 1030, 1031,    0, 1031, 1032,    0, 1032,
+     1033,    0, 1033, 1034,    0, 1034,    0,    0,    0, 1034,
+     1035,    0, 1035, 1036,    0, 1036,    0,    0,    0, 1036,
+     1037,    0, 1037, 1038,    0, 1038, 1039,    0, 1039, 1040,
+        0, 1040, 1041,    0, 1041,    0,    0,    0, 1041, 1042,
+        0,    0, 1042,    0, 1042, 1042, 1042, 1042, 1042, 1043,
+        0, 1043, 1044,    0, 1044, 1045,    0, 1045, 1046,    0,
+     1046,    0,    0,    0, 1046, 1047,    0, 1047,    0,    0,
+
+        0, 1047, 1048,    0, 1048,    0,    0,    0, 1048, 1049,
+        0, 1049, 1050,    0, 1050,    0,    0,    0, 1050, 1051,
+        0, 1051,    0,    0,    0, 1051, 1052,    0, 1052,    0,
+        0,    0, 1052, 1053,    0, 1053,    0,    0,    0, 1053,
+     1054,    0, 1054,    0,    0,    0, 1054, 1055,    0, 1055,
+        0,    0,    0, 1055, 1056,    0, 1056,    0,    0,    0,
+     1056, 1057,    0, 1057,    0,    0,    0, 1057, 1058,    0,
+     1058,    0,    0,    0, 1058, 1059,    0, 1059,    0,    0,
+        0, 1059, 1060,    0, 1060,    0,    0,    0, 1060, 1061,
+        0, 1061,    0,    0,    0, 1061, 1062,    0, 1062,    0,
+
+        0,    0, 1062, 1063,    0, 1063,    0,    0,    0, 1063,
+     1064,    0, 1064,    0,    0,    0, 1064, 1065,    0, 1065,
+        0,    0,    0, 1065,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891,
+
+      891,  891,  891,  891,  891,  891,  891,  891,  891,  891
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[181] =
+static yyconst flex_int32_t yy_rule_can_match_eol[182] =
     {   0,
 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
@@ -1435,9 +1437,9 @@
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 
-    0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
+    1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-    0,     };
+    0, 0,     };
 
 static yy_state_type yy_last_accepting_state;
@@ -1466,7 +1468,7 @@
  * Author           : Peter A. Buhr
  * Created On       : Sat Sep 22 08:58:10 2001
- * Last Modified By : Peter A. Buhr
- * Last Modified On : Thu Jun 23 07:29:30 2016
- * Update Count     : 457
+ * Last Modified By : 
+ * Last Modified On : Sun Jul 31 07:19:36 2016
+ * Update Count     : 459
  */
 #line 20 "lex.ll"
@@ -1529,5 +1531,5 @@
 
 
-#line 1532 "Parser/lex.cc"
+#line 1534 "Parser/lex.cc"
 
 #define INITIAL 0
@@ -1724,5 +1726,5 @@
 
 				   /* line directives */
-#line 1727 "Parser/lex.cc"
+#line 1729 "Parser/lex.cc"
 
 	if ( !(yy_init) )
@@ -1778,5 +1780,5 @@
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 888 )
+				if ( yy_current_state >= 892 )
 					yy_c = yy_meta[(unsigned int) yy_c];
 				}
@@ -1784,5 +1786,5 @@
 			++yy_cp;
 			}
-		while ( yy_base[yy_current_state] != 2822 );
+		while ( yy_base[yy_current_state] != 2825 );
 
 yy_find_action:
@@ -2081,60 +2083,60 @@
 YY_RULE_SETUP
 #line 216 "lex.ll"
+{ KEYWORD_RETURN(FALLTHRU); }			// CFA
+	YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 217 "lex.ll"
 { KEYWORD_RETURN(FINALLY); }			// CFA
 	YY_BREAK
-case 48:
-YY_RULE_SETUP
-#line 217 "lex.ll"
+case 49:
+YY_RULE_SETUP
+#line 218 "lex.ll"
 { KEYWORD_RETURN(FLOAT); }
 	YY_BREAK
-case 49:
-YY_RULE_SETUP
-#line 218 "lex.ll"
+case 50:
+YY_RULE_SETUP
+#line 219 "lex.ll"
 { KEYWORD_RETURN(FLOAT); }				// GCC
 	YY_BREAK
-case 50:
-YY_RULE_SETUP
-#line 219 "lex.ll"
+case 51:
+YY_RULE_SETUP
+#line 220 "lex.ll"
 { KEYWORD_RETURN(FOR); }
 	YY_BREAK
-case 51:
-YY_RULE_SETUP
-#line 220 "lex.ll"
+case 52:
+YY_RULE_SETUP
+#line 221 "lex.ll"
 { KEYWORD_RETURN(FORALL); }				// CFA
 	YY_BREAK
-case 52:
-YY_RULE_SETUP
-#line 221 "lex.ll"
+case 53:
+YY_RULE_SETUP
+#line 222 "lex.ll"
 { KEYWORD_RETURN(FORTRAN); }
 	YY_BREAK
-case 53:
-YY_RULE_SETUP
-#line 222 "lex.ll"
+case 54:
+YY_RULE_SETUP
+#line 223 "lex.ll"
 { KEYWORD_RETURN(FTYPE); }				// CFA
 	YY_BREAK
-case 54:
-YY_RULE_SETUP
-#line 223 "lex.ll"
+case 55:
+YY_RULE_SETUP
+#line 224 "lex.ll"
 { KEYWORD_RETURN(GENERIC); }			// C11
 	YY_BREAK
-case 55:
-YY_RULE_SETUP
-#line 224 "lex.ll"
+case 56:
+YY_RULE_SETUP
+#line 225 "lex.ll"
 { KEYWORD_RETURN(GOTO); }
 	YY_BREAK
-case 56:
-YY_RULE_SETUP
-#line 225 "lex.ll"
+case 57:
+YY_RULE_SETUP
+#line 226 "lex.ll"
 { KEYWORD_RETURN(IF); }
 	YY_BREAK
-case 57:
-YY_RULE_SETUP
-#line 226 "lex.ll"
+case 58:
+YY_RULE_SETUP
+#line 227 "lex.ll"
 { KEYWORD_RETURN(IMAGINARY); }			// C99
-	YY_BREAK
-case 58:
-YY_RULE_SETUP
-#line 227 "lex.ll"
-{ KEYWORD_RETURN(IMAGINARY); }			// GCC
 	YY_BREAK
 case 59:
@@ -2146,10 +2148,10 @@
 YY_RULE_SETUP
 #line 229 "lex.ll"
+{ KEYWORD_RETURN(IMAGINARY); }			// GCC
+	YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 230 "lex.ll"
 { KEYWORD_RETURN(INLINE); }				// C99
-	YY_BREAK
-case 61:
-YY_RULE_SETUP
-#line 230 "lex.ll"
-{ KEYWORD_RETURN(INLINE); }				// GCC
 	YY_BREAK
 case 62:
@@ -2161,55 +2163,55 @@
 YY_RULE_SETUP
 #line 232 "lex.ll"
+{ KEYWORD_RETURN(INLINE); }				// GCC
+	YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 233 "lex.ll"
 { KEYWORD_RETURN(INT); }
 	YY_BREAK
-case 64:
-YY_RULE_SETUP
-#line 233 "lex.ll"
+case 65:
+YY_RULE_SETUP
+#line 234 "lex.ll"
 { KEYWORD_RETURN(INT); }				// GCC
 	YY_BREAK
-case 65:
-YY_RULE_SETUP
-#line 234 "lex.ll"
+case 66:
+YY_RULE_SETUP
+#line 235 "lex.ll"
 { KEYWORD_RETURN(LABEL); }				// GCC
 	YY_BREAK
-case 66:
-YY_RULE_SETUP
-#line 235 "lex.ll"
+case 67:
+YY_RULE_SETUP
+#line 236 "lex.ll"
 { KEYWORD_RETURN(LONG); }
 	YY_BREAK
-case 67:
-YY_RULE_SETUP
-#line 236 "lex.ll"
+case 68:
+YY_RULE_SETUP
+#line 237 "lex.ll"
 { KEYWORD_RETURN(LVALUE); }				// CFA
 	YY_BREAK
-case 68:
-YY_RULE_SETUP
-#line 237 "lex.ll"
+case 69:
+YY_RULE_SETUP
+#line 238 "lex.ll"
 { KEYWORD_RETURN(NORETURN); }			// C11
 	YY_BREAK
-case 69:
-YY_RULE_SETUP
-#line 238 "lex.ll"
+case 70:
+YY_RULE_SETUP
+#line 239 "lex.ll"
 { KEYWORD_RETURN(OFFSETOF); }		// GCC
 	YY_BREAK
-case 70:
-YY_RULE_SETUP
-#line 239 "lex.ll"
+case 71:
+YY_RULE_SETUP
+#line 240 "lex.ll"
 { KEYWORD_RETURN(OTYPE); }				// CFA
 	YY_BREAK
-case 71:
-YY_RULE_SETUP
-#line 240 "lex.ll"
+case 72:
+YY_RULE_SETUP
+#line 241 "lex.ll"
 { KEYWORD_RETURN(REGISTER); }
 	YY_BREAK
-case 72:
-YY_RULE_SETUP
-#line 241 "lex.ll"
+case 73:
+YY_RULE_SETUP
+#line 242 "lex.ll"
 { KEYWORD_RETURN(RESTRICT); }			// C99
-	YY_BREAK
-case 73:
-YY_RULE_SETUP
-#line 242 "lex.ll"
-{ KEYWORD_RETURN(RESTRICT); }			// GCC
 	YY_BREAK
 case 74:
@@ -2221,20 +2223,20 @@
 YY_RULE_SETUP
 #line 244 "lex.ll"
+{ KEYWORD_RETURN(RESTRICT); }			// GCC
+	YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 245 "lex.ll"
 { KEYWORD_RETURN(RETURN); }
 	YY_BREAK
-case 76:
-YY_RULE_SETUP
-#line 245 "lex.ll"
+case 77:
+YY_RULE_SETUP
+#line 246 "lex.ll"
 { KEYWORD_RETURN(SHORT); }
 	YY_BREAK
-case 77:
-YY_RULE_SETUP
-#line 246 "lex.ll"
+case 78:
+YY_RULE_SETUP
+#line 247 "lex.ll"
 { KEYWORD_RETURN(SIGNED); }
-	YY_BREAK
-case 78:
-YY_RULE_SETUP
-#line 247 "lex.ll"
-{ KEYWORD_RETURN(SIGNED); }				// GCC
 	YY_BREAK
 case 79:
@@ -2246,60 +2248,60 @@
 YY_RULE_SETUP
 #line 249 "lex.ll"
+{ KEYWORD_RETURN(SIGNED); }				// GCC
+	YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 250 "lex.ll"
 { KEYWORD_RETURN(SIZEOF); }
 	YY_BREAK
-case 81:
-YY_RULE_SETUP
-#line 250 "lex.ll"
+case 82:
+YY_RULE_SETUP
+#line 251 "lex.ll"
 { KEYWORD_RETURN(STATIC); }
 	YY_BREAK
-case 82:
-YY_RULE_SETUP
-#line 251 "lex.ll"
+case 83:
+YY_RULE_SETUP
+#line 252 "lex.ll"
 { KEYWORD_RETURN(STATICASSERT); }		// C11
 	YY_BREAK
-case 83:
-YY_RULE_SETUP
-#line 252 "lex.ll"
+case 84:
+YY_RULE_SETUP
+#line 253 "lex.ll"
 { KEYWORD_RETURN(STRUCT); }
 	YY_BREAK
-case 84:
-YY_RULE_SETUP
-#line 253 "lex.ll"
+case 85:
+YY_RULE_SETUP
+#line 254 "lex.ll"
 { KEYWORD_RETURN(SWITCH); }
 	YY_BREAK
-case 85:
-YY_RULE_SETUP
-#line 254 "lex.ll"
+case 86:
+YY_RULE_SETUP
+#line 255 "lex.ll"
 { KEYWORD_RETURN(THREADLOCAL); }		// C11
 	YY_BREAK
-case 86:
-YY_RULE_SETUP
-#line 255 "lex.ll"
+case 87:
+YY_RULE_SETUP
+#line 256 "lex.ll"
 { KEYWORD_RETURN(THROW); }				// CFA
 	YY_BREAK
-case 87:
-YY_RULE_SETUP
-#line 256 "lex.ll"
+case 88:
+YY_RULE_SETUP
+#line 257 "lex.ll"
 { KEYWORD_RETURN(THROWRESUME); }		// CFA
 	YY_BREAK
-case 88:
-YY_RULE_SETUP
-#line 257 "lex.ll"
+case 89:
+YY_RULE_SETUP
+#line 258 "lex.ll"
 { KEYWORD_RETURN(TRAIT); }				// CFA
 	YY_BREAK
-case 89:
-YY_RULE_SETUP
-#line 258 "lex.ll"
+case 90:
+YY_RULE_SETUP
+#line 259 "lex.ll"
 { KEYWORD_RETURN(TRY); }				// CFA
 	YY_BREAK
-case 90:
-YY_RULE_SETUP
-#line 259 "lex.ll"
+case 91:
+YY_RULE_SETUP
+#line 260 "lex.ll"
 { KEYWORD_RETURN(TYPEDEF); }
-	YY_BREAK
-case 91:
-YY_RULE_SETUP
-#line 260 "lex.ll"
-{ KEYWORD_RETURN(TYPEOF); }				// GCC
 	YY_BREAK
 case 92:
@@ -2316,30 +2318,30 @@
 YY_RULE_SETUP
 #line 263 "lex.ll"
+{ KEYWORD_RETURN(TYPEOF); }				// GCC
+	YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 264 "lex.ll"
 { KEYWORD_RETURN(UNION); }
 	YY_BREAK
-case 95:
-YY_RULE_SETUP
-#line 264 "lex.ll"
+case 96:
+YY_RULE_SETUP
+#line 265 "lex.ll"
 { KEYWORD_RETURN(UNSIGNED); }
 	YY_BREAK
-case 96:
-YY_RULE_SETUP
-#line 265 "lex.ll"
+case 97:
+YY_RULE_SETUP
+#line 266 "lex.ll"
 { KEYWORD_RETURN(VALIST); }			// GCC
 	YY_BREAK
-case 97:
-YY_RULE_SETUP
-#line 266 "lex.ll"
+case 98:
+YY_RULE_SETUP
+#line 267 "lex.ll"
 { KEYWORD_RETURN(VOID); }
 	YY_BREAK
-case 98:
-YY_RULE_SETUP
-#line 267 "lex.ll"
+case 99:
+YY_RULE_SETUP
+#line 268 "lex.ll"
 { KEYWORD_RETURN(VOLATILE); }
-	YY_BREAK
-case 99:
-YY_RULE_SETUP
-#line 268 "lex.ll"
-{ KEYWORD_RETURN(VOLATILE); }			// GCC
 	YY_BREAK
 case 100:
@@ -2351,47 +2353,47 @@
 YY_RULE_SETUP
 #line 270 "lex.ll"
+{ KEYWORD_RETURN(VOLATILE); }			// GCC
+	YY_BREAK
+case 102:
+YY_RULE_SETUP
+#line 271 "lex.ll"
 { KEYWORD_RETURN(WHILE); }
 	YY_BREAK
 /* identifier */
-case 102:
-YY_RULE_SETUP
-#line 273 "lex.ll"
+case 103:
+YY_RULE_SETUP
+#line 274 "lex.ll"
 { IDENTIFIER_RETURN(); }
 	YY_BREAK
-case 103:
-YY_RULE_SETUP
-#line 274 "lex.ll"
+case 104:
+YY_RULE_SETUP
+#line 275 "lex.ll"
 { ATTRIBUTE_RETURN(); }
 	YY_BREAK
-case 104:
-YY_RULE_SETUP
-#line 275 "lex.ll"
+case 105:
+YY_RULE_SETUP
+#line 276 "lex.ll"
 { BEGIN BKQUOTE; }
 	YY_BREAK
-case 105:
-YY_RULE_SETUP
-#line 276 "lex.ll"
+case 106:
+YY_RULE_SETUP
+#line 277 "lex.ll"
 { IDENTIFIER_RETURN(); }
 	YY_BREAK
-case 106:
-YY_RULE_SETUP
-#line 277 "lex.ll"
+case 107:
+YY_RULE_SETUP
+#line 278 "lex.ll"
 { BEGIN 0; }
 	YY_BREAK
 /* numeric constants */
-case 107:
-YY_RULE_SETUP
-#line 280 "lex.ll"
+case 108:
+YY_RULE_SETUP
+#line 281 "lex.ll"
 { NUMERIC_RETURN(ZERO); }				// CFA
 	YY_BREAK
-case 108:
-YY_RULE_SETUP
-#line 281 "lex.ll"
+case 109:
+YY_RULE_SETUP
+#line 282 "lex.ll"
 { NUMERIC_RETURN(ONE); }				// CFA
-	YY_BREAK
-case 109:
-YY_RULE_SETUP
-#line 282 "lex.ll"
-{ NUMERIC_RETURN(INTEGERconstant); }
 	YY_BREAK
 case 110:
@@ -2408,5 +2410,5 @@
 YY_RULE_SETUP
 #line 285 "lex.ll"
-{ NUMERIC_RETURN(FLOATINGconstant); }
+{ NUMERIC_RETURN(INTEGERconstant); }
 	YY_BREAK
 case 113:
@@ -2415,63 +2417,63 @@
 { NUMERIC_RETURN(FLOATINGconstant); }
 	YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 287 "lex.ll"
+{ NUMERIC_RETURN(FLOATINGconstant); }
+	YY_BREAK
 /* character constant, allows empty value */
-case 114:
-YY_RULE_SETUP
-#line 289 "lex.ll"
+case 115:
+YY_RULE_SETUP
+#line 290 "lex.ll"
 { BEGIN QUOTE; rm_underscore(); strtext = new std::string; *strtext += std::string( yytext ); }
 	YY_BREAK
-case 115:
-YY_RULE_SETUP
-#line 290 "lex.ll"
+case 116:
+YY_RULE_SETUP
+#line 291 "lex.ll"
 { *strtext += std::string( yytext ); }
 	YY_BREAK
-case 116:
-/* rule 116 can match eol */
-YY_RULE_SETUP
-#line 291 "lex.ll"
+case 117:
+/* rule 117 can match eol */
+YY_RULE_SETUP
+#line 292 "lex.ll"
 { BEGIN 0; *strtext += std::string( yytext); RETURN_STR(CHARACTERconstant); }
 	YY_BREAK
 /* ' stop highlighting */
 /* string constant */
-case 117:
-YY_RULE_SETUP
-#line 295 "lex.ll"
+case 118:
+YY_RULE_SETUP
+#line 296 "lex.ll"
 { BEGIN STRING; rm_underscore(); strtext = new std::string; *strtext += std::string( yytext ); }
 	YY_BREAK
-case 118:
-YY_RULE_SETUP
-#line 296 "lex.ll"
+case 119:
+YY_RULE_SETUP
+#line 297 "lex.ll"
 { *strtext += std::string( yytext ); }
 	YY_BREAK
-case 119:
-/* rule 119 can match eol */
-YY_RULE_SETUP
-#line 297 "lex.ll"
+case 120:
+/* rule 120 can match eol */
+YY_RULE_SETUP
+#line 298 "lex.ll"
 { BEGIN 0; *strtext += std::string( yytext ); RETURN_STR(STRINGliteral); }
 	YY_BREAK
 /* " stop highlighting */
 /* common character/string constant */
-case 120:
-YY_RULE_SETUP
-#line 301 "lex.ll"
+case 121:
+YY_RULE_SETUP
+#line 302 "lex.ll"
 { rm_underscore(); *strtext += std::string( yytext ); }
 	YY_BREAK
-case 121:
-/* rule 121 can match eol */
-YY_RULE_SETUP
-#line 302 "lex.ll"
+case 122:
+/* rule 122 can match eol */
+YY_RULE_SETUP
+#line 303 "lex.ll"
 {}						// continuation (ALSO HANDLED BY CPP)
 	YY_BREAK
-case 122:
-YY_RULE_SETUP
-#line 303 "lex.ll"
+case 123:
+YY_RULE_SETUP
+#line 304 "lex.ll"
 { *strtext += std::string( yytext ); } // unknown escape character
 	YY_BREAK
 /* punctuation */
-case 123:
-YY_RULE_SETUP
-#line 306 "lex.ll"
-{ ASCIIOP_RETURN(); }
-	YY_BREAK
 case 124:
 YY_RULE_SETUP
@@ -2502,10 +2504,10 @@
 YY_RULE_SETUP
 #line 312 "lex.ll"
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
+case 130:
+YY_RULE_SETUP
+#line 313 "lex.ll"
 { ASCIIOP_RETURN(); }					// also operator
-	YY_BREAK
-case 130:
-YY_RULE_SETUP
-#line 313 "lex.ll"
-{ ASCIIOP_RETURN(); }
 	YY_BREAK
 case 131:
@@ -2517,38 +2519,38 @@
 YY_RULE_SETUP
 #line 315 "lex.ll"
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 316 "lex.ll"
 { ASCIIOP_RETURN(); }					// also operator
 	YY_BREAK
-case 133:
-YY_RULE_SETUP
-#line 316 "lex.ll"
+case 134:
+YY_RULE_SETUP
+#line 317 "lex.ll"
 { NAMEDOP_RETURN(ELLIPSIS); }
 	YY_BREAK
 /* alternative C99 brackets, "<:" & "<:<:" handled by preprocessor */
-case 134:
-YY_RULE_SETUP
-#line 319 "lex.ll"
+case 135:
+YY_RULE_SETUP
+#line 320 "lex.ll"
 { RETURN_VAL('['); }
 	YY_BREAK
-case 135:
-YY_RULE_SETUP
-#line 320 "lex.ll"
+case 136:
+YY_RULE_SETUP
+#line 321 "lex.ll"
 { RETURN_VAL(']'); }
 	YY_BREAK
-case 136:
-YY_RULE_SETUP
-#line 321 "lex.ll"
+case 137:
+YY_RULE_SETUP
+#line 322 "lex.ll"
 { RETURN_VAL('{'); }
 	YY_BREAK
-case 137:
-YY_RULE_SETUP
-#line 322 "lex.ll"
+case 138:
+YY_RULE_SETUP
+#line 323 "lex.ll"
 { RETURN_VAL('}'); }
 	YY_BREAK
 /* operators */
-case 138:
-YY_RULE_SETUP
-#line 325 "lex.ll"
-{ ASCIIOP_RETURN(); }
-	YY_BREAK
 case 139:
 YY_RULE_SETUP
@@ -2618,122 +2620,122 @@
 case 152:
 YY_RULE_SETUP
-#line 340 "lex.ll"
+#line 339 "lex.ll"
+{ ASCIIOP_RETURN(); }
+	YY_BREAK
+case 153:
+YY_RULE_SETUP
+#line 341 "lex.ll"
 { NAMEDOP_RETURN(ICR); }
 	YY_BREAK
-case 153:
-YY_RULE_SETUP
-#line 341 "lex.ll"
+case 154:
+YY_RULE_SETUP
+#line 342 "lex.ll"
 { NAMEDOP_RETURN(DECR); }
 	YY_BREAK
-case 154:
-YY_RULE_SETUP
-#line 342 "lex.ll"
+case 155:
+YY_RULE_SETUP
+#line 343 "lex.ll"
 { NAMEDOP_RETURN(EQ); }
 	YY_BREAK
-case 155:
-YY_RULE_SETUP
-#line 343 "lex.ll"
+case 156:
+YY_RULE_SETUP
+#line 344 "lex.ll"
 { NAMEDOP_RETURN(NE); }
 	YY_BREAK
-case 156:
-YY_RULE_SETUP
-#line 344 "lex.ll"
+case 157:
+YY_RULE_SETUP
+#line 345 "lex.ll"
 { NAMEDOP_RETURN(LS); }
 	YY_BREAK
-case 157:
-YY_RULE_SETUP
-#line 345 "lex.ll"
+case 158:
+YY_RULE_SETUP
+#line 346 "lex.ll"
 { NAMEDOP_RETURN(RS); }
 	YY_BREAK
-case 158:
-YY_RULE_SETUP
-#line 346 "lex.ll"
+case 159:
+YY_RULE_SETUP
+#line 347 "lex.ll"
 { NAMEDOP_RETURN(LE); }
 	YY_BREAK
-case 159:
-YY_RULE_SETUP
-#line 347 "lex.ll"
+case 160:
+YY_RULE_SETUP
+#line 348 "lex.ll"
 { NAMEDOP_RETURN(GE); }
 	YY_BREAK
-case 160:
-YY_RULE_SETUP
-#line 348 "lex.ll"
+case 161:
+YY_RULE_SETUP
+#line 349 "lex.ll"
 { NAMEDOP_RETURN(ANDAND); }
 	YY_BREAK
-case 161:
-YY_RULE_SETUP
-#line 349 "lex.ll"
+case 162:
+YY_RULE_SETUP
+#line 350 "lex.ll"
 { NAMEDOP_RETURN(OROR); }
 	YY_BREAK
-case 162:
-YY_RULE_SETUP
-#line 350 "lex.ll"
+case 163:
+YY_RULE_SETUP
+#line 351 "lex.ll"
 { NAMEDOP_RETURN(ARROW); }
 	YY_BREAK
-case 163:
-YY_RULE_SETUP
-#line 351 "lex.ll"
+case 164:
+YY_RULE_SETUP
+#line 352 "lex.ll"
 { NAMEDOP_RETURN(PLUSassign); }
 	YY_BREAK
-case 164:
-YY_RULE_SETUP
-#line 352 "lex.ll"
+case 165:
+YY_RULE_SETUP
+#line 353 "lex.ll"
 { NAMEDOP_RETURN(MINUSassign); }
 	YY_BREAK
-case 165:
-YY_RULE_SETUP
-#line 353 "lex.ll"
+case 166:
+YY_RULE_SETUP
+#line 354 "lex.ll"
 { NAMEDOP_RETURN(MULTassign); }
 	YY_BREAK
-case 166:
-YY_RULE_SETUP
-#line 354 "lex.ll"
+case 167:
+YY_RULE_SETUP
+#line 355 "lex.ll"
 { NAMEDOP_RETURN(DIVassign); }
 	YY_BREAK
-case 167:
-YY_RULE_SETUP
-#line 355 "lex.ll"
+case 168:
+YY_RULE_SETUP
+#line 356 "lex.ll"
 { NAMEDOP_RETURN(MODassign); }
 	YY_BREAK
-case 168:
-YY_RULE_SETUP
-#line 356 "lex.ll"
+case 169:
+YY_RULE_SETUP
+#line 357 "lex.ll"
 { NAMEDOP_RETURN(ANDassign); }
 	YY_BREAK
-case 169:
-YY_RULE_SETUP
-#line 357 "lex.ll"
+case 170:
+YY_RULE_SETUP
+#line 358 "lex.ll"
 { NAMEDOP_RETURN(ORassign); }
 	YY_BREAK
-case 170:
-YY_RULE_SETUP
-#line 358 "lex.ll"
+case 171:
+YY_RULE_SETUP
+#line 359 "lex.ll"
 { NAMEDOP_RETURN(ERassign); }
 	YY_BREAK
-case 171:
-YY_RULE_SETUP
-#line 359 "lex.ll"
+case 172:
+YY_RULE_SETUP
+#line 360 "lex.ll"
 { NAMEDOP_RETURN(LSassign); }
 	YY_BREAK
-case 172:
-YY_RULE_SETUP
-#line 360 "lex.ll"
+case 173:
+YY_RULE_SETUP
+#line 361 "lex.ll"
 { NAMEDOP_RETURN(RSassign); }
 	YY_BREAK
-case 173:
-YY_RULE_SETUP
-#line 362 "lex.ll"
-{ NAMEDOP_RETURN(ATassign); }
+case 174:
+YY_RULE_SETUP
+#line 363 "lex.ll"
+{ NAMEDOP_RETURN(ATassign); }			// CFA
 	YY_BREAK
 /* CFA, operator identifier */
-case 174:
-YY_RULE_SETUP
-#line 365 "lex.ll"
+case 175:
+YY_RULE_SETUP
+#line 366 "lex.ll"
 { IDENTIFIER_RETURN(); }				// unary
-	YY_BREAK
-case 175:
-YY_RULE_SETUP
-#line 366 "lex.ll"
-{ IDENTIFIER_RETURN(); }
 	YY_BREAK
 case 176:
@@ -2745,4 +2747,9 @@
 YY_RULE_SETUP
 #line 368 "lex.ll"
+{ IDENTIFIER_RETURN(); }
+	YY_BREAK
+case 178:
+YY_RULE_SETUP
+#line 369 "lex.ll"
 { IDENTIFIER_RETURN(); }		// binary
 	YY_BREAK
@@ -2773,7 +2780,7 @@
 	  an argument list.
 	*/
-case 178:
-YY_RULE_SETUP
-#line 395 "lex.ll"
+case 179:
+YY_RULE_SETUP
+#line 396 "lex.ll"
 {
 	// 1 or 2 character unary operator ?
@@ -2788,15 +2795,15 @@
 	YY_BREAK
 /* unknown characters */
-case 179:
-YY_RULE_SETUP
-#line 407 "lex.ll"
+case 180:
+YY_RULE_SETUP
+#line 408 "lex.ll"
 { printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); }
 	YY_BREAK
-case 180:
-YY_RULE_SETUP
-#line 409 "lex.ll"
+case 181:
+YY_RULE_SETUP
+#line 410 "lex.ll"
 ECHO;
 	YY_BREAK
-#line 2801 "Parser/lex.cc"
+#line 2808 "Parser/lex.cc"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(COMMENT):
@@ -3095,5 +3102,5 @@
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 888 )
+			if ( yy_current_state >= 892 )
 				yy_c = yy_meta[(unsigned int) yy_c];
 			}
@@ -3123,9 +3130,9 @@
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 888 )
+		if ( yy_current_state >= 892 )
 			yy_c = yy_meta[(unsigned int) yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 887);
+	yy_is_jam = (yy_current_state == 891);
 
 	return yy_is_jam ? 0 : yy_current_state;
@@ -3773,5 +3780,5 @@
 #define YYTABLES_NAME "yytables"
 
-#line 409 "lex.ll"
+#line 410 "lex.ll"
 
 
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/lex.ll	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -9,7 +9,7 @@
  * Author           : Peter A. Buhr
  * Created On       : Sat Sep 22 08:58:10 2001
- * Last Modified By : Peter A. Buhr
- * Last Modified On : Thu Jun 23 07:29:30 2016
- * Update Count     : 457
+ * Last Modified By : 
+ * Last Modified On : Sun Jul 31 07:19:36 2016
+ * Update Count     : 459
  */
 
@@ -213,4 +213,5 @@
 __extension__	{ KEYWORD_RETURN(EXTENSION); }			// GCC
 extern			{ KEYWORD_RETURN(EXTERN); }
+fallthrough		{ KEYWORD_RETURN(FALLTHRU); }			// CFA
 fallthru		{ KEYWORD_RETURN(FALLTHRU); }			// CFA
 finally			{ KEYWORD_RETURN(FINALLY); }			// CFA
@@ -360,5 +361,5 @@
 ">>="			{ NAMEDOP_RETURN(RSassign); }
 
-"@="			{ NAMEDOP_RETURN(ATassign); }
+"@="			{ NAMEDOP_RETURN(ATassign); }			// CFA
 
 				/* CFA, operator identifier */
Index: src/Parser/parser.cc
===================================================================
--- src/Parser/parser.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/parser.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -89,7 +89,12 @@
 TypedefTable typedefTable;
 
+void appendStr( std::string &to, std::string *from ) {
+	// "abc" "def" "ghi" => "abcdefghi", remove new text from quotes and insert before last quote in old string.
+	to.insert( to.length() - 1, from->substr( 1, from->length() - 2 ) );
+} // appendStr
+
 
 /* Line 268 of yacc.c  */
-#line 94 "Parser/parser.cc"
+#line 99 "Parser/parser.cc"
 
 /* Enabling traces.  */
@@ -342,5 +347,5 @@
 
 /* Line 293 of yacc.c  */
-#line 110 "parser.yy"
+#line 115 "parser.yy"
 
 	Token tok;
@@ -351,7 +356,9 @@
 	DeclarationNode::TypeClass tclass;
 	StatementNode *sn;
-	ConstantNode *constant;
+	ConstantExpr *constant;
+	ForCtl *fctl;
 	LabelNode *label;
 	InitializerNode *in;
+	OperKinds op;
 	bool flag;
 
@@ -359,5 +366,5 @@
 
 /* Line 293 of yacc.c  */
-#line 362 "Parser/parser.cc"
+#line 369 "Parser/parser.cc"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
@@ -371,5 +378,5 @@
 
 /* Line 343 of yacc.c  */
-#line 374 "Parser/parser.cc"
+#line 381 "Parser/parser.cc"
 
 #ifdef short
@@ -588,7 +595,7 @@
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  252
+#define YYFINAL  251
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   12080
+#define YYLAST   10816
 
 /* YYNTOKENS -- Number of terminals.  */
@@ -597,7 +604,7 @@
 #define YYNNTS  241
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  755
+#define YYNRULES  750
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  1579
+#define YYNSTATES  1554
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
@@ -614,14 +621,14 @@
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   122,     2,     2,     2,   125,   119,     2,
-     109,   110,   118,   120,   116,   121,   113,   124,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,   117,   132,
-     126,   131,   127,   130,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   121,     2,     2,     2,   124,   118,     2,
+     109,   110,   117,   119,   116,   120,   113,   123,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,   130,   132,
+     125,   131,   126,   129,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,   111,     2,   112,   128,     2,     2,     2,     2,     2,
+       2,   111,     2,   112,   127,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   114,   129,   115,   123,     2,     2,     2,
+       2,     2,     2,   114,   128,   115,   122,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -658,77 +665,77 @@
       17,    19,    21,    23,    25,    27,    29,    31,    34,    36,
       38,    42,    46,    48,    55,    60,    64,    72,    76,    84,
-      87,    90,    98,   103,   105,   109,   110,   112,   116,   124,
-     134,   136,   140,   142,   146,   154,   158,   166,   168,   170,
-     172,   175,   178,   181,   184,   187,   190,   195,   202,   204,
-     209,   214,   217,   222,   224,   226,   228,   230,   232,   234,
-     236,   238,   243,   248,   250,   254,   258,   262,   264,   268,
-     272,   274,   278,   282,   284,   288,   292,   296,   300,   302,
-     306,   310,   312,   316,   318,   322,   324,   328,   330,   334,
-     336,   340,   342,   348,   353,   359,   361,   363,   367,   371,
-     374,   375,   377,   380,   386,   393,   401,   403,   407,   409,
-     411,   413,   415,   417,   419,   421,   423,   425,   427,   429,
-     433,   434,   436,   438,   440,   442,   444,   446,   448,   450,
-     452,   459,   464,   467,   475,   477,   481,   483,   486,   488,
-     491,   493,   496,   499,   505,   513,   519,   529,   535,   545,
-     547,   551,   553,   555,   559,   563,   566,   568,   571,   574,
-     575,   577,   580,   584,   585,   587,   590,   594,   598,   603,
-     604,   606,   608,   611,   617,   625,   632,   639,   644,   648,
-     653,   656,   660,   663,   667,   671,   675,   679,   685,   689,
-     693,   698,   700,   706,   713,   719,   726,   736,   747,   757,
-     768,   771,   773,   776,   779,   782,   784,   791,   800,   811,
-     824,   839,   840,   842,   843,   845,   847,   851,   856,   864,
-     865,   867,   871,   873,   877,   879,   881,   883,   887,   889,
-     891,   893,   897,   898,   900,   904,   909,   911,   915,   917,
-     919,   923,   927,   931,   935,   939,   942,   946,   953,   957,
-     961,   966,   968,   971,   974,   978,   984,   993,  1001,  1009,
-    1015,  1025,  1028,  1031,  1037,  1041,  1047,  1052,  1056,  1061,
-    1066,  1074,  1078,  1082,  1086,  1090,  1095,  1102,  1104,  1106,
-    1108,  1110,  1112,  1114,  1116,  1118,  1119,  1121,  1123,  1126,
-    1128,  1130,  1132,  1134,  1136,  1138,  1140,  1141,  1147,  1149,
-    1152,  1156,  1158,  1161,  1163,  1165,  1167,  1169,  1171,  1173,
-    1175,  1177,  1179,  1181,  1183,  1185,  1187,  1189,  1191,  1193,
-    1195,  1197,  1199,  1201,  1203,  1205,  1207,  1210,  1213,  1217,
-    1221,  1223,  1227,  1229,  1232,  1235,  1238,  1243,  1248,  1253,
-    1258,  1260,  1263,  1266,  1270,  1272,  1275,  1278,  1280,  1283,
-    1286,  1290,  1292,  1295,  1298,  1300,  1302,  1307,  1310,  1311,
-    1318,  1326,  1329,  1332,  1335,  1336,  1339,  1342,  1346,  1349,
-    1353,  1355,  1358,  1362,  1365,  1368,  1373,  1374,  1376,  1379,
-    1382,  1384,  1385,  1387,  1390,  1393,  1399,  1402,  1403,  1411,
-    1414,  1419,  1420,  1423,  1424,  1426,  1428,  1430,  1436,  1442,
-    1448,  1450,  1456,  1462,  1472,  1474,  1480,  1481,  1483,  1485,
-    1491,  1493,  1495,  1501,  1507,  1509,  1513,  1517,  1522,  1524,
-    1526,  1528,  1530,  1533,  1535,  1539,  1543,  1545,  1548,  1550,
-    1554,  1556,  1558,  1560,  1562,  1564,  1566,  1568,  1570,  1572,
-    1574,  1576,  1579,  1581,  1583,  1585,  1588,  1589,  1592,  1595,
-    1597,  1602,  1603,  1605,  1608,  1612,  1617,  1620,  1623,  1625,
-    1628,  1630,  1633,  1639,  1645,  1653,  1660,  1662,  1665,  1668,
-    1672,  1674,  1677,  1680,  1685,  1688,  1693,  1694,  1699,  1702,
-    1704,  1706,  1708,  1709,  1712,  1718,  1724,  1738,  1740,  1742,
-    1746,  1750,  1753,  1757,  1761,  1764,  1769,  1771,  1778,  1788,
-    1789,  1801,  1803,  1807,  1811,  1815,  1817,  1819,  1825,  1828,
-    1834,  1835,  1837,  1839,  1843,  1844,  1846,  1848,  1850,  1852,
-    1853,  1860,  1863,  1865,  1868,  1873,  1876,  1880,  1884,  1888,
-    1893,  1899,  1905,  1911,  1918,  1920,  1922,  1924,  1928,  1929,
-    1935,  1936,  1938,  1940,  1943,  1950,  1952,  1956,  1957,  1959,
-    1964,  1966,  1968,  1970,  1972,  1975,  1977,  1980,  1983,  1985,
-    1989,  1992,  1996,  2000,  2003,  2008,  2013,  2017,  2026,  2030,
-    2033,  2035,  2038,  2045,  2054,  2058,  2061,  2065,  2069,  2074,
-    2079,  2083,  2085,  2087,  2089,  2094,  2101,  2105,  2108,  2112,
-    2116,  2121,  2126,  2130,  2133,  2135,  2138,  2141,  2143,  2147,
-    2150,  2154,  2158,  2161,  2166,  2171,  2175,  2182,  2191,  2195,
-    2198,  2200,  2203,  2206,  2209,  2213,  2217,  2220,  2225,  2230,
-    2234,  2241,  2250,  2254,  2257,  2259,  2262,  2265,  2267,  2269,
-    2272,  2276,  2280,  2283,  2288,  2295,  2304,  2306,  2309,  2312,
-    2314,  2317,  2320,  2324,  2328,  2330,  2335,  2340,  2344,  2350,
-    2359,  2363,  2366,  2370,  2372,  2378,  2384,  2391,  2398,  2400,
-    2403,  2406,  2408,  2411,  2414,  2418,  2422,  2424,  2429,  2434,
-    2438,  2444,  2453,  2457,  2459,  2462,  2464,  2467,  2474,  2480,
-    2487,  2495,  2503,  2505,  2508,  2511,  2513,  2516,  2519,  2523,
-    2527,  2529,  2534,  2539,  2543,  2552,  2556,  2558,  2560,  2563,
-    2565,  2567,  2570,  2574,  2577,  2581,  2584,  2588,  2592,  2595,
-    2600,  2604,  2607,  2611,  2614,  2619,  2623,  2626,  2633,  2640,
-    2647,  2655,  2657,  2660,  2662,  2664,  2666,  2669,  2673,  2676,
-    2680,  2683,  2687,  2691,  2696,  2699,  2703,  2708,  2711,  2717,
-    2723,  2730,  2737,  2738,  2740,  2741
+      87,    90,    98,   103,   105,   109,   110,   112,   114,   118,
+     120,   124,   132,   136,   144,   146,   148,   150,   153,   156,
+     159,   162,   165,   168,   173,   176,   181,   188,   190,   195,
+     200,   202,   204,   206,   208,   210,   212,   214,   219,   224,
+     226,   230,   234,   238,   240,   244,   248,   250,   254,   258,
+     260,   264,   268,   272,   276,   278,   282,   286,   288,   292,
+     294,   298,   300,   304,   306,   310,   312,   316,   318,   324,
+     329,   335,   337,   339,   343,   346,   347,   349,   351,   353,
+     355,   357,   359,   361,   363,   365,   367,   369,   371,   374,
+     380,   387,   395,   397,   401,   403,   407,   408,   410,   412,
+     414,   416,   418,   420,   422,   424,   426,   433,   438,   441,
+     449,   451,   455,   457,   460,   462,   465,   467,   470,   473,
+     479,   487,   493,   503,   509,   519,   521,   525,   527,   529,
+     533,   537,   540,   542,   545,   548,   549,   551,   554,   558,
+     559,   561,   564,   568,   572,   577,   578,   580,   582,   585,
+     591,   599,   606,   613,   618,   622,   627,   630,   634,   637,
+     641,   645,   649,   653,   659,   663,   667,   672,   674,   680,
+     687,   693,   700,   710,   721,   731,   742,   745,   747,   750,
+     753,   756,   758,   765,   774,   785,   798,   813,   814,   816,
+     817,   819,   821,   825,   830,   838,   839,   841,   845,   847,
+     851,   853,   855,   857,   861,   863,   865,   867,   871,   872,
+     874,   878,   883,   885,   889,   891,   893,   897,   901,   905,
+     909,   913,   916,   920,   927,   931,   935,   940,   942,   945,
+     948,   952,   958,   967,   975,   983,   989,   999,  1002,  1005,
+    1011,  1015,  1021,  1026,  1030,  1035,  1040,  1048,  1052,  1056,
+    1060,  1064,  1069,  1076,  1078,  1080,  1082,  1084,  1086,  1088,
+    1090,  1092,  1093,  1095,  1097,  1100,  1102,  1104,  1106,  1108,
+    1110,  1112,  1114,  1115,  1121,  1123,  1126,  1130,  1132,  1135,
+    1137,  1139,  1141,  1143,  1145,  1147,  1149,  1151,  1153,  1155,
+    1157,  1159,  1161,  1163,  1165,  1167,  1169,  1171,  1173,  1175,
+    1177,  1179,  1181,  1184,  1187,  1191,  1195,  1197,  1201,  1203,
+    1206,  1209,  1212,  1217,  1222,  1227,  1232,  1234,  1237,  1240,
+    1244,  1246,  1249,  1252,  1254,  1257,  1260,  1264,  1266,  1269,
+    1272,  1274,  1276,  1281,  1284,  1285,  1292,  1300,  1303,  1306,
+    1309,  1310,  1313,  1316,  1320,  1323,  1327,  1329,  1332,  1336,
+    1339,  1342,  1347,  1348,  1350,  1353,  1356,  1358,  1359,  1361,
+    1364,  1367,  1373,  1376,  1377,  1385,  1388,  1393,  1394,  1397,
+    1398,  1400,  1402,  1404,  1410,  1416,  1422,  1424,  1430,  1436,
+    1446,  1448,  1454,  1455,  1457,  1459,  1465,  1467,  1469,  1475,
+    1481,  1483,  1487,  1491,  1496,  1498,  1500,  1502,  1504,  1507,
+    1509,  1513,  1517,  1519,  1522,  1524,  1528,  1530,  1532,  1534,
+    1536,  1538,  1540,  1542,  1544,  1546,  1548,  1550,  1553,  1555,
+    1557,  1559,  1562,  1563,  1566,  1569,  1571,  1576,  1577,  1579,
+    1582,  1586,  1591,  1594,  1597,  1599,  1602,  1605,  1611,  1617,
+    1625,  1632,  1634,  1637,  1640,  1644,  1646,  1649,  1652,  1657,
+    1660,  1665,  1666,  1671,  1674,  1676,  1678,  1680,  1681,  1684,
+    1690,  1696,  1710,  1712,  1714,  1718,  1722,  1725,  1729,  1733,
+    1736,  1741,  1743,  1750,  1760,  1761,  1773,  1775,  1779,  1783,
+    1787,  1789,  1791,  1797,  1800,  1806,  1807,  1809,  1811,  1815,
+    1816,  1818,  1820,  1822,  1824,  1825,  1832,  1835,  1837,  1840,
+    1845,  1848,  1852,  1856,  1860,  1865,  1871,  1877,  1883,  1890,
+    1892,  1894,  1896,  1900,  1901,  1907,  1908,  1910,  1912,  1915,
+    1922,  1924,  1928,  1929,  1931,  1936,  1938,  1940,  1942,  1944,
+    1947,  1949,  1952,  1955,  1957,  1961,  1964,  1968,  1972,  1975,
+    1980,  1985,  1989,  1998,  2002,  2005,  2007,  2010,  2017,  2026,
+    2030,  2033,  2037,  2041,  2046,  2051,  2055,  2057,  2059,  2061,
+    2066,  2073,  2077,  2080,  2084,  2088,  2093,  2098,  2102,  2105,
+    2107,  2110,  2113,  2115,  2119,  2122,  2126,  2130,  2133,  2138,
+    2143,  2147,  2154,  2163,  2167,  2170,  2172,  2175,  2178,  2181,
+    2185,  2189,  2192,  2197,  2202,  2206,  2213,  2222,  2226,  2229,
+    2231,  2234,  2237,  2239,  2241,  2244,  2248,  2252,  2255,  2260,
+    2267,  2276,  2278,  2281,  2284,  2286,  2289,  2292,  2296,  2300,
+    2302,  2307,  2312,  2316,  2322,  2331,  2335,  2338,  2342,  2344,
+    2350,  2356,  2363,  2370,  2372,  2375,  2378,  2380,  2383,  2386,
+    2390,  2394,  2396,  2401,  2406,  2410,  2416,  2425,  2429,  2431,
+    2434,  2436,  2439,  2446,  2452,  2459,  2467,  2475,  2477,  2480,
+    2483,  2485,  2488,  2491,  2495,  2499,  2501,  2506,  2511,  2515,
+    2524,  2528,  2530,  2532,  2535,  2537,  2539,  2542,  2546,  2549,
+    2553,  2556,  2560,  2564,  2567,  2572,  2576,  2579,  2583,  2586,
+    2591,  2595,  2598,  2605,  2612,  2619,  2627,  2629,  2632,  2634,
+    2636,  2638,  2641,  2645,  2648,  2652,  2655,  2659,  2663,  2668,
+    2671,  2675,  2680,  2683,  2689,  2695,  2702,  2709,  2710,  2712,
+    2713
 };
 
@@ -747,268 +754,265 @@
      109,   275,   110,   114,   279,   372,   115,    -1,   143,   114,
      144,   115,    -1,   145,    -1,   144,   116,   145,    -1,    -1,
-     164,    -1,   139,   117,   164,    -1,   111,   134,   164,   135,
-     112,   117,   164,    -1,   111,   134,   164,   116,   167,   135,
-     112,   117,   164,    -1,   147,    -1,   146,   116,   147,    -1,
-     139,    -1,   139,   113,   147,    -1,   139,   113,   111,   134,
-     146,   135,   112,    -1,   139,    85,   147,    -1,   139,    85,
-     111,   134,   146,   135,   112,    -1,   143,    -1,   136,    -1,
-     141,    -1,    40,   151,    -1,   149,   151,    -1,   150,   151,
-      -1,    86,   148,    -1,    87,   148,    -1,    37,   148,    -1,
-      37,   109,   275,   110,    -1,    38,   109,   275,   116,   139,
-     110,    -1,    76,    -1,    76,   109,   276,   110,    -1,    76,
-     109,   145,   110,    -1,    66,   148,    -1,    66,   109,   275,
-     110,    -1,   118,    -1,   119,    -1,    94,    -1,   120,    -1,
-     121,    -1,   122,    -1,   123,    -1,   148,    -1,   109,   275,
-     110,   151,    -1,   109,   275,   110,   166,    -1,   151,    -1,
-     152,   118,   151,    -1,   152,   124,   151,    -1,   152,   125,
-     151,    -1,   152,    -1,   153,   120,   152,    -1,   153,   121,
-     152,    -1,   153,    -1,   154,    88,   153,    -1,   154,    89,
-     153,    -1,   154,    -1,   155,   126,   154,    -1,   155,   127,
-     154,    -1,   155,    90,   154,    -1,   155,    91,   154,    -1,
-     155,    -1,   156,    92,   155,    -1,   156,    93,   155,    -1,
-     156,    -1,   157,   119,   156,    -1,   157,    -1,   158,   128,
-     157,    -1,   158,    -1,   159,   129,   158,    -1,   159,    -1,
-     160,    94,   159,    -1,   160,    -1,   161,    95,   160,    -1,
-     161,    -1,   161,   130,   169,   117,   162,    -1,   161,   130,
-     117,   162,    -1,   161,   130,   169,   117,   166,    -1,   162,
-      -1,   162,    -1,   148,   131,   164,    -1,   148,   168,   164,
-      -1,   166,   373,    -1,    -1,   164,    -1,   111,   112,    -1,
-     111,   134,   164,   135,   112,    -1,   111,   134,   116,   167,
-     135,   112,    -1,   111,   134,   164,   116,   167,   135,   112,
-      -1,   165,    -1,   167,   116,   165,    -1,    97,    -1,    98,
-      -1,    99,    -1,   100,    -1,   101,    -1,   102,    -1,   103,
-      -1,   104,    -1,   105,    -1,   106,    -1,   164,    -1,   169,
-     116,   164,    -1,    -1,   169,    -1,   172,    -1,   173,    -1,
-     177,    -1,   178,    -1,   190,    -1,   192,    -1,   193,    -1,
-     198,    -1,   128,   143,   114,   144,   115,   132,    -1,    72,
-     117,   312,   171,    -1,   114,   115,    -1,   114,   134,   134,
-     209,   174,   135,   115,    -1,   175,    -1,   174,   134,   175,
-      -1,   212,    -1,    40,   212,    -1,   308,    -1,   171,   135,
-      -1,   171,    -1,   176,   171,    -1,   170,   132,    -1,    41,
-     109,   169,   110,   171,    -1,    41,   109,   169,   110,   171,
-      42,   171,    -1,    43,   109,   169,   110,   183,    -1,    43,
-     109,   169,   110,   114,   134,   205,   184,   115,    -1,    53,
-     109,   169,   110,   183,    -1,    53,   109,   169,   110,   114,
-     134,   205,   186,   115,    -1,   163,    -1,   163,    96,   163,
-      -1,   310,    -1,   179,    -1,   180,   116,   179,    -1,    44,
-     180,   117,    -1,    45,   117,    -1,   181,    -1,   182,   181,
-      -1,   182,   171,    -1,    -1,   185,    -1,   182,   176,    -1,
-     185,   182,   176,    -1,    -1,   187,    -1,   182,   189,    -1,
-     182,   176,   188,    -1,   187,   182,   189,    -1,   187,   182,
-     176,   188,    -1,    -1,   189,    -1,    56,    -1,    56,   132,
-      -1,    47,   109,   169,   110,   171,    -1,    46,   171,    47,
-     109,   169,   110,   132,    -1,    48,   109,   134,   191,   110,
-     171,    -1,   170,   135,   132,   170,   132,   170,    -1,   212,
-     170,   132,   170,    -1,    51,    72,   132,    -1,    51,   118,
-     169,   132,    -1,    50,   132,    -1,    50,    72,   132,    -1,
-      49,   132,    -1,    49,    72,   132,    -1,    52,   170,   132,
-      -1,    61,   165,   132,    -1,    62,   165,   132,    -1,    62,
-     165,    63,   164,   132,    -1,    57,   173,   194,    -1,    57,
-     173,   196,    -1,    57,   173,   194,   196,    -1,   195,    -1,
-      58,   109,    96,   110,   173,    -1,   195,    58,   109,    96,
-     110,   173,    -1,    59,   109,    96,   110,   173,    -1,   195,
-      59,   109,    96,   110,   173,    -1,    58,   109,   134,   134,
-     197,   135,   110,   173,   135,    -1,   195,    58,   109,   134,
-     134,   197,   135,   110,   173,   135,    -1,    59,   109,   134,
-     134,   197,   135,   110,   173,   135,    -1,   195,    59,   109,
-     134,   134,   197,   135,   110,   173,   135,    -1,    60,   173,
-      -1,   225,    -1,   225,   309,    -1,   225,   357,    -1,   366,
-     139,    -1,   366,    -1,    64,   199,   109,   141,   110,   132,
-      -1,    64,   199,   109,   141,   117,   200,   110,   132,    -1,
-      64,   199,   109,   141,   117,   200,   117,   200,   110,   132,
-      -1,    64,   199,   109,   141,   117,   200,   117,   200,   117,
-     203,   110,   132,    -1,    64,   199,    51,   109,   141,   117,
-     117,   200,   117,   203,   117,   204,   110,   132,    -1,    -1,
-      11,    -1,    -1,   201,    -1,   202,    -1,   201,   116,   202,
-      -1,   141,   109,   163,   110,    -1,   111,   163,   112,   141,
-     109,   163,   110,    -1,    -1,   141,    -1,   203,   116,   141,
-      -1,   139,    -1,   204,   116,   139,    -1,   135,    -1,   206,
-      -1,   212,    -1,   206,   134,   212,    -1,   135,    -1,   208,
-      -1,   222,    -1,   208,   134,   222,    -1,    -1,   210,    -1,
-      29,   211,   132,    -1,   210,    29,   211,   132,    -1,   274,
-      -1,   211,   116,   274,    -1,   213,    -1,   222,    -1,   214,
-     135,   132,    -1,   219,   135,   132,    -1,   216,   135,   132,
-      -1,   293,   135,   132,    -1,   296,   135,   132,    -1,   215,
-     277,    -1,   231,   215,   277,    -1,   214,   135,   116,   134,
-     272,   277,    -1,   367,   272,   311,    -1,   370,   272,   311,
-      -1,   227,   370,   272,   311,    -1,   217,    -1,   227,   217,
-      -1,   231,   217,    -1,   231,   227,   217,    -1,   216,   135,
-     116,   134,   272,    -1,   111,   112,   272,   109,   134,   260,
-     135,   110,    -1,   370,   272,   109,   134,   260,   135,   110,
-      -1,   218,   272,   109,   134,   260,   135,   110,    -1,   111,
-     134,   262,   135,   112,    -1,   111,   134,   262,   135,   116,
-     134,   263,   135,   112,    -1,     3,   215,    -1,     3,   217,
-      -1,   219,   135,   116,   134,   139,    -1,     3,   225,   309,
-      -1,   220,   135,   116,   134,   309,    -1,   227,     3,   225,
-     309,    -1,   225,     3,   309,    -1,   225,     3,   227,   309,
-      -1,     3,   139,   131,   164,    -1,   221,   135,   116,   134,
-     139,   131,   164,    -1,   223,   135,   132,    -1,   220,   135,
-     132,    -1,   221,   135,   132,    -1,   240,   135,   132,    -1,
-     224,   309,   311,   277,    -1,   223,   116,   312,   309,   311,
-     277,    -1,   236,    -1,   240,    -1,   242,    -1,   283,    -1,
-     237,    -1,   241,    -1,   243,    -1,   284,    -1,    -1,   227,
-      -1,   228,    -1,   227,   228,    -1,   229,    -1,   314,    -1,
-      10,    -1,    12,    -1,    11,    -1,    14,    -1,    67,    -1,
-      -1,    13,   109,   230,   286,   110,    -1,   232,    -1,   227,
-     232,    -1,   231,   227,   232,    -1,   233,    -1,   232,   233,
-      -1,   234,    -1,     5,    -1,     7,    -1,     4,    -1,     6,
-      -1,     8,    -1,     9,    -1,    69,    -1,    71,    -1,    16,
-      -1,    21,    -1,    20,    -1,    18,    -1,    19,    -1,    17,
-      -1,    22,    -1,    23,    -1,    15,    -1,    25,    -1,    26,
-      -1,    27,    -1,    24,    -1,   237,    -1,   231,   237,    -1,
-     236,   233,    -1,   236,   233,   227,    -1,   236,   233,   237,
-      -1,   238,    -1,   226,   239,   226,    -1,   235,    -1,   227,
-     235,    -1,   238,   228,    -1,   238,   235,    -1,    28,   109,
-     276,   110,    -1,    28,   109,   169,   110,    -1,    78,   109,
-     276,   110,    -1,    78,   109,   169,   110,    -1,   241,    -1,
-     231,   241,    -1,   240,   233,    -1,   240,   233,   227,    -1,
-     244,    -1,   227,   244,    -1,   241,   228,    -1,   243,    -1,
-     231,   243,    -1,   242,   233,    -1,   242,   233,   227,    -1,
-      74,    -1,   227,    74,    -1,   243,   228,    -1,   245,    -1,
-     256,    -1,   247,   114,   248,   115,    -1,   247,   274,    -1,
-      -1,   247,   274,   246,   114,   248,   115,    -1,   247,   109,
-     292,   110,   114,   248,   115,    -1,   247,   285,    -1,    31,
-     312,    -1,    32,   312,    -1,    -1,   248,   249,    -1,   250,
-     132,    -1,    40,   250,   132,    -1,   251,   132,    -1,    40,
-     251,   132,    -1,   366,    -1,   366,   274,    -1,   250,   116,
-     274,    -1,   250,   116,    -1,   225,   252,    -1,   251,   116,
-     312,   252,    -1,    -1,   254,    -1,   318,   253,    -1,   331,
-     253,    -1,   357,    -1,    -1,   254,    -1,   117,   163,    -1,
-      30,   312,    -1,   255,   114,   258,   372,   115,    -1,   255,
-     274,    -1,    -1,   255,   274,   257,   114,   258,   372,   115,
-      -1,   274,   259,    -1,   258,   116,   274,   259,    -1,    -1,
-     131,   163,    -1,    -1,   261,    -1,   263,    -1,   262,    -1,
-     262,   135,   116,   134,   263,    -1,   263,   135,   116,   134,
-      96,    -1,   262,   135,   116,   134,    96,    -1,   267,    -1,
-     263,   135,   116,   134,   267,    -1,   262,   135,   116,   134,
-     267,    -1,   262,   135,   116,   134,   263,   135,   116,   134,
-     267,    -1,   268,    -1,   263,   135,   116,   134,   268,    -1,
-      -1,   265,    -1,   266,    -1,   266,   135,   116,   134,    96,
-      -1,   270,    -1,   269,    -1,   266,   135,   116,   134,   270,
-      -1,   266,   135,   116,   134,   269,    -1,   269,    -1,   362,
-     272,   373,    -1,   370,   272,   373,    -1,   227,   370,   272,
-     373,    -1,   217,    -1,   270,    -1,   362,    -1,   370,    -1,
-     227,   370,    -1,   371,    -1,   224,   336,   373,    -1,   224,
-     340,   373,    -1,   224,    -1,   224,   351,    -1,   139,    -1,
-     271,   116,   139,    -1,   137,    -1,    74,    -1,    75,    -1,
-     138,    -1,    74,    -1,    75,    -1,   139,    -1,    74,    -1,
-      75,    -1,   366,    -1,   225,    -1,   225,   357,    -1,   366,
-      -1,   371,    -1,   225,    -1,   225,   345,    -1,    -1,   131,
-     278,    -1,   107,   278,    -1,   164,    -1,   114,   279,   372,
-     115,    -1,    -1,   278,    -1,   280,   278,    -1,   279,   116,
-     278,    -1,   279,   116,   280,   278,    -1,   281,   117,    -1,
-     274,   117,    -1,   282,    -1,   281,   282,    -1,    80,    -1,
-     113,   274,    -1,   111,   134,   164,   135,   112,    -1,   111,
-     134,   310,   135,   112,    -1,   111,   134,   163,    96,   163,
-     135,   112,    -1,   113,   111,   134,   146,   135,   112,    -1,
-     284,    -1,   231,   284,    -1,   283,   233,    -1,   283,   233,
-     227,    -1,   285,    -1,   227,   285,    -1,   284,   228,    -1,
-      75,   109,   292,   110,    -1,   287,   373,    -1,   286,   116,
-     287,   373,    -1,    -1,   289,   274,   288,   290,    -1,   225,
-     336,    -1,    33,    -1,    35,    -1,    34,    -1,    -1,   290,
-     291,    -1,   129,   274,   109,   292,   110,    -1,   129,   114,
-     134,   298,   115,    -1,   129,   109,   134,   286,   135,   110,
-     114,   134,   298,   115,   109,   292,   110,    -1,   276,    -1,
-     164,    -1,   292,   116,   276,    -1,   292,   116,   164,    -1,
-      33,   294,    -1,   232,    33,   294,    -1,   293,   116,   294,
-      -1,   295,   290,    -1,   295,   290,   131,   276,    -1,   274,
-      -1,   273,   109,   134,   286,   135,   110,    -1,    36,   274,
-     109,   134,   286,   135,   110,   114,   115,    -1,    -1,    36,
-     274,   109,   134,   286,   135,   110,   114,   297,   298,   115,
-      -1,   299,    -1,   298,   134,   299,    -1,   300,   135,   132,
-      -1,   301,   135,   132,    -1,   215,    -1,   217,    -1,   300,
-     135,   116,   134,   272,    -1,   225,   309,    -1,   301,   135,
-     116,   134,   309,    -1,    -1,   303,    -1,   305,    -1,   303,
-     134,   305,    -1,    -1,   303,    -1,   212,    -1,   307,    -1,
-     198,    -1,    -1,     5,    82,   306,   114,   304,   115,    -1,
-      40,   305,    -1,   308,    -1,   323,   173,    -1,   327,   134,
-     207,   173,    -1,   216,   173,    -1,   224,   323,   173,    -1,
-     227,   323,   173,    -1,   231,   323,   173,    -1,   231,   227,
-     323,   173,    -1,   224,   327,   134,   207,   173,    -1,   227,
-     327,   134,   207,   173,    -1,   231,   327,   134,   207,   173,
-      -1,   231,   227,   327,   134,   207,   173,    -1,   318,    -1,
-     331,    -1,   323,    -1,   163,   123,   163,    -1,    -1,    64,
-     109,   141,   110,   312,    -1,    -1,   313,    -1,   314,    -1,
-     313,   314,    -1,    39,   109,   109,   315,   110,   110,    -1,
-     316,    -1,   315,   116,   316,    -1,    -1,   317,    -1,   317,
-     109,   170,   110,    -1,   272,    -1,   234,    -1,   235,    -1,
-     228,    -1,   319,   312,    -1,   320,    -1,   321,   312,    -1,
-     322,   312,    -1,   137,    -1,   109,   319,   110,    -1,   149,
-     318,    -1,   149,   227,   318,    -1,   109,   320,   110,    -1,
-     319,   349,    -1,   109,   320,   110,   349,    -1,   109,   321,
-     110,   350,    -1,   109,   321,   110,    -1,   109,   320,   110,
-     109,   134,   264,   135,   110,    -1,   109,   322,   110,    -1,
-     324,   312,    -1,   325,    -1,   326,   312,    -1,   319,   109,
-     134,   264,   135,   110,    -1,   109,   325,   110,   109,   134,
-     264,   135,   110,    -1,   109,   324,   110,    -1,   149,   323,
-      -1,   149,   227,   323,    -1,   109,   325,   110,    -1,   109,
-     325,   110,   349,    -1,   109,   326,   110,   350,    -1,   109,
-     326,   110,    -1,   328,    -1,   329,    -1,   330,    -1,   319,
-     109,   271,   110,    -1,   109,   329,   110,   109,   271,   110,
-      -1,   109,   328,   110,    -1,   149,   327,    -1,   149,   227,
-     327,    -1,   109,   329,   110,    -1,   109,   329,   110,   349,
-      -1,   109,   330,   110,   350,    -1,   109,   330,   110,    -1,
-     332,   312,    -1,   333,    -1,   334,   312,    -1,   335,   312,
-      -1,   341,    -1,   109,   332,   110,    -1,   149,   331,    -1,
-     149,   227,   331,    -1,   109,   333,   110,    -1,   332,   349,
-      -1,   109,   333,   110,   349,    -1,   109,   334,   110,   350,
-      -1,   109,   334,   110,    -1,   332,   109,   134,   264,   135,
-     110,    -1,   109,   333,   110,   109,   134,   264,   135,   110,
-      -1,   109,   335,   110,    -1,   319,   312,    -1,   337,    -1,
-     338,   312,    -1,   339,   312,    -1,   149,   336,    -1,   149,
-     227,   336,    -1,   109,   337,   110,    -1,   319,   355,    -1,
-     109,   337,   110,   349,    -1,   109,   338,   110,   350,    -1,
-     109,   338,   110,    -1,   319,   109,   134,   264,   135,   110,
-      -1,   109,   337,   110,   109,   134,   264,   135,   110,    -1,
-     109,   339,   110,    -1,   341,   312,    -1,   342,    -1,   343,
-     312,    -1,   344,   312,    -1,    74,    -1,    75,    -1,   149,
-     340,    -1,   149,   227,   340,    -1,   109,   342,   110,    -1,
-     341,   355,    -1,   109,   342,   110,   355,    -1,   341,   109,
-     134,   264,   135,   110,    -1,   109,   342,   110,   109,   134,
-     264,   135,   110,    -1,   346,    -1,   347,   312,    -1,   348,
-     312,    -1,   149,    -1,   149,   227,    -1,   149,   345,    -1,
-     149,   227,   345,    -1,   109,   346,   110,    -1,   349,    -1,
-     109,   346,   110,   349,    -1,   109,   347,   110,   350,    -1,
-     109,   347,   110,    -1,   109,   134,   264,   135,   110,    -1,
-     109,   346,   110,   109,   134,   264,   135,   110,    -1,   109,
-     348,   110,    -1,   111,   112,    -1,   111,   112,   350,    -1,
-     350,    -1,   111,   134,   164,   135,   112,    -1,   111,   134,
-     118,   135,   112,    -1,   350,   111,   134,   164,   135,   112,
-      -1,   350,   111,   134,   118,   135,   112,    -1,   352,    -1,
-     353,   312,    -1,   354,   312,    -1,   149,    -1,   149,   227,
-      -1,   149,   351,    -1,   149,   227,   351,    -1,   109,   352,
-     110,    -1,   355,    -1,   109,   352,   110,   355,    -1,   109,
-     353,   110,   350,    -1,   109,   353,   110,    -1,   109,   134,
-     264,   135,   110,    -1,   109,   352,   110,   109,   134,   264,
-     135,   110,    -1,   109,   354,   110,    -1,   356,    -1,   356,
-     350,    -1,   350,    -1,   111,   112,    -1,   111,   134,   227,
-     118,   135,   112,    -1,   111,   134,   227,   135,   112,    -1,
-     111,   134,   227,   164,   135,   112,    -1,   111,   134,     7,
-     226,   164,   135,   112,    -1,   111,   134,   227,     7,   164,
-     135,   112,    -1,   358,    -1,   359,   312,    -1,   360,   312,
-      -1,   149,    -1,   149,   227,    -1,   149,   357,    -1,   149,
-     227,   357,    -1,   109,   358,   110,    -1,   349,    -1,   109,
-     358,   110,   349,    -1,   109,   359,   110,   350,    -1,   109,
-     359,   110,    -1,   109,   358,   110,   109,   134,   264,   135,
-     110,    -1,   109,   360,   110,    -1,   362,    -1,   370,    -1,
-     227,   370,    -1,   363,    -1,   364,    -1,   149,   225,    -1,
-     227,   149,   225,    -1,   149,   371,    -1,   227,   149,   371,
-      -1,   149,   361,    -1,   227,   149,   361,    -1,   111,   112,
-     225,    -1,   365,   225,    -1,   111,   112,   350,   225,    -1,
-     365,   350,   225,    -1,   350,   225,    -1,   111,   112,   363,
-      -1,   365,   363,    -1,   111,   112,   350,   363,    -1,   365,
-     350,   363,    -1,   350,   363,    -1,   111,   134,   227,   118,
-     135,   112,    -1,   111,   134,   227,   164,   135,   112,    -1,
-     111,   134,   231,   164,   135,   112,    -1,   111,   134,   231,
-     227,   164,   135,   112,    -1,   370,    -1,   227,   370,    -1,
-     367,    -1,   368,    -1,   369,    -1,   149,   225,    -1,   227,
-     149,   225,    -1,   149,   371,    -1,   227,   149,   371,    -1,
-     149,   366,    -1,   227,   149,   366,    -1,   111,   112,   225,
-      -1,   111,   112,   350,   225,    -1,   350,   225,    -1,   111,
-     112,   368,    -1,   111,   112,   350,   368,    -1,   350,   368,
-      -1,   111,   134,   263,   135,   112,    -1,   111,   112,   109,
-     260,   110,    -1,   370,   109,   134,   260,   135,   110,    -1,
-     218,   109,   134,   260,   135,   110,    -1,    -1,   116,    -1,
-      -1,   131,   164,    -1
+     164,    -1,   147,    -1,   146,   116,   147,    -1,   139,    -1,
+     139,   113,   147,    -1,   139,   113,   111,   134,   146,   135,
+     112,    -1,   139,    85,   147,    -1,   139,    85,   111,   134,
+     146,   135,   112,    -1,   143,    -1,   136,    -1,   141,    -1,
+      40,   151,    -1,   149,   151,    -1,   150,   151,    -1,    86,
+     148,    -1,    87,   148,    -1,    37,   148,    -1,    37,   109,
+     275,   110,    -1,    66,   148,    -1,    66,   109,   275,   110,
+      -1,    38,   109,   275,   116,   139,   110,    -1,    76,    -1,
+      76,   109,   145,   110,    -1,    76,   109,   276,   110,    -1,
+     117,    -1,   118,    -1,   119,    -1,   120,    -1,   121,    -1,
+     122,    -1,   148,    -1,   109,   275,   110,   151,    -1,   109,
+     275,   110,   167,    -1,   151,    -1,   152,   117,   151,    -1,
+     152,   123,   151,    -1,   152,   124,   151,    -1,   152,    -1,
+     153,   119,   152,    -1,   153,   120,   152,    -1,   153,    -1,
+     154,    88,   153,    -1,   154,    89,   153,    -1,   154,    -1,
+     155,   125,   154,    -1,   155,   126,   154,    -1,   155,    90,
+     154,    -1,   155,    91,   154,    -1,   155,    -1,   156,    92,
+     155,    -1,   156,    93,   155,    -1,   156,    -1,   157,   118,
+     156,    -1,   157,    -1,   158,   127,   157,    -1,   158,    -1,
+     159,   128,   158,    -1,   159,    -1,   160,    94,   159,    -1,
+     160,    -1,   161,    95,   160,    -1,   161,    -1,   161,   129,
+     169,   130,   162,    -1,   161,   129,   130,   162,    -1,   161,
+     129,   169,   130,   167,    -1,   162,    -1,   162,    -1,   148,
+     166,   164,    -1,   167,   373,    -1,    -1,   164,    -1,   131,
+      -1,    97,    -1,    98,    -1,    99,    -1,   100,    -1,   101,
+      -1,   102,    -1,   103,    -1,   104,    -1,   105,    -1,   106,
+      -1,   111,   112,    -1,   111,   134,   164,   135,   112,    -1,
+     111,   134,   116,   168,   135,   112,    -1,   111,   134,   164,
+     116,   168,   135,   112,    -1,   165,    -1,   168,   116,   165,
+      -1,   164,    -1,   169,   116,   164,    -1,    -1,   169,    -1,
+     172,    -1,   173,    -1,   177,    -1,   178,    -1,   190,    -1,
+     192,    -1,   193,    -1,   198,    -1,   127,   143,   114,   144,
+     115,   132,    -1,    72,   130,   312,   171,    -1,   114,   115,
+      -1,   114,   134,   134,   209,   174,   135,   115,    -1,   175,
+      -1,   174,   134,   175,    -1,   212,    -1,    40,   212,    -1,
+     308,    -1,   171,   135,    -1,   171,    -1,   176,   171,    -1,
+     170,   132,    -1,    41,   109,   169,   110,   171,    -1,    41,
+     109,   169,   110,   171,    42,   171,    -1,    43,   109,   169,
+     110,   183,    -1,    43,   109,   169,   110,   114,   134,   205,
+     184,   115,    -1,    53,   109,   169,   110,   183,    -1,    53,
+     109,   169,   110,   114,   134,   205,   186,   115,    -1,   163,
+      -1,   163,    96,   163,    -1,   310,    -1,   179,    -1,   180,
+     116,   179,    -1,    44,   180,   130,    -1,    45,   130,    -1,
+     181,    -1,   182,   181,    -1,   182,   171,    -1,    -1,   185,
+      -1,   182,   176,    -1,   185,   182,   176,    -1,    -1,   187,
+      -1,   182,   189,    -1,   182,   176,   188,    -1,   187,   182,
+     189,    -1,   187,   182,   176,   188,    -1,    -1,   189,    -1,
+      56,    -1,    56,   132,    -1,    47,   109,   169,   110,   171,
+      -1,    46,   171,    47,   109,   169,   110,   132,    -1,    48,
+     109,   134,   191,   110,   171,    -1,   170,   135,   132,   170,
+     132,   170,    -1,   212,   170,   132,   170,    -1,    51,    72,
+     132,    -1,    51,   117,   169,   132,    -1,    50,   132,    -1,
+      50,    72,   132,    -1,    49,   132,    -1,    49,    72,   132,
+      -1,    52,   170,   132,    -1,    61,   165,   132,    -1,    62,
+     165,   132,    -1,    62,   165,    63,   164,   132,    -1,    57,
+     173,   194,    -1,    57,   173,   196,    -1,    57,   173,   194,
+     196,    -1,   195,    -1,    58,   109,    96,   110,   173,    -1,
+     195,    58,   109,    96,   110,   173,    -1,    59,   109,    96,
+     110,   173,    -1,   195,    59,   109,    96,   110,   173,    -1,
+      58,   109,   134,   134,   197,   135,   110,   173,   135,    -1,
+     195,    58,   109,   134,   134,   197,   135,   110,   173,   135,
+      -1,    59,   109,   134,   134,   197,   135,   110,   173,   135,
+      -1,   195,    59,   109,   134,   134,   197,   135,   110,   173,
+     135,    -1,    60,   173,    -1,   225,    -1,   225,   309,    -1,
+     225,   357,    -1,   366,   139,    -1,   366,    -1,    64,   199,
+     109,   141,   110,   132,    -1,    64,   199,   109,   141,   130,
+     200,   110,   132,    -1,    64,   199,   109,   141,   130,   200,
+     130,   200,   110,   132,    -1,    64,   199,   109,   141,   130,
+     200,   130,   200,   130,   203,   110,   132,    -1,    64,   199,
+      51,   109,   141,   130,   130,   200,   130,   203,   130,   204,
+     110,   132,    -1,    -1,    11,    -1,    -1,   201,    -1,   202,
+      -1,   201,   116,   202,    -1,   141,   109,   163,   110,    -1,
+     111,   163,   112,   141,   109,   163,   110,    -1,    -1,   141,
+      -1,   203,   116,   141,    -1,   139,    -1,   204,   116,   139,
+      -1,   135,    -1,   206,    -1,   212,    -1,   206,   134,   212,
+      -1,   135,    -1,   208,    -1,   222,    -1,   208,   134,   222,
+      -1,    -1,   210,    -1,    29,   211,   132,    -1,   210,    29,
+     211,   132,    -1,   274,    -1,   211,   116,   274,    -1,   213,
+      -1,   222,    -1,   214,   135,   132,    -1,   219,   135,   132,
+      -1,   216,   135,   132,    -1,   293,   135,   132,    -1,   296,
+     135,   132,    -1,   215,   277,    -1,   231,   215,   277,    -1,
+     214,   135,   116,   134,   272,   277,    -1,   367,   272,   311,
+      -1,   370,   272,   311,    -1,   227,   370,   272,   311,    -1,
+     217,    -1,   227,   217,    -1,   231,   217,    -1,   231,   227,
+     217,    -1,   216,   135,   116,   134,   272,    -1,   111,   112,
+     272,   109,   134,   260,   135,   110,    -1,   370,   272,   109,
+     134,   260,   135,   110,    -1,   218,   272,   109,   134,   260,
+     135,   110,    -1,   111,   134,   262,   135,   112,    -1,   111,
+     134,   262,   135,   116,   134,   263,   135,   112,    -1,     3,
+     215,    -1,     3,   217,    -1,   219,   135,   116,   134,   139,
+      -1,     3,   225,   309,    -1,   220,   135,   116,   134,   309,
+      -1,   227,     3,   225,   309,    -1,   225,     3,   309,    -1,
+     225,     3,   227,   309,    -1,     3,   139,   131,   164,    -1,
+     221,   135,   116,   134,   139,   131,   164,    -1,   223,   135,
+     132,    -1,   220,   135,   132,    -1,   221,   135,   132,    -1,
+     240,   135,   132,    -1,   224,   309,   311,   277,    -1,   223,
+     116,   312,   309,   311,   277,    -1,   236,    -1,   240,    -1,
+     242,    -1,   283,    -1,   237,    -1,   241,    -1,   243,    -1,
+     284,    -1,    -1,   227,    -1,   228,    -1,   227,   228,    -1,
+     229,    -1,   314,    -1,    10,    -1,    12,    -1,    11,    -1,
+      14,    -1,    67,    -1,    -1,    13,   109,   230,   286,   110,
+      -1,   232,    -1,   227,   232,    -1,   231,   227,   232,    -1,
+     233,    -1,   232,   233,    -1,   234,    -1,     5,    -1,     7,
+      -1,     4,    -1,     6,    -1,     8,    -1,     9,    -1,    69,
+      -1,    71,    -1,    16,    -1,    21,    -1,    20,    -1,    18,
+      -1,    19,    -1,    17,    -1,    22,    -1,    23,    -1,    15,
+      -1,    25,    -1,    26,    -1,    27,    -1,    24,    -1,   237,
+      -1,   231,   237,    -1,   236,   233,    -1,   236,   233,   227,
+      -1,   236,   233,   237,    -1,   238,    -1,   226,   239,   226,
+      -1,   235,    -1,   227,   235,    -1,   238,   228,    -1,   238,
+     235,    -1,    28,   109,   276,   110,    -1,    28,   109,   169,
+     110,    -1,    78,   109,   276,   110,    -1,    78,   109,   169,
+     110,    -1,   241,    -1,   231,   241,    -1,   240,   233,    -1,
+     240,   233,   227,    -1,   244,    -1,   227,   244,    -1,   241,
+     228,    -1,   243,    -1,   231,   243,    -1,   242,   233,    -1,
+     242,   233,   227,    -1,    74,    -1,   227,    74,    -1,   243,
+     228,    -1,   245,    -1,   256,    -1,   247,   114,   248,   115,
+      -1,   247,   274,    -1,    -1,   247,   274,   246,   114,   248,
+     115,    -1,   247,   109,   292,   110,   114,   248,   115,    -1,
+     247,   285,    -1,    31,   312,    -1,    32,   312,    -1,    -1,
+     248,   249,    -1,   250,   132,    -1,    40,   250,   132,    -1,
+     251,   132,    -1,    40,   251,   132,    -1,   366,    -1,   366,
+     274,    -1,   250,   116,   274,    -1,   250,   116,    -1,   225,
+     252,    -1,   251,   116,   312,   252,    -1,    -1,   254,    -1,
+     318,   253,    -1,   331,   253,    -1,   357,    -1,    -1,   254,
+      -1,   130,   163,    -1,    30,   312,    -1,   255,   114,   258,
+     372,   115,    -1,   255,   274,    -1,    -1,   255,   274,   257,
+     114,   258,   372,   115,    -1,   274,   259,    -1,   258,   116,
+     274,   259,    -1,    -1,   131,   163,    -1,    -1,   261,    -1,
+     263,    -1,   262,    -1,   262,   135,   116,   134,   263,    -1,
+     263,   135,   116,   134,    96,    -1,   262,   135,   116,   134,
+      96,    -1,   267,    -1,   263,   135,   116,   134,   267,    -1,
+     262,   135,   116,   134,   267,    -1,   262,   135,   116,   134,
+     263,   135,   116,   134,   267,    -1,   268,    -1,   263,   135,
+     116,   134,   268,    -1,    -1,   265,    -1,   266,    -1,   266,
+     135,   116,   134,    96,    -1,   270,    -1,   269,    -1,   266,
+     135,   116,   134,   270,    -1,   266,   135,   116,   134,   269,
+      -1,   269,    -1,   362,   272,   373,    -1,   370,   272,   373,
+      -1,   227,   370,   272,   373,    -1,   217,    -1,   270,    -1,
+     362,    -1,   370,    -1,   227,   370,    -1,   371,    -1,   224,
+     336,   373,    -1,   224,   340,   373,    -1,   224,    -1,   224,
+     351,    -1,   139,    -1,   271,   116,   139,    -1,   137,    -1,
+      74,    -1,    75,    -1,   138,    -1,    74,    -1,    75,    -1,
+     139,    -1,    74,    -1,    75,    -1,   366,    -1,   225,    -1,
+     225,   357,    -1,   366,    -1,   371,    -1,   225,    -1,   225,
+     345,    -1,    -1,   131,   278,    -1,   107,   278,    -1,   164,
+      -1,   114,   279,   372,   115,    -1,    -1,   278,    -1,   280,
+     278,    -1,   279,   116,   278,    -1,   279,   116,   280,   278,
+      -1,   281,   130,    -1,   274,   130,    -1,   282,    -1,   281,
+     282,    -1,   113,   274,    -1,   111,   134,   164,   135,   112,
+      -1,   111,   134,   310,   135,   112,    -1,   111,   134,   163,
+      96,   163,   135,   112,    -1,   113,   111,   134,   146,   135,
+     112,    -1,   284,    -1,   231,   284,    -1,   283,   233,    -1,
+     283,   233,   227,    -1,   285,    -1,   227,   285,    -1,   284,
+     228,    -1,    75,   109,   292,   110,    -1,   287,   373,    -1,
+     286,   116,   287,   373,    -1,    -1,   289,   274,   288,   290,
+      -1,   225,   336,    -1,    33,    -1,    35,    -1,    34,    -1,
+      -1,   290,   291,    -1,   128,   274,   109,   292,   110,    -1,
+     128,   114,   134,   298,   115,    -1,   128,   109,   134,   286,
+     135,   110,   114,   134,   298,   115,   109,   292,   110,    -1,
+     276,    -1,   164,    -1,   292,   116,   276,    -1,   292,   116,
+     164,    -1,    33,   294,    -1,   232,    33,   294,    -1,   293,
+     116,   294,    -1,   295,   290,    -1,   295,   290,   131,   276,
+      -1,   274,    -1,   273,   109,   134,   286,   135,   110,    -1,
+      36,   274,   109,   134,   286,   135,   110,   114,   115,    -1,
+      -1,    36,   274,   109,   134,   286,   135,   110,   114,   297,
+     298,   115,    -1,   299,    -1,   298,   134,   299,    -1,   300,
+     135,   132,    -1,   301,   135,   132,    -1,   215,    -1,   217,
+      -1,   300,   135,   116,   134,   272,    -1,   225,   309,    -1,
+     301,   135,   116,   134,   309,    -1,    -1,   303,    -1,   305,
+      -1,   303,   134,   305,    -1,    -1,   303,    -1,   212,    -1,
+     307,    -1,   198,    -1,    -1,     5,    82,   306,   114,   304,
+     115,    -1,    40,   305,    -1,   308,    -1,   323,   173,    -1,
+     327,   134,   207,   173,    -1,   216,   173,    -1,   224,   323,
+     173,    -1,   227,   323,   173,    -1,   231,   323,   173,    -1,
+     231,   227,   323,   173,    -1,   224,   327,   134,   207,   173,
+      -1,   227,   327,   134,   207,   173,    -1,   231,   327,   134,
+     207,   173,    -1,   231,   227,   327,   134,   207,   173,    -1,
+     318,    -1,   331,    -1,   323,    -1,   163,   122,   163,    -1,
+      -1,    64,   109,   141,   110,   312,    -1,    -1,   313,    -1,
+     314,    -1,   313,   314,    -1,    39,   109,   109,   315,   110,
+     110,    -1,   316,    -1,   315,   116,   316,    -1,    -1,   317,
+      -1,   317,   109,   170,   110,    -1,   272,    -1,   234,    -1,
+     235,    -1,   228,    -1,   319,   312,    -1,   320,    -1,   321,
+     312,    -1,   322,   312,    -1,   137,    -1,   109,   319,   110,
+      -1,   149,   318,    -1,   149,   227,   318,    -1,   109,   320,
+     110,    -1,   319,   349,    -1,   109,   320,   110,   349,    -1,
+     109,   321,   110,   350,    -1,   109,   321,   110,    -1,   109,
+     320,   110,   109,   134,   264,   135,   110,    -1,   109,   322,
+     110,    -1,   324,   312,    -1,   325,    -1,   326,   312,    -1,
+     319,   109,   134,   264,   135,   110,    -1,   109,   325,   110,
+     109,   134,   264,   135,   110,    -1,   109,   324,   110,    -1,
+     149,   323,    -1,   149,   227,   323,    -1,   109,   325,   110,
+      -1,   109,   325,   110,   349,    -1,   109,   326,   110,   350,
+      -1,   109,   326,   110,    -1,   328,    -1,   329,    -1,   330,
+      -1,   319,   109,   271,   110,    -1,   109,   329,   110,   109,
+     271,   110,    -1,   109,   328,   110,    -1,   149,   327,    -1,
+     149,   227,   327,    -1,   109,   329,   110,    -1,   109,   329,
+     110,   349,    -1,   109,   330,   110,   350,    -1,   109,   330,
+     110,    -1,   332,   312,    -1,   333,    -1,   334,   312,    -1,
+     335,   312,    -1,   341,    -1,   109,   332,   110,    -1,   149,
+     331,    -1,   149,   227,   331,    -1,   109,   333,   110,    -1,
+     332,   349,    -1,   109,   333,   110,   349,    -1,   109,   334,
+     110,   350,    -1,   109,   334,   110,    -1,   332,   109,   134,
+     264,   135,   110,    -1,   109,   333,   110,   109,   134,   264,
+     135,   110,    -1,   109,   335,   110,    -1,   319,   312,    -1,
+     337,    -1,   338,   312,    -1,   339,   312,    -1,   149,   336,
+      -1,   149,   227,   336,    -1,   109,   337,   110,    -1,   319,
+     355,    -1,   109,   337,   110,   349,    -1,   109,   338,   110,
+     350,    -1,   109,   338,   110,    -1,   319,   109,   134,   264,
+     135,   110,    -1,   109,   337,   110,   109,   134,   264,   135,
+     110,    -1,   109,   339,   110,    -1,   341,   312,    -1,   342,
+      -1,   343,   312,    -1,   344,   312,    -1,    74,    -1,    75,
+      -1,   149,   340,    -1,   149,   227,   340,    -1,   109,   342,
+     110,    -1,   341,   355,    -1,   109,   342,   110,   355,    -1,
+     341,   109,   134,   264,   135,   110,    -1,   109,   342,   110,
+     109,   134,   264,   135,   110,    -1,   346,    -1,   347,   312,
+      -1,   348,   312,    -1,   149,    -1,   149,   227,    -1,   149,
+     345,    -1,   149,   227,   345,    -1,   109,   346,   110,    -1,
+     349,    -1,   109,   346,   110,   349,    -1,   109,   347,   110,
+     350,    -1,   109,   347,   110,    -1,   109,   134,   264,   135,
+     110,    -1,   109,   346,   110,   109,   134,   264,   135,   110,
+      -1,   109,   348,   110,    -1,   111,   112,    -1,   111,   112,
+     350,    -1,   350,    -1,   111,   134,   164,   135,   112,    -1,
+     111,   134,   117,   135,   112,    -1,   350,   111,   134,   164,
+     135,   112,    -1,   350,   111,   134,   117,   135,   112,    -1,
+     352,    -1,   353,   312,    -1,   354,   312,    -1,   149,    -1,
+     149,   227,    -1,   149,   351,    -1,   149,   227,   351,    -1,
+     109,   352,   110,    -1,   355,    -1,   109,   352,   110,   355,
+      -1,   109,   353,   110,   350,    -1,   109,   353,   110,    -1,
+     109,   134,   264,   135,   110,    -1,   109,   352,   110,   109,
+     134,   264,   135,   110,    -1,   109,   354,   110,    -1,   356,
+      -1,   356,   350,    -1,   350,    -1,   111,   112,    -1,   111,
+     134,   227,   117,   135,   112,    -1,   111,   134,   227,   135,
+     112,    -1,   111,   134,   227,   164,   135,   112,    -1,   111,
+     134,     7,   226,   164,   135,   112,    -1,   111,   134,   227,
+       7,   164,   135,   112,    -1,   358,    -1,   359,   312,    -1,
+     360,   312,    -1,   149,    -1,   149,   227,    -1,   149,   357,
+      -1,   149,   227,   357,    -1,   109,   358,   110,    -1,   349,
+      -1,   109,   358,   110,   349,    -1,   109,   359,   110,   350,
+      -1,   109,   359,   110,    -1,   109,   358,   110,   109,   134,
+     264,   135,   110,    -1,   109,   360,   110,    -1,   362,    -1,
+     370,    -1,   227,   370,    -1,   363,    -1,   364,    -1,   149,
+     225,    -1,   227,   149,   225,    -1,   149,   371,    -1,   227,
+     149,   371,    -1,   149,   361,    -1,   227,   149,   361,    -1,
+     111,   112,   225,    -1,   365,   225,    -1,   111,   112,   350,
+     225,    -1,   365,   350,   225,    -1,   350,   225,    -1,   111,
+     112,   363,    -1,   365,   363,    -1,   111,   112,   350,   363,
+      -1,   365,   350,   363,    -1,   350,   363,    -1,   111,   134,
+     227,   117,   135,   112,    -1,   111,   134,   227,   164,   135,
+     112,    -1,   111,   134,   231,   164,   135,   112,    -1,   111,
+     134,   231,   227,   164,   135,   112,    -1,   370,    -1,   227,
+     370,    -1,   367,    -1,   368,    -1,   369,    -1,   149,   225,
+      -1,   227,   149,   225,    -1,   149,   371,    -1,   227,   149,
+     371,    -1,   149,   366,    -1,   227,   149,   366,    -1,   111,
+     112,   225,    -1,   111,   112,   350,   225,    -1,   350,   225,
+      -1,   111,   112,   368,    -1,   111,   112,   350,   368,    -1,
+     350,   368,    -1,   111,   134,   263,   135,   112,    -1,   111,
+     112,   109,   260,   110,    -1,   370,   109,   134,   260,   135,
+     110,    -1,   218,   109,   134,   260,   135,   110,    -1,    -1,
+     116,    -1,    -1,   131,   164,    -1
 };
 
@@ -1016,80 +1020,80 @@
 static const yytype_uint16 yyrline[] =
 {
-       0,   290,   290,   296,   305,   306,   307,   311,   312,   313,
-     317,   318,   322,   323,   327,   328,   332,   333,   339,   341,
-     343,   345,   350,   351,   357,   361,   363,   364,   366,   367,
-     369,   371,   373,   381,   382,   388,   389,   390,   395,   397,
-     402,   403,   407,   411,   413,   415,   417,   422,   425,   427,
-     429,   431,   436,   438,   440,   442,   444,   446,   448,   450,
-     452,   454,   456,   463,   464,   466,   470,   471,   472,   473,
-     477,   478,   480,   485,   486,   488,   490,   495,   496,   498,
-     503,   504,   506,   511,   512,   514,   516,   518,   523,   524,
-     526,   531,   532,   537,   538,   543,   544,   549,   550,   555,
-     556,   561,   562,   564,   566,   571,   576,   577,   579,   581,
-     587,   588,   594,   596,   598,   600,   605,   606,   611,   612,
-     613,   614,   615,   616,   617,   618,   619,   620,   624,   625,
-     631,   632,   638,   639,   640,   641,   642,   643,   644,   645,
-     646,   656,   663,   665,   675,   676,   681,   683,   689,   691,
-     695,   696,   701,   706,   709,   711,   713,   722,   724,   735,
-     736,   738,   742,   743,   748,   749,   754,   755,   759,   764,
-     765,   769,   771,   777,   778,   782,   784,   786,   788,   794,
-     795,   799,   801,   806,   808,   810,   815,   817,   822,   824,
-     828,   831,   835,   838,   842,   844,   848,   850,   857,   859,
-     861,   870,   872,   874,   876,   878,   883,   885,   887,   889,
-     894,   907,   908,   913,   915,   920,   924,   926,   928,   930,
-     932,   938,   939,   945,   946,   950,   951,   956,   958,   964,
-     965,   967,   972,   974,   981,   983,   987,   988,   993,   995,
-     999,  1000,  1004,  1006,  1010,  1011,  1015,  1016,  1020,  1021,
-    1036,  1037,  1038,  1039,  1040,  1044,  1049,  1056,  1066,  1071,
-    1076,  1084,  1089,  1094,  1099,  1104,  1112,  1134,  1139,  1146,
-    1148,  1155,  1160,  1165,  1176,  1181,  1186,  1191,  1196,  1205,
-    1210,  1218,  1219,  1220,  1221,  1227,  1232,  1240,  1241,  1242,
-    1243,  1247,  1248,  1249,  1250,  1255,  1256,  1265,  1266,  1271,
-    1272,  1277,  1279,  1281,  1283,  1285,  1288,  1287,  1299,  1300,
-    1302,  1312,  1313,  1318,  1322,  1324,  1326,  1328,  1330,  1332,
-    1334,  1336,  1341,  1343,  1345,  1347,  1349,  1351,  1353,  1355,
-    1357,  1359,  1361,  1363,  1365,  1371,  1372,  1374,  1376,  1378,
-    1383,  1384,  1390,  1391,  1393,  1395,  1400,  1402,  1404,  1406,
-    1411,  1412,  1414,  1416,  1421,  1422,  1424,  1429,  1430,  1432,
-    1434,  1439,  1441,  1443,  1448,  1449,  1453,  1455,  1461,  1460,
-    1464,  1466,  1471,  1473,  1479,  1480,  1485,  1486,  1488,  1489,
-    1498,  1499,  1501,  1503,  1508,  1510,  1516,  1517,  1519,  1522,
-    1525,  1530,  1531,  1536,  1541,  1545,  1547,  1553,  1552,  1559,
-    1561,  1567,  1568,  1576,  1577,  1581,  1582,  1583,  1585,  1587,
-    1594,  1595,  1597,  1599,  1604,  1605,  1611,  1612,  1616,  1617,
-    1622,  1623,  1624,  1626,  1634,  1635,  1637,  1640,  1642,  1646,
-    1647,  1648,  1650,  1652,  1656,  1661,  1669,  1670,  1679,  1681,
-    1686,  1687,  1688,  1692,  1693,  1694,  1698,  1699,  1700,  1704,
-    1705,  1706,  1711,  1712,  1713,  1714,  1720,  1721,  1723,  1728,
-    1729,  1734,  1735,  1736,  1737,  1738,  1753,  1754,  1759,  1760,
-    1768,  1770,  1772,  1775,  1777,  1779,  1802,  1803,  1805,  1807,
-    1812,  1813,  1815,  1820,  1825,  1826,  1832,  1831,  1835,  1839,
-    1841,  1843,  1849,  1850,  1855,  1860,  1862,  1867,  1869,  1870,
-    1872,  1877,  1879,  1881,  1886,  1888,  1893,  1898,  1906,  1912,
-    1911,  1925,  1926,  1931,  1932,  1936,  1941,  1946,  1954,  1959,
-    1970,  1971,  1982,  1983,  1989,  1990,  1994,  1995,  1996,  1999,
-    1998,  2009,  2018,  2024,  2030,  2039,  2045,  2051,  2057,  2063,
-    2071,  2077,  2085,  2091,  2100,  2101,  2102,  2106,  2110,  2112,
-    2117,  2118,  2122,  2123,  2128,  2134,  2135,  2138,  2140,  2141,
-    2145,  2146,  2147,  2148,  2182,  2184,  2185,  2187,  2192,  2197,
-    2202,  2204,  2206,  2211,  2213,  2215,  2217,  2222,  2224,  2233,
-    2235,  2236,  2241,  2243,  2245,  2250,  2252,  2254,  2259,  2261,
-    2263,  2272,  2273,  2274,  2278,  2280,  2282,  2287,  2289,  2291,
-    2296,  2298,  2300,  2315,  2317,  2318,  2320,  2325,  2326,  2331,
-    2333,  2335,  2340,  2342,  2344,  2346,  2351,  2353,  2355,  2365,
-    2367,  2368,  2370,  2375,  2377,  2379,  2384,  2386,  2388,  2390,
-    2395,  2397,  2399,  2430,  2432,  2433,  2435,  2440,  2445,  2453,
-    2455,  2457,  2462,  2464,  2469,  2471,  2485,  2486,  2488,  2493,
-    2495,  2497,  2499,  2501,  2506,  2507,  2509,  2511,  2516,  2518,
-    2520,  2526,  2528,  2530,  2534,  2536,  2538,  2540,  2554,  2555,
-    2557,  2562,  2564,  2566,  2568,  2570,  2575,  2576,  2578,  2580,
-    2585,  2587,  2589,  2595,  2596,  2598,  2607,  2610,  2612,  2615,
-    2617,  2619,  2632,  2633,  2635,  2640,  2642,  2644,  2646,  2648,
-    2653,  2654,  2656,  2658,  2663,  2665,  2673,  2674,  2675,  2680,
-    2681,  2685,  2687,  2689,  2691,  2693,  2695,  2702,  2704,  2706,
-    2708,  2710,  2712,  2714,  2716,  2718,  2720,  2725,  2727,  2729,
-    2734,  2760,  2761,  2763,  2767,  2768,  2772,  2774,  2776,  2778,
-    2780,  2782,  2789,  2791,  2793,  2795,  2797,  2799,  2804,  2809,
-    2811,  2813,  2831,  2833,  2838,  2839
+       0,   298,   298,   304,   313,   314,   315,   319,   320,   321,
+     325,   326,   330,   331,   335,   336,   340,   341,   352,   354,
+     356,   358,   363,   364,   370,   374,   376,   377,   379,   380,
+     382,   384,   386,   395,   396,   402,   403,   407,   408,   412,
+     416,   418,   420,   422,   427,   430,   432,   434,   439,   452,
+     454,   456,   458,   460,   462,   464,   466,   468,   470,   472,
+     479,   480,   486,   487,   488,   489,   493,   494,   496,   501,
+     502,   504,   506,   511,   512,   514,   519,   520,   522,   527,
+     528,   530,   532,   534,   539,   540,   542,   547,   548,   553,
+     554,   559,   560,   565,   566,   571,   572,   577,   578,   581,
+     583,   588,   593,   594,   596,   602,   603,   607,   608,   609,
+     610,   611,   612,   613,   614,   615,   616,   617,   623,   625,
+     627,   629,   634,   635,   640,   641,   647,   648,   654,   655,
+     656,   657,   658,   659,   660,   661,   662,   672,   679,   681,
+     691,   692,   697,   699,   705,   707,   711,   712,   717,   722,
+     725,   727,   729,   739,   741,   752,   753,   755,   759,   761,
+     765,   766,   771,   772,   776,   781,   782,   786,   788,   794,
+     795,   799,   801,   803,   805,   811,   812,   816,   818,   823,
+     825,   827,   832,   834,   839,   841,   845,   848,   852,   855,
+     859,   861,   863,   865,   870,   872,   874,   879,   881,   883,
+     885,   887,   892,   894,   896,   898,   903,   915,   916,   921,
+     923,   928,   932,   934,   936,   938,   940,   946,   947,   953,
+     954,   958,   959,   964,   966,   972,   973,   975,   980,   982,
+     989,   991,   995,   996,  1001,  1003,  1007,  1008,  1012,  1014,
+    1018,  1019,  1023,  1024,  1028,  1029,  1044,  1045,  1046,  1047,
+    1048,  1052,  1057,  1064,  1074,  1079,  1084,  1092,  1097,  1102,
+    1107,  1112,  1120,  1142,  1147,  1154,  1156,  1163,  1168,  1173,
+    1184,  1189,  1194,  1199,  1204,  1213,  1218,  1226,  1227,  1228,
+    1229,  1235,  1240,  1248,  1249,  1250,  1251,  1255,  1256,  1257,
+    1258,  1263,  1264,  1273,  1274,  1279,  1280,  1285,  1287,  1289,
+    1291,  1293,  1296,  1295,  1307,  1308,  1310,  1320,  1321,  1326,
+    1330,  1332,  1334,  1336,  1338,  1340,  1342,  1344,  1349,  1351,
+    1353,  1355,  1357,  1359,  1361,  1363,  1365,  1367,  1369,  1371,
+    1373,  1379,  1380,  1382,  1384,  1386,  1391,  1392,  1398,  1399,
+    1401,  1403,  1408,  1410,  1412,  1414,  1419,  1420,  1422,  1424,
+    1429,  1430,  1432,  1437,  1438,  1440,  1442,  1447,  1449,  1451,
+    1456,  1457,  1461,  1463,  1469,  1468,  1472,  1474,  1479,  1481,
+    1487,  1488,  1493,  1494,  1496,  1497,  1506,  1507,  1509,  1511,
+    1516,  1518,  1524,  1525,  1527,  1530,  1533,  1538,  1539,  1544,
+    1549,  1553,  1555,  1561,  1560,  1567,  1569,  1575,  1576,  1584,
+    1585,  1589,  1590,  1591,  1593,  1595,  1602,  1603,  1605,  1607,
+    1612,  1613,  1619,  1620,  1624,  1625,  1630,  1631,  1632,  1634,
+    1642,  1643,  1645,  1648,  1650,  1654,  1655,  1656,  1658,  1660,
+    1664,  1669,  1677,  1678,  1687,  1689,  1694,  1695,  1696,  1700,
+    1701,  1702,  1706,  1707,  1708,  1712,  1713,  1714,  1719,  1720,
+    1721,  1722,  1728,  1729,  1731,  1736,  1737,  1742,  1743,  1744,
+    1745,  1746,  1761,  1762,  1767,  1768,  1774,  1776,  1779,  1781,
+    1783,  1806,  1807,  1809,  1811,  1816,  1817,  1819,  1824,  1829,
+    1830,  1836,  1835,  1839,  1843,  1845,  1847,  1853,  1854,  1859,
+    1864,  1866,  1871,  1873,  1874,  1876,  1881,  1883,  1885,  1890,
+    1892,  1897,  1902,  1910,  1916,  1915,  1929,  1930,  1935,  1936,
+    1940,  1945,  1950,  1958,  1963,  1974,  1975,  1986,  1987,  1993,
+    1994,  1998,  1999,  2000,  2003,  2002,  2013,  2022,  2028,  2034,
+    2043,  2049,  2055,  2061,  2067,  2075,  2081,  2089,  2095,  2104,
+    2105,  2106,  2110,  2114,  2116,  2121,  2122,  2126,  2127,  2132,
+    2138,  2139,  2142,  2144,  2145,  2149,  2150,  2151,  2152,  2186,
+    2188,  2189,  2191,  2196,  2201,  2206,  2208,  2210,  2215,  2217,
+    2219,  2221,  2226,  2228,  2237,  2239,  2240,  2245,  2247,  2249,
+    2254,  2256,  2258,  2263,  2265,  2267,  2276,  2277,  2278,  2282,
+    2284,  2286,  2291,  2293,  2295,  2300,  2302,  2304,  2319,  2321,
+    2322,  2324,  2329,  2330,  2335,  2337,  2339,  2344,  2346,  2348,
+    2350,  2355,  2357,  2359,  2369,  2371,  2372,  2374,  2379,  2381,
+    2383,  2388,  2390,  2392,  2394,  2399,  2401,  2403,  2434,  2436,
+    2437,  2439,  2444,  2449,  2457,  2459,  2461,  2466,  2468,  2473,
+    2475,  2489,  2490,  2492,  2497,  2499,  2501,  2503,  2505,  2510,
+    2511,  2513,  2515,  2520,  2522,  2524,  2530,  2532,  2534,  2538,
+    2540,  2542,  2544,  2558,  2559,  2561,  2566,  2568,  2570,  2572,
+    2574,  2579,  2580,  2582,  2584,  2589,  2591,  2593,  2599,  2600,
+    2602,  2611,  2614,  2616,  2619,  2621,  2623,  2636,  2637,  2639,
+    2644,  2646,  2648,  2650,  2652,  2657,  2658,  2660,  2662,  2667,
+    2669,  2677,  2678,  2679,  2684,  2685,  2689,  2691,  2693,  2695,
+    2697,  2699,  2706,  2708,  2710,  2712,  2714,  2716,  2718,  2720,
+    2722,  2724,  2729,  2731,  2733,  2738,  2764,  2765,  2767,  2771,
+    2772,  2776,  2778,  2780,  2782,  2784,  2786,  2793,  2795,  2797,
+    2799,  2801,  2803,  2808,  2813,  2815,  2817,  2835,  2837,  2842,
+    2843
 };
 #endif
@@ -1117,7 +1121,7 @@
   "DIVassign", "MODassign", "PLUSassign", "MINUSassign", "LSassign",
   "RSassign", "ANDassign", "ERassign", "ORassign", "ATassign", "THEN",
-  "'('", "')'", "'['", "']'", "'.'", "'{'", "'}'", "','", "':'", "'*'",
-  "'&'", "'+'", "'-'", "'!'", "'~'", "'/'", "'%'", "'<'", "'>'", "'^'",
-  "'|'", "'?'", "'='", "';'", "$accept", "push", "pop", "constant",
+  "'('", "')'", "'['", "']'", "'.'", "'{'", "'}'", "','", "'*'", "'&'",
+  "'+'", "'-'", "'!'", "'~'", "'/'", "'%'", "'<'", "'>'", "'^'", "'|'",
+  "'?'", "':'", "'='", "';'", "$accept", "push", "pop", "constant",
   "identifier", "no_01_identifier", "no_attr_identifier", "zero_one",
   "string_literal_list", "primary_expression", "postfix_expression",
@@ -1129,6 +1133,6 @@
   "logical_AND_expression", "logical_OR_expression",
   "conditional_expression", "constant_expression", "assignment_expression",
-  "assignment_expression_opt", "tuple", "tuple_expression_list",
-  "assignment_operator", "comma_expression", "comma_expression_opt",
+  "assignment_expression_opt", "assignment_operator", "tuple",
+  "tuple_expression_list", "comma_expression", "comma_expression_opt",
   "statement", "labeled_statement", "compound_statement",
   "block_item_list", "block_item", "statement_list",
@@ -1224,7 +1228,7 @@
      345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
      355,   356,   357,   358,   359,   360,   361,   362,   363,    40,
-      41,    91,    93,    46,   123,   125,    44,    58,    42,    38,
-      43,    45,    33,   126,    47,    37,    60,    62,    94,   124,
-      63,    61,    59
+      41,    91,    93,    46,   123,   125,    44,    42,    38,    43,
+      45,    33,   126,    47,    37,    60,    62,    94,   124,    63,
+      58,    61,    59
 };
 # endif
@@ -1236,77 +1240,77 @@
      138,   138,   139,   139,   140,   140,   141,   141,   142,   142,
      142,   142,   143,   143,   143,   143,   143,   143,   143,   143,
-     143,   143,   143,   144,   144,   145,   145,   145,   145,   145,
-     146,   146,   147,   147,   147,   147,   147,   148,   148,   148,
+     143,   143,   143,   144,   144,   145,   145,   146,   146,   147,
+     147,   147,   147,   147,   148,   148,   148,   148,   148,   148,
      148,   148,   148,   148,   148,   148,   148,   148,   148,   148,
-     148,   148,   148,   149,   149,   149,   150,   150,   150,   150,
-     151,   151,   151,   152,   152,   152,   152,   153,   153,   153,
-     154,   154,   154,   155,   155,   155,   155,   155,   156,   156,
-     156,   157,   157,   158,   158,   159,   159,   160,   160,   161,
-     161,   162,   162,   162,   162,   163,   164,   164,   164,   164,
-     165,   165,   166,   166,   166,   166,   167,   167,   168,   168,
-     168,   168,   168,   168,   168,   168,   168,   168,   169,   169,
-     170,   170,   171,   171,   171,   171,   171,   171,   171,   171,
-     171,   172,   173,   173,   174,   174,   175,   175,   175,   175,
-     176,   176,   177,   178,   178,   178,   178,   178,   178,   179,
-     179,   179,   180,   180,   181,   181,   182,   182,   183,   184,
-     184,   185,   185,   186,   186,   187,   187,   187,   187,   188,
-     188,   189,   189,   190,   190,   190,   191,   191,   192,   192,
-     192,   192,   192,   192,   192,   192,   192,   192,   193,   193,
-     193,   194,   194,   194,   194,   194,   195,   195,   195,   195,
-     196,   197,   197,   197,   197,   197,   198,   198,   198,   198,
-     198,   199,   199,   200,   200,   201,   201,   202,   202,   203,
-     203,   203,   204,   204,   205,   205,   206,   206,   207,   207,
-     208,   208,   209,   209,   210,   210,   211,   211,   212,   212,
-     213,   213,   213,   213,   213,   214,   214,   214,   215,   215,
-     215,   216,   216,   216,   216,   216,   217,   217,   217,   218,
-     218,   219,   219,   219,   220,   220,   220,   220,   220,   221,
-     221,   222,   222,   222,   222,   223,   223,   224,   224,   224,
-     224,   225,   225,   225,   225,   226,   226,   227,   227,   228,
-     228,   229,   229,   229,   229,   229,   230,   229,   231,   231,
-     231,   232,   232,   233,   234,   234,   234,   234,   234,   234,
-     234,   234,   235,   235,   235,   235,   235,   235,   235,   235,
-     235,   235,   235,   235,   235,   236,   236,   236,   236,   236,
-     237,   237,   238,   238,   238,   238,   239,   239,   239,   239,
-     240,   240,   240,   240,   241,   241,   241,   242,   242,   242,
-     242,   243,   243,   243,   244,   244,   245,   245,   246,   245,
-     245,   245,   247,   247,   248,   248,   249,   249,   249,   249,
-     250,   250,   250,   250,   251,   251,   252,   252,   252,   252,
-     252,   253,   253,   254,   255,   256,   256,   257,   256,   258,
-     258,   259,   259,   260,   260,   261,   261,   261,   261,   261,
-     262,   262,   262,   262,   263,   263,   264,   264,   265,   265,
-     266,   266,   266,   266,   267,   267,   267,   267,   267,   268,
-     268,   268,   268,   268,   269,   269,   270,   270,   271,   271,
-     272,   272,   272,   273,   273,   273,   274,   274,   274,   275,
-     275,   275,   276,   276,   276,   276,   277,   277,   277,   278,
-     278,   279,   279,   279,   279,   279,   280,   280,   281,   281,
-     282,   282,   282,   282,   282,   282,   283,   283,   283,   283,
-     284,   284,   284,   285,   286,   286,   288,   287,   287,   289,
-     289,   289,   290,   290,   291,   291,   291,   292,   292,   292,
-     292,   293,   293,   293,   294,   294,   295,   295,   296,   297,
-     296,   298,   298,   299,   299,   300,   300,   300,   301,   301,
-     302,   302,   303,   303,   304,   304,   305,   305,   305,   306,
-     305,   305,   307,   307,   307,   308,   308,   308,   308,   308,
-     308,   308,   308,   308,   309,   309,   309,   310,   311,   311,
-     312,   312,   313,   313,   314,   315,   315,   316,   316,   316,
-     317,   317,   317,   317,   318,   318,   318,   318,   319,   319,
-     320,   320,   320,   321,   321,   321,   321,   322,   322,   323,
-     323,   323,   324,   324,   324,   325,   325,   325,   326,   326,
-     326,   327,   327,   327,   328,   328,   328,   329,   329,   329,
-     330,   330,   330,   331,   331,   331,   331,   332,   332,   333,
-     333,   333,   334,   334,   334,   334,   335,   335,   335,   336,
-     336,   336,   336,   337,   337,   337,   338,   338,   338,   338,
-     339,   339,   339,   340,   340,   340,   340,   341,   341,   342,
-     342,   342,   343,   343,   344,   344,   345,   345,   345,   346,
-     346,   346,   346,   346,   347,   347,   347,   347,   348,   348,
-     348,   349,   349,   349,   350,   350,   350,   350,   351,   351,
-     351,   352,   352,   352,   352,   352,   353,   353,   353,   353,
-     354,   354,   354,   355,   355,   355,   356,   356,   356,   356,
-     356,   356,   357,   357,   357,   358,   358,   358,   358,   358,
-     359,   359,   359,   359,   360,   360,   361,   361,   361,   362,
-     362,   363,   363,   363,   363,   363,   363,   364,   364,   364,
-     364,   364,   364,   364,   364,   364,   364,   365,   365,   365,
-     365,   366,   366,   366,   367,   367,   368,   368,   368,   368,
-     368,   368,   369,   369,   369,   369,   369,   369,   370,   371,
-     371,   371,   372,   372,   373,   373
+     149,   149,   150,   150,   150,   150,   151,   151,   151,   152,
+     152,   152,   152,   153,   153,   153,   154,   154,   154,   155,
+     155,   155,   155,   155,   156,   156,   156,   157,   157,   158,
+     158,   159,   159,   160,   160,   161,   161,   162,   162,   162,
+     162,   163,   164,   164,   164,   165,   165,   166,   166,   166,
+     166,   166,   166,   166,   166,   166,   166,   166,   167,   167,
+     167,   167,   168,   168,   169,   169,   170,   170,   171,   171,
+     171,   171,   171,   171,   171,   171,   171,   172,   173,   173,
+     174,   174,   175,   175,   175,   175,   176,   176,   177,   178,
+     178,   178,   178,   178,   178,   179,   179,   179,   180,   180,
+     181,   181,   182,   182,   183,   184,   184,   185,   185,   186,
+     186,   187,   187,   187,   187,   188,   188,   189,   189,   190,
+     190,   190,   191,   191,   192,   192,   192,   192,   192,   192,
+     192,   192,   192,   192,   193,   193,   193,   194,   194,   194,
+     194,   194,   195,   195,   195,   195,   196,   197,   197,   197,
+     197,   197,   198,   198,   198,   198,   198,   199,   199,   200,
+     200,   201,   201,   202,   202,   203,   203,   203,   204,   204,
+     205,   205,   206,   206,   207,   207,   208,   208,   209,   209,
+     210,   210,   211,   211,   212,   212,   213,   213,   213,   213,
+     213,   214,   214,   214,   215,   215,   215,   216,   216,   216,
+     216,   216,   217,   217,   217,   218,   218,   219,   219,   219,
+     220,   220,   220,   220,   220,   221,   221,   222,   222,   222,
+     222,   223,   223,   224,   224,   224,   224,   225,   225,   225,
+     225,   226,   226,   227,   227,   228,   228,   229,   229,   229,
+     229,   229,   230,   229,   231,   231,   231,   232,   232,   233,
+     234,   234,   234,   234,   234,   234,   234,   234,   235,   235,
+     235,   235,   235,   235,   235,   235,   235,   235,   235,   235,
+     235,   236,   236,   236,   236,   236,   237,   237,   238,   238,
+     238,   238,   239,   239,   239,   239,   240,   240,   240,   240,
+     241,   241,   241,   242,   242,   242,   242,   243,   243,   243,
+     244,   244,   245,   245,   246,   245,   245,   245,   247,   247,
+     248,   248,   249,   249,   249,   249,   250,   250,   250,   250,
+     251,   251,   252,   252,   252,   252,   252,   253,   253,   254,
+     255,   256,   256,   257,   256,   258,   258,   259,   259,   260,
+     260,   261,   261,   261,   261,   261,   262,   262,   262,   262,
+     263,   263,   264,   264,   265,   265,   266,   266,   266,   266,
+     267,   267,   267,   267,   267,   268,   268,   268,   268,   268,
+     269,   269,   270,   270,   271,   271,   272,   272,   272,   273,
+     273,   273,   274,   274,   274,   275,   275,   275,   276,   276,
+     276,   276,   277,   277,   277,   278,   278,   279,   279,   279,
+     279,   279,   280,   280,   281,   281,   282,   282,   282,   282,
+     282,   283,   283,   283,   283,   284,   284,   284,   285,   286,
+     286,   288,   287,   287,   289,   289,   289,   290,   290,   291,
+     291,   291,   292,   292,   292,   292,   293,   293,   293,   294,
+     294,   295,   295,   296,   297,   296,   298,   298,   299,   299,
+     300,   300,   300,   301,   301,   302,   302,   303,   303,   304,
+     304,   305,   305,   305,   306,   305,   305,   307,   307,   307,
+     308,   308,   308,   308,   308,   308,   308,   308,   308,   309,
+     309,   309,   310,   311,   311,   312,   312,   313,   313,   314,
+     315,   315,   316,   316,   316,   317,   317,   317,   317,   318,
+     318,   318,   318,   319,   319,   320,   320,   320,   321,   321,
+     321,   321,   322,   322,   323,   323,   323,   324,   324,   324,
+     325,   325,   325,   326,   326,   326,   327,   327,   327,   328,
+     328,   328,   329,   329,   329,   330,   330,   330,   331,   331,
+     331,   331,   332,   332,   333,   333,   333,   334,   334,   334,
+     334,   335,   335,   335,   336,   336,   336,   336,   337,   337,
+     337,   338,   338,   338,   338,   339,   339,   339,   340,   340,
+     340,   340,   341,   341,   342,   342,   342,   343,   343,   344,
+     344,   345,   345,   345,   346,   346,   346,   346,   346,   347,
+     347,   347,   347,   348,   348,   348,   349,   349,   349,   350,
+     350,   350,   350,   351,   351,   351,   352,   352,   352,   352,
+     352,   353,   353,   353,   353,   354,   354,   354,   355,   355,
+     355,   356,   356,   356,   356,   356,   356,   357,   357,   357,
+     358,   358,   358,   358,   358,   359,   359,   359,   359,   360,
+     360,   361,   361,   361,   362,   362,   363,   363,   363,   363,
+     363,   363,   364,   364,   364,   364,   364,   364,   364,   364,
+     364,   364,   365,   365,   365,   365,   366,   366,   366,   367,
+     367,   368,   368,   368,   368,   368,   368,   369,   369,   369,
+     369,   369,   369,   370,   371,   371,   371,   372,   372,   373,
+     373
 };
 
@@ -1317,77 +1321,77 @@
        1,     1,     1,     1,     1,     1,     1,     2,     1,     1,
        3,     3,     1,     6,     4,     3,     7,     3,     7,     2,
-       2,     7,     4,     1,     3,     0,     1,     3,     7,     9,
-       1,     3,     1,     3,     7,     3,     7,     1,     1,     1,
-       2,     2,     2,     2,     2,     2,     4,     6,     1,     4,
-       4,     2,     4,     1,     1,     1,     1,     1,     1,     1,
-       1,     4,     4,     1,     3,     3,     3,     1,     3,     3,
-       1,     3,     3,     1,     3,     3,     3,     3,     1,     3,
-       3,     1,     3,     1,     3,     1,     3,     1,     3,     1,
-       3,     1,     5,     4,     5,     1,     1,     3,     3,     2,
-       0,     1,     2,     5,     6,     7,     1,     3,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     3,
-       0,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       6,     4,     2,     7,     1,     3,     1,     2,     1,     2,
-       1,     2,     2,     5,     7,     5,     9,     5,     9,     1,
-       3,     1,     1,     3,     3,     2,     1,     2,     2,     0,
-       1,     2,     3,     0,     1,     2,     3,     3,     4,     0,
-       1,     1,     2,     5,     7,     6,     6,     4,     3,     4,
-       2,     3,     2,     3,     3,     3,     3,     5,     3,     3,
-       4,     1,     5,     6,     5,     6,     9,    10,     9,    10,
-       2,     1,     2,     2,     2,     1,     6,     8,    10,    12,
-      14,     0,     1,     0,     1,     1,     3,     4,     7,     0,
-       1,     3,     1,     3,     1,     1,     1,     3,     1,     1,
-       1,     3,     0,     1,     3,     4,     1,     3,     1,     1,
-       3,     3,     3,     3,     3,     2,     3,     6,     3,     3,
-       4,     1,     2,     2,     3,     5,     8,     7,     7,     5,
-       9,     2,     2,     5,     3,     5,     4,     3,     4,     4,
-       7,     3,     3,     3,     3,     4,     6,     1,     1,     1,
-       1,     1,     1,     1,     1,     0,     1,     1,     2,     1,
-       1,     1,     1,     1,     1,     1,     0,     5,     1,     2,
-       3,     1,     2,     1,     1,     1,     1,     1,     1,     1,
+       2,     7,     4,     1,     3,     0,     1,     1,     3,     1,
+       3,     7,     3,     7,     1,     1,     1,     2,     2,     2,
+       2,     2,     2,     4,     2,     4,     6,     1,     4,     4,
+       1,     1,     1,     1,     1,     1,     1,     4,     4,     1,
+       3,     3,     3,     1,     3,     3,     1,     3,     3,     1,
+       3,     3,     3,     3,     1,     3,     3,     1,     3,     1,
+       3,     1,     3,     1,     3,     1,     3,     1,     5,     4,
+       5,     1,     1,     3,     2,     0,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     2,     5,
+       6,     7,     1,     3,     1,     3,     0,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     6,     4,     2,     7,
+       1,     3,     1,     2,     1,     2,     1,     2,     2,     5,
+       7,     5,     9,     5,     9,     1,     3,     1,     1,     3,
+       3,     2,     1,     2,     2,     0,     1,     2,     3,     0,
+       1,     2,     3,     3,     4,     0,     1,     1,     2,     5,
+       7,     6,     6,     4,     3,     4,     2,     3,     2,     3,
+       3,     3,     3,     5,     3,     3,     4,     1,     5,     6,
+       5,     6,     9,    10,     9,    10,     2,     1,     2,     2,
+       2,     1,     6,     8,    10,    12,    14,     0,     1,     0,
+       1,     1,     3,     4,     7,     0,     1,     3,     1,     3,
+       1,     1,     1,     3,     1,     1,     1,     3,     0,     1,
+       3,     4,     1,     3,     1,     1,     3,     3,     3,     3,
+       3,     2,     3,     6,     3,     3,     4,     1,     2,     2,
+       3,     5,     8,     7,     7,     5,     9,     2,     2,     5,
+       3,     5,     4,     3,     4,     4,     7,     3,     3,     3,
+       3,     4,     6,     1,     1,     1,     1,     1,     1,     1,
+       1,     0,     1,     1,     2,     1,     1,     1,     1,     1,
+       1,     1,     0,     5,     1,     2,     3,     1,     2,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     2,     2,     3,     3,
-       1,     3,     1,     2,     2,     2,     4,     4,     4,     4,
-       1,     2,     2,     3,     1,     2,     2,     1,     2,     2,
-       3,     1,     2,     2,     1,     1,     4,     2,     0,     6,
-       7,     2,     2,     2,     0,     2,     2,     3,     2,     3,
-       1,     2,     3,     2,     2,     4,     0,     1,     2,     2,
-       1,     0,     1,     2,     2,     5,     2,     0,     7,     2,
-       4,     0,     2,     0,     1,     1,     1,     5,     5,     5,
-       1,     5,     5,     9,     1,     5,     0,     1,     1,     5,
-       1,     1,     5,     5,     1,     3,     3,     4,     1,     1,
-       1,     1,     2,     1,     3,     3,     1,     2,     1,     3,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     2,     1,     1,     1,     2,     0,     2,     2,     1,
-       4,     0,     1,     2,     3,     4,     2,     2,     1,     2,
-       1,     2,     5,     5,     7,     6,     1,     2,     2,     3,
-       1,     2,     2,     4,     2,     4,     0,     4,     2,     1,
-       1,     1,     0,     2,     5,     5,    13,     1,     1,     3,
-       3,     2,     3,     3,     2,     4,     1,     6,     9,     0,
-      11,     1,     3,     3,     3,     1,     1,     5,     2,     5,
-       0,     1,     1,     3,     0,     1,     1,     1,     1,     0,
-       6,     2,     1,     2,     4,     2,     3,     3,     3,     4,
-       5,     5,     5,     6,     1,     1,     1,     3,     0,     5,
-       0,     1,     1,     2,     6,     1,     3,     0,     1,     4,
-       1,     1,     1,     1,     2,     1,     2,     2,     1,     3,
-       2,     3,     3,     2,     4,     4,     3,     8,     3,     2,
-       1,     2,     6,     8,     3,     2,     3,     3,     4,     4,
-       3,     1,     1,     1,     4,     6,     3,     2,     3,     3,
-       4,     4,     3,     2,     1,     2,     2,     1,     3,     2,
-       3,     3,     2,     4,     4,     3,     6,     8,     3,     2,
-       1,     2,     2,     2,     3,     3,     2,     4,     4,     3,
-       6,     8,     3,     2,     1,     2,     2,     1,     1,     2,
-       3,     3,     2,     4,     6,     8,     1,     2,     2,     1,
-       2,     2,     3,     3,     1,     4,     4,     3,     5,     8,
-       3,     2,     3,     1,     5,     5,     6,     6,     1,     2,
-       2,     1,     2,     2,     3,     3,     1,     4,     4,     3,
-       5,     8,     3,     1,     2,     1,     2,     6,     5,     6,
-       7,     7,     1,     2,     2,     1,     2,     2,     3,     3,
-       1,     4,     4,     3,     8,     3,     1,     1,     2,     1,
-       1,     2,     3,     2,     3,     2,     3,     3,     2,     4,
-       3,     2,     3,     2,     4,     3,     2,     6,     6,     6,
-       7,     1,     2,     1,     1,     1,     2,     3,     2,     3,
-       2,     3,     3,     4,     2,     3,     4,     2,     5,     5,
-       6,     6,     0,     1,     0,     2
+       1,     1,     2,     2,     3,     3,     1,     3,     1,     2,
+       2,     2,     4,     4,     4,     4,     1,     2,     2,     3,
+       1,     2,     2,     1,     2,     2,     3,     1,     2,     2,
+       1,     1,     4,     2,     0,     6,     7,     2,     2,     2,
+       0,     2,     2,     3,     2,     3,     1,     2,     3,     2,
+       2,     4,     0,     1,     2,     2,     1,     0,     1,     2,
+       2,     5,     2,     0,     7,     2,     4,     0,     2,     0,
+       1,     1,     1,     5,     5,     5,     1,     5,     5,     9,
+       1,     5,     0,     1,     1,     5,     1,     1,     5,     5,
+       1,     3,     3,     4,     1,     1,     1,     1,     2,     1,
+       3,     3,     1,     2,     1,     3,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     2,     1,     1,
+       1,     2,     0,     2,     2,     1,     4,     0,     1,     2,
+       3,     4,     2,     2,     1,     2,     2,     5,     5,     7,
+       6,     1,     2,     2,     3,     1,     2,     2,     4,     2,
+       4,     0,     4,     2,     1,     1,     1,     0,     2,     5,
+       5,    13,     1,     1,     3,     3,     2,     3,     3,     2,
+       4,     1,     6,     9,     0,    11,     1,     3,     3,     3,
+       1,     1,     5,     2,     5,     0,     1,     1,     3,     0,
+       1,     1,     1,     1,     0,     6,     2,     1,     2,     4,
+       2,     3,     3,     3,     4,     5,     5,     5,     6,     1,
+       1,     1,     3,     0,     5,     0,     1,     1,     2,     6,
+       1,     3,     0,     1,     4,     1,     1,     1,     1,     2,
+       1,     2,     2,     1,     3,     2,     3,     3,     2,     4,
+       4,     3,     8,     3,     2,     1,     2,     6,     8,     3,
+       2,     3,     3,     4,     4,     3,     1,     1,     1,     4,
+       6,     3,     2,     3,     3,     4,     4,     3,     2,     1,
+       2,     2,     1,     3,     2,     3,     3,     2,     4,     4,
+       3,     6,     8,     3,     2,     1,     2,     2,     2,     3,
+       3,     2,     4,     4,     3,     6,     8,     3,     2,     1,
+       2,     2,     1,     1,     2,     3,     3,     2,     4,     6,
+       8,     1,     2,     2,     1,     2,     2,     3,     3,     1,
+       4,     4,     3,     5,     8,     3,     2,     3,     1,     5,
+       5,     6,     6,     1,     2,     2,     1,     2,     2,     3,
+       3,     1,     4,     4,     3,     5,     8,     3,     1,     2,
+       1,     2,     6,     5,     6,     7,     7,     1,     2,     2,
+       1,     2,     2,     3,     3,     1,     4,     4,     3,     8,
+       3,     1,     1,     2,     1,     1,     2,     3,     2,     3,
+       2,     3,     3,     2,     4,     3,     2,     3,     2,     4,
+       3,     2,     6,     6,     6,     7,     1,     2,     1,     1,
+       1,     2,     3,     2,     3,     2,     3,     3,     4,     2,
+       3,     4,     2,     5,     5,     6,     6,     0,     1,     0,
+       2
 };
 
@@ -1397,162 +1401,160 @@
 static const yytype_uint16 yydefact[] =
 {
-     295,   295,   316,   314,   317,   315,   318,   319,   301,   303,
-     302,     0,   304,   330,   322,   327,   325,   326,   324,   323,
-     328,   329,   334,   331,   332,   333,   550,   550,   550,     0,
-       0,     0,   295,   221,   305,   320,   321,     7,   361,     0,
-       8,    14,    15,    65,     0,     2,    63,    64,   568,     9,
-     295,   528,   526,   248,     3,   456,     3,   261,     0,     3,
-       3,     3,   249,     3,     0,     0,     0,   296,   297,   299,
-     295,   308,   311,   313,   342,   287,   335,   340,   288,   350,
-     289,   357,   354,   364,     0,     0,   365,   290,   476,   480,
-       3,     3,     0,     2,   522,   527,   532,   300,     0,     0,
-     550,   580,   550,     2,   591,   592,   593,   295,     0,   734,
-     735,     0,    12,     0,    13,   295,   271,   272,     0,   296,
-     291,   292,   293,   294,   529,   306,   394,   551,   552,   372,
-     373,    12,   447,   448,    11,   443,   446,     0,   506,   501,
-     492,   447,   448,     0,     0,   531,   222,     0,   295,     0,
-       0,     0,     0,     0,     0,     0,     0,   295,   295,     2,
-       0,   736,   296,   585,   597,   740,   733,   731,   738,     0,
-       0,     0,   255,     2,     0,   535,   441,   442,   440,     0,
-       0,     0,     0,   550,     0,   637,   638,     0,     0,   548,
-     544,   550,   565,   550,   550,   546,     2,   545,   550,   604,
-     550,   550,   607,     0,     0,     0,   295,   295,   314,   362,
-       2,   295,   262,   298,   309,   343,   355,   481,     0,     2,
-       0,   456,   263,   296,   336,   351,   358,   477,     0,     2,
-       0,   312,   337,   344,   345,     0,   352,   356,   359,   363,
-     448,   295,   374,   367,   371,     0,   396,   478,   482,     0,
-       0,     0,     1,   295,     2,   533,   579,   581,   295,     2,
-     744,   296,   747,   548,   548,     0,   296,     0,     0,   274,
-     550,   546,     2,   295,     0,     0,   295,   553,     2,   504,
-       2,   557,     0,     0,     0,     0,     0,     0,    18,    58,
-       4,     5,     6,    16,     0,     0,   295,     2,    66,    67,
-      68,    69,    48,    19,    49,    22,    47,    70,   295,     0,
-      73,    77,    80,    83,    88,    91,    93,    95,    97,    99,
-     101,   106,   498,   754,   454,   497,     0,   452,   453,     0,
-     569,   584,   587,   590,   596,   599,   602,   361,     0,     2,
-     742,     0,   295,   745,     2,    63,   295,     3,   428,     0,
-     436,   296,   295,   308,   335,   288,   350,   357,     3,     3,
-     410,   414,   424,   429,   476,   295,   430,   709,   710,   295,
-     431,   433,   295,     2,   586,   598,   732,     2,     2,   250,
-       2,   461,     0,   459,   458,   457,   142,     2,     2,   252,
-       2,     2,   251,     2,   282,     2,   283,     0,   281,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   570,   609,
-       0,   456,     2,   564,   573,   663,   566,   567,   536,   295,
-       2,   603,   612,   605,   606,     0,   277,   295,   295,   341,
-     296,     0,   296,     0,   295,   737,   741,   739,   537,   295,
-     548,   256,   264,   310,     0,     2,   538,   295,   502,   338,
-     339,   284,   353,   360,     0,   295,     0,   752,   401,     0,
-     479,   503,   253,   254,   523,   295,   438,     0,   295,   238,
-       0,     2,   240,     0,   296,     0,   258,     2,   259,   279,
-       0,     0,     2,   295,   548,   295,   489,   491,   490,     0,
-       0,   754,     0,   295,     0,   295,   493,   295,   563,   561,
-     562,   560,     0,   555,   558,     0,     0,   295,    55,   295,
-      70,    50,   295,    61,   295,   295,    53,    54,     2,   128,
-       0,     0,   450,     0,   449,   731,   112,   295,    17,     0,
-      29,    30,    35,     2,     0,    35,   118,   119,   120,   121,
-     122,   123,   124,   125,   126,   127,     0,     0,    51,    52,
+     291,   291,   312,   310,   313,   311,   314,   315,   297,   299,
+     298,     0,   300,   326,   318,   323,   321,   322,   320,   319,
+     324,   325,   330,   327,   328,   329,   545,   545,   545,     0,
+       0,     0,   291,   217,   301,   316,   317,     7,   357,     0,
+       8,    14,    15,     0,     2,    60,    61,   563,     9,   291,
+     523,   521,   244,     3,   452,     3,   257,     0,     3,     3,
+       3,   245,     3,     0,     0,     0,   292,   293,   295,   291,
+     304,   307,   309,   338,   283,   331,   336,   284,   346,   285,
+     353,   350,   360,     0,     0,   361,   286,   471,   475,     3,
+       3,     0,     2,   517,   522,   527,   296,     0,     0,   545,
+     575,   545,     2,   586,   587,   588,   291,     0,   729,   730,
+       0,    12,     0,    13,   291,   267,   268,     0,   292,   287,
+     288,   289,   290,   524,   302,   390,   546,   547,   368,   369,
+      12,   443,   444,    11,   439,   442,     0,   501,   496,   487,
+     443,   444,     0,     0,   526,   218,     0,   291,     0,     0,
+       0,     0,     0,     0,     0,     0,   291,   291,     2,     0,
+     731,   292,   580,   592,   735,   728,   726,   733,     0,     0,
+       0,   251,     2,     0,   530,   437,   438,   436,     0,     0,
+       0,     0,   545,     0,   632,   633,     0,     0,   543,   539,
+     545,   560,   545,   545,   541,     2,   540,   545,   599,   545,
+     545,   602,     0,     0,     0,   291,   291,   310,   358,     2,
+     291,   258,   294,   305,   339,   351,   476,     0,     2,     0,
+     452,   259,   292,   332,   347,   354,   472,     0,     2,     0,
+     308,   333,   340,   341,     0,   348,   352,   355,   359,   444,
+     291,   370,   363,   367,     0,   392,   473,   477,     0,     0,
+       0,     1,   291,     2,   528,   574,   576,   291,     2,   739,
+     292,   742,   543,   543,     0,   292,     0,     0,   270,   545,
+     541,     2,   291,     0,     0,   291,   548,     2,   499,     2,
+     552,     0,     0,     0,     0,     0,     0,    18,    57,     4,
+       5,     6,    16,     0,     0,   291,     2,    62,    63,    64,
+      65,    45,    19,    46,    22,    44,    66,   291,     0,    69,
+      73,    76,    79,    84,    87,    89,    91,    93,    95,    97,
+     102,   493,   749,   450,   492,     0,   448,   449,     0,   564,
+     579,   582,   585,   591,   594,   597,   357,     0,     2,   737,
+       0,   291,   740,     2,    60,   291,     3,   424,     0,   432,
+     292,   291,   304,   331,   284,   346,   353,     3,     3,   406,
+     410,   420,   425,   471,   291,   426,   704,   705,   291,   427,
+     429,   291,     2,   581,   593,   727,     2,     2,   246,     2,
+     457,     0,   455,   454,   453,   138,     2,     2,   248,     2,
+       2,   247,     2,   278,     2,   279,     0,   277,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   565,   604,     0,
+     452,     2,   559,   568,   658,   561,   562,   531,   291,     2,
+     598,   607,   600,   601,     0,   273,   291,   291,   337,   292,
+       0,   292,     0,   291,   732,   736,   734,   532,   291,   543,
+     252,   260,   306,     0,     2,   533,   291,   497,   334,   335,
+     280,   349,   356,     0,   291,     0,   747,   397,     0,   474,
+     498,   249,   250,   518,   291,   434,     0,   291,   234,     0,
+       2,   236,     0,   292,     0,   254,     2,   255,   275,     0,
+       0,     2,   291,   543,   291,   484,   486,   485,     0,     0,
+     749,     0,   291,     0,   291,   488,   291,   558,   556,   557,
+     555,     0,   550,   553,     0,     0,   291,    52,   291,    66,
+      47,   291,    54,   291,   291,    50,    51,     2,   124,     0,
+       0,   446,     0,   445,   726,   118,   291,    17,     0,    29,
+      30,    35,     2,     0,    35,   108,   109,   110,   111,   112,
+     113,   114,   115,   116,   117,   107,     0,    48,    49,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     109,     2,   649,   455,   646,   550,   550,   654,   483,   295,
-       2,   588,   589,     0,   600,   601,     0,     2,   743,   746,
-     112,   295,     0,     2,   711,   296,   715,   706,   707,   713,
-       0,     2,     2,   671,   550,   754,   620,   550,   550,   754,
-     550,   634,   550,   550,   685,   437,   668,   550,   550,   676,
-     683,   295,   432,   296,     0,     0,   295,   721,   296,   726,
-     754,   718,   295,   723,   754,   295,   295,   295,     0,   112,
-       0,    18,     5,     2,     0,    19,     0,   462,   752,     0,
-       0,   468,   242,     0,   295,     0,     0,     0,   548,   572,
-     576,   578,   608,   611,   615,   618,   571,   610,     0,   285,
-     661,     0,   295,   278,     0,     0,     0,     0,   276,     2,
-       0,   260,   539,   295,     0,     0,   295,     2,   366,   386,
-     375,     0,     0,   380,   374,   753,     0,     0,   399,     0,
-     296,     3,   417,     3,   421,   420,   594,     0,   534,   295,
-      63,     3,   295,   436,   296,     3,   430,   431,     2,     0,
-       0,     0,   488,   307,   295,   484,   486,     3,     2,     2,
-       0,   505,     3,     0,   557,   130,     0,     0,   223,     0,
-       0,     0,     2,     0,     0,    36,     0,     0,   112,   295,
-      20,     0,    21,     0,   695,   700,   451,   692,   550,   550,
-       0,   110,     3,     2,    27,     2,     0,    33,     0,     2,
-      25,     0,   107,   108,    74,    75,    76,    78,    79,    81,
-      82,    86,    87,    84,    85,    89,    90,    92,    94,    96,
-      98,   100,     0,     0,   755,   295,     0,     0,     0,   650,
-     651,   647,   648,   500,   499,   295,     0,   295,   717,   295,
-     722,   296,   295,   665,   295,   295,   708,   664,     2,   295,
-       0,     0,     0,     0,     0,     0,     0,     0,   686,     0,
-     672,   623,   639,   673,     2,   619,   626,   434,   621,   622,
-     435,     2,   633,   642,   635,   636,   669,   670,   684,   712,
-     716,   714,   754,   269,     2,   748,     2,   425,   720,   725,
-     426,     0,   404,     3,     3,     3,     3,   456,     3,     0,
-       2,   471,   467,   753,     0,   463,   470,     2,   466,   469,
-       0,   295,   243,   265,     3,   273,   275,     0,   456,     2,
-     574,   575,     2,   613,   614,     0,   662,   540,     3,   347,
-     346,   349,   348,   295,   541,     0,   542,   374,     0,     0,
-     295,   295,     0,     0,   695,   384,   387,   391,   550,   391,
-     390,   383,   376,   550,   378,   381,   295,   401,   395,   105,
-     402,   752,     0,     0,   439,   241,     0,     0,     3,     2,
-     671,   432,     0,   530,     0,   754,   492,     0,   295,   295,
-     295,     0,   554,   556,   131,     0,     0,   216,     0,     0,
-       0,   224,   225,    56,     0,    62,   295,     0,    60,    59,
-       0,     2,   129,     0,     0,     0,   696,   697,   693,   694,
-     461,    71,    72,   111,   116,     3,   110,     0,     0,     0,
-      24,    35,     3,     0,    32,   103,     0,     3,   653,   657,
-     660,   652,     3,   595,     3,   719,   724,     2,    63,   295,
-       3,     3,   296,     0,     3,   625,   629,   632,   641,   675,
-     679,   682,   295,     3,   624,   640,   674,   295,   295,   427,
-     295,   295,   749,     0,     0,     0,     0,   257,     0,   105,
-       0,     3,     3,     0,   464,     0,   460,     0,     0,   246,
-     295,     0,     0,   130,     0,     0,     0,     0,     0,   130,
-       0,     0,   110,   110,    18,     2,     0,     0,     3,   132,
-     133,     2,   144,   134,   135,   136,   137,   138,   139,   146,
-     148,     0,     0,     0,   286,   295,   295,   550,     0,   543,
-     295,   377,   379,     0,   393,   696,   388,   392,   389,   382,
-     386,   369,   400,     0,   582,     2,   667,   666,     0,   672,
-       2,   485,   487,   507,     3,   515,   516,     0,     2,   511,
-       3,     3,     0,     0,   559,   223,     0,     0,     0,   223,
-       0,     0,     3,    37,   112,   699,   703,   705,   698,   752,
-     110,     0,     3,   664,    42,     3,    40,     3,    34,     0,
-       3,   102,   104,     0,     2,   655,   656,     0,     0,   295,
-       0,     0,     0,     3,   641,     0,     2,   627,   628,     2,
-     643,     2,   677,   678,     0,     0,    63,     0,     3,     3,
-       3,     3,   412,   411,   415,     2,     2,   751,   750,   113,
-       0,     0,     0,     0,     3,   465,     3,     0,   244,   147,
-       3,   296,   295,     0,     0,     0,     0,     2,     0,   192,
-       0,   190,     0,     0,     0,     0,     0,     0,     0,   550,
-     112,     0,   152,   149,   295,     0,     0,   268,   280,     3,
-       3,   549,   616,   370,   385,   398,   295,   267,   295,     0,
-     518,   495,   295,     0,     0,   494,   509,     0,     0,     0,
-     217,     0,   226,    57,   110,     0,     2,   701,   702,     0,
-     117,   114,     0,     0,     0,     0,     0,     0,    23,     0,
-     658,   295,   583,   266,   727,   728,   729,     0,   680,   295,
-     295,   295,     3,     3,     0,   688,     0,     0,     0,     0,
-     295,   295,     3,   547,   472,   473,     0,     0,   247,   296,
-       0,     0,     0,     0,   295,   193,   191,   188,     0,   194,
-       0,     0,     0,     0,   198,   201,   199,   195,     0,   196,
-     130,    35,   145,   143,   245,     0,     0,   419,   423,   422,
-       0,   512,     2,   513,     2,   514,   508,   295,   229,     0,
-     227,     0,   229,     3,   664,   295,    31,   115,     2,    45,
-       2,    43,    41,    28,   113,    26,     3,   730,     3,     3,
-       3,     0,     0,   687,   689,   630,   644,   270,     2,   409,
-       3,   408,     0,   475,   472,   130,     0,     0,   130,     3,
-       0,   130,   189,     0,     2,     2,   210,   200,     0,     0,
-       0,   141,     0,   577,   617,     2,     0,     0,     2,   230,
-       0,     0,   218,     0,     0,     0,     3,     0,     0,     0,
-       0,     0,     0,   690,   691,   295,     0,   474,   153,     0,
-       0,     2,   166,   130,   155,     0,   183,     0,   130,     0,
-       2,   157,     0,     2,     0,     2,     2,     2,   197,    32,
-     295,   517,   519,   510,     0,     0,     0,     0,   115,    38,
-       0,     3,     3,   659,   631,   645,   681,   413,   130,   159,
-     162,     0,   161,   165,     3,   168,   167,     0,   130,   185,
-     130,     3,     0,   295,     0,   295,     0,     2,     0,     2,
-     140,     2,   231,   232,     0,   228,   219,     0,   704,     0,
-       0,   154,     0,     0,   164,   234,   169,     2,   236,   184,
-       0,   187,   173,   202,     3,   211,   215,   204,     3,     0,
-     295,     0,   295,     0,     0,     0,    39,    46,    44,   160,
-     163,   130,     0,   170,   295,   130,   130,     0,   174,     0,
-       0,   695,   212,   213,   214,     0,   203,     3,   205,     3,
-     295,   220,   233,   150,   171,   156,   130,   237,   186,   181,
-     179,   175,   158,   130,     0,   696,     0,     0,     0,     0,
-     151,   172,   182,   176,   180,   179,   177,     3,     3,     0,
-       0,   496,   178,   206,   208,     3,     3,   207,   209
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   104,
+       2,   644,   451,   641,   545,   545,   649,   478,   291,     2,
+     583,   584,     0,   595,   596,     0,     2,   738,   741,   118,
+     291,     0,     2,   706,   292,   710,   701,   702,   708,     0,
+       2,     2,   666,   545,   749,   615,   545,   545,   749,   545,
+     629,   545,   545,   680,   433,   663,   545,   545,   671,   678,
+     291,   428,   292,     0,     0,   291,   716,   292,   721,   749,
+     713,   291,   718,   749,   291,   291,   291,     0,   118,     0,
+      18,     2,     0,    19,     0,   458,   747,     0,     0,   464,
+     238,     0,   291,     0,     0,     0,   543,   567,   571,   573,
+     603,   606,   610,   613,   566,   605,     0,   281,   656,     0,
+     291,   274,     0,     0,     0,     0,   272,     2,     0,   256,
+     534,   291,     0,     0,   291,     2,   362,   382,   371,     0,
+       0,   376,   370,   748,     0,     0,   395,     0,   292,     3,
+     413,     3,   417,   416,   589,     0,   529,   291,    60,     3,
+     291,   432,   292,     3,   426,   427,     2,     0,     0,     0,
+     483,   303,   291,   479,   481,     3,     2,     2,     0,   500,
+       3,     0,   552,   126,     0,     0,   219,     0,     0,     0,
+       0,    36,     0,     0,   118,   291,    20,     0,    21,     0,
+     690,   695,   447,   687,   545,   545,     0,   105,     3,     2,
+      27,     0,    33,     0,     2,    25,     0,   103,    70,    71,
+      72,    74,    75,    77,    78,    82,    83,    80,    81,    85,
+      86,    88,    90,    92,    94,    96,     0,     0,   750,   291,
+       0,     0,     0,   645,   646,   642,   643,   495,   494,   291,
+       0,   291,   712,   291,   717,   292,   291,   660,   291,   291,
+     703,   659,     2,   291,     0,     0,     0,     0,     0,     0,
+       0,     0,   681,     0,   667,   618,   634,   668,     2,   614,
+     621,   430,   616,   617,   431,     2,   628,   637,   630,   631,
+     664,   665,   679,   707,   711,   709,   749,   265,     2,   743,
+       2,   421,   715,   720,   422,     0,   400,     3,     3,     3,
+       3,   452,     3,     0,     2,   466,   463,   748,     0,   459,
+       2,   462,   465,     0,   291,   239,   261,     3,   269,   271,
+       0,   452,     2,   569,   570,     2,   608,   609,     0,   657,
+     535,     3,   343,   342,   345,   344,   291,   536,     0,   537,
+     370,     0,     0,   291,   291,     0,     0,   690,   380,   383,
+     387,   545,   387,   386,   379,   372,   545,   374,   377,   291,
+     397,   391,   101,   398,   747,     0,     0,   435,   237,     0,
+       0,     3,     2,   666,   428,     0,   525,     0,   749,   487,
+       0,   291,   291,   291,     0,   549,   551,   127,     0,     0,
+     212,     0,     0,     0,   220,   221,    53,     0,    55,    58,
+      59,     0,     2,   125,     0,     0,     0,   691,   692,   688,
+     689,   457,    67,    68,   106,   122,     3,   105,     0,     0,
+      24,    35,     3,     0,    32,    99,     0,     3,   648,   652,
+     655,   647,     3,   590,     3,   714,   719,     2,    60,   291,
+       3,     3,   292,     0,     3,   620,   624,   627,   636,   670,
+     674,   677,   291,     3,   619,   635,   669,   291,   291,   423,
+     291,   291,   744,     0,     0,     0,     0,   253,     0,   101,
+       0,     3,     3,     0,   460,     0,   456,     0,     0,   242,
+     291,     0,     0,   126,     0,     0,     0,     0,     0,   126,
+       0,     0,   105,   105,    18,     2,     0,     0,     3,   128,
+     129,     2,   140,   130,   131,   132,   133,   134,   135,   142,
+     144,     0,     0,     0,   282,   291,   291,   545,     0,   538,
+     291,   373,   375,     0,   389,   691,   384,   388,   385,   378,
+     382,   365,   396,     0,   577,     2,   662,   661,     0,   667,
+       2,   480,   482,   502,     3,   510,   511,     0,     2,   506,
+       3,     3,     0,     0,   554,   219,     0,     0,     0,   219,
+       0,     0,   118,   694,   698,   700,   693,   747,   105,     0,
+       3,   659,    39,     3,    37,    34,     0,     3,    98,   100,
+       0,     2,   650,   651,     0,     0,   291,     0,     0,     0,
+       3,   636,     0,     2,   622,   623,     2,   638,     2,   672,
+     673,     0,     0,    60,     0,     3,     3,     3,     3,   408,
+     407,   411,     2,     2,   746,   745,   119,     0,     0,     0,
+       0,     3,   461,     3,     0,   240,   143,     3,   292,   291,
+       0,     0,     0,     0,     2,     0,   188,     0,   186,     0,
+       0,     0,     0,     0,     0,     0,   545,   118,     0,   148,
+     145,   291,     0,     0,   264,   276,     3,     3,   544,   611,
+     366,   381,   394,   291,   263,   291,     0,   513,   490,   291,
+       0,     0,   489,   504,     0,     0,     0,   213,     0,   222,
+      56,     2,   696,   697,     0,   123,   120,     0,     0,     0,
+       0,     0,    23,     0,   653,   291,   578,   262,   722,   723,
+     724,     0,   675,   291,   291,   291,     3,     3,     0,   683,
+       0,     0,     0,     0,   291,   291,     3,   542,   119,   468,
+       0,     0,   243,   292,     0,     0,     0,     0,   291,   189,
+     187,   184,     0,   190,     0,     0,     0,     0,   194,   197,
+     195,   191,     0,   192,   126,    35,   141,   139,   241,     0,
+       0,   415,   419,   418,     0,   507,     2,   508,     2,   509,
+     503,   291,   225,     0,   223,     0,   225,   291,    31,   121,
+       2,    42,     2,    40,    38,    28,    26,     3,   725,     3,
+       3,     3,     0,     0,   682,   684,   625,   639,   266,     2,
+     405,     3,   404,     0,   470,   467,   126,     0,     0,   126,
+       3,     0,   126,   185,     0,     2,     2,   206,   196,     0,
+       0,     0,   137,     0,   572,   612,     2,     0,     0,     2,
+     226,     0,     0,   214,     0,     3,     0,     0,     0,     0,
+       0,     0,   685,   686,   291,     0,   469,   149,     0,     0,
+       2,   162,   126,   151,     0,   179,     0,   126,     0,     2,
+     153,     0,     2,     0,     2,     2,     2,   193,    32,   291,
+     512,   514,   505,     0,     0,     0,     0,     0,     3,     3,
+     654,   626,   640,   676,   409,   126,   155,   158,     0,   157,
+     161,     3,   164,   163,     0,   126,   181,   126,     3,     0,
+     291,     0,   291,     0,     2,     0,     2,   136,     2,   227,
+     228,     0,   224,   215,   699,     0,     0,   150,     0,     0,
+     160,   230,   165,     2,   232,   180,     0,   183,   169,   198,
+       3,   207,   211,   200,     3,     0,   291,     0,   291,     0,
+       0,     0,    43,    41,   156,   159,   126,     0,   166,   291,
+     126,   126,     0,   170,     0,     0,   690,   208,   209,   210,
+       0,   199,     3,   201,     3,   291,   216,   229,   146,   167,
+     152,   126,   233,   182,   177,   175,   171,   154,   126,     0,
+     691,     0,     0,     0,     0,   147,   168,   178,   172,   176,
+     175,   173,     3,     3,     0,     0,   491,   174,   202,   204,
+       3,     3,   203,   205
 };
 
@@ -1560,194 +1562,192 @@
 static const yytype_int16 yydefgoto[] =
 {
-      -1,   819,   469,   302,    48,   135,   136,   303,   304,   305,
-     306,   766,   767,  1145,  1146,   307,   382,   309,   310,   311,
-     312,   313,   314,   315,   316,   317,   318,   319,   320,   321,
-    1040,   519,   984,   323,   985,   547,   954,  1067,  1543,  1069,
-    1070,  1071,  1072,  1544,  1073,  1074,  1460,  1461,  1422,  1423,
-    1424,  1522,  1523,  1527,  1528,  1563,  1564,  1075,  1380,  1076,
-    1077,  1314,  1315,  1316,  1504,  1078,   147,   960,   961,   962,
-    1400,  1484,  1496,  1497,   470,   471,   881,   882,  1048,    52,
-      53,    54,    55,    56,   348,   160,    59,    60,    61,    62,
-      63,   350,    65,    66,   266,    68,    69,   276,   352,   353,
-      72,    73,    74,    75,   120,    77,   206,   355,   121,    80,
-     122,    82,    83,   456,    84,   455,   690,   691,   692,   915,
-    1096,   916,    85,    86,   459,   457,   698,   861,   862,   358,
-     359,   701,   702,   703,   360,   361,   362,   363,   467,   341,
-     137,   138,   523,   325,   172,   647,   648,   649,   650,   651,
-      87,   123,    89,   490,   491,   946,   492,   279,   496,   326,
-      90,   139,   140,    91,  1337,  1118,  1119,  1120,  1121,    92,
-      93,   719,    94,   275,    95,    96,   189,  1042,   681,   413,
-     127,    97,   502,   503,   504,   190,   270,   192,   193,   194,
-     271,   100,   101,   102,   103,   104,   105,   106,   197,   198,
-     199,   200,   201,   831,   606,   607,   608,   609,   202,   611,
-     612,   613,   573,   574,   575,   576,   755,   107,   615,   616,
-     617,   618,   619,   620,   977,   757,   758,   759,   596,   366,
-     367,   368,   369,   327,   166,   109,   110,   111,   371,   696,
-     570
+      -1,   813,   468,   301,    47,   134,   135,   302,   303,   304,
+     305,   761,   762,  1133,  1134,   306,   381,   308,   309,   310,
+     311,   312,   313,   314,   315,   316,   317,   318,   319,   320,
+    1030,   518,   975,   546,   322,   976,   947,  1057,  1518,  1059,
+    1060,  1061,  1062,  1519,  1063,  1064,  1437,  1438,  1401,  1402,
+    1403,  1497,  1498,  1502,  1503,  1538,  1539,  1065,  1361,  1066,
+    1067,  1298,  1299,  1300,  1480,  1068,   146,   953,   954,   955,
+    1381,  1461,  1472,  1473,   469,   470,   874,   875,  1038,    51,
+      52,    53,    54,    55,   347,   159,    58,    59,    60,    61,
+      62,   349,    64,    65,   265,    67,    68,   275,   351,   352,
+      71,    72,    73,    74,   119,    76,   205,   354,   120,    79,
+     121,    81,    82,   455,    83,   454,   688,   689,   690,   908,
+    1086,   909,    84,    85,   458,   456,   696,   855,   856,   857,
+     858,   699,   700,   701,   359,   360,   361,   362,   466,   340,
+     136,   137,   522,   324,   171,   645,   646,   647,   648,   649,
+      86,   122,    88,   489,   490,   939,   491,   278,   495,   325,
+      89,   138,   139,    90,  1321,  1108,  1109,  1110,  1111,    91,
+      92,   717,    93,   274,    94,    95,   188,  1032,   679,   412,
+     126,    96,   501,   502,   503,   189,   269,   191,   192,   193,
+     270,    99,   100,   101,   102,   103,   104,   105,   196,   197,
+     198,   199,   200,   825,   605,   606,   607,   608,   201,   610,
+     611,   612,   572,   573,   574,   575,   751,   106,   614,   615,
+     616,   617,   618,   619,   968,   753,   754,   755,   595,   365,
+     366,   367,   368,   326,   165,   108,   109,   110,   370,   694,
+     569
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -1414
+#define YYPACT_NINF -1310
 static const yytype_int16 yypact[] =
 {
-    4857,  9883, -1414,    35, -1414, -1414, -1414, -1414, -1414, -1414,
-   -1414,   142, -1414, -1414, -1414, -1414, -1414, -1414, -1414, -1414,
-   -1414, -1414, -1414, -1414, -1414, -1414,    98,    98,    98,  1334,
-     684,   153,  7496,   290, -1414, -1414, -1414, -1414, -1414,   204,
-   -1414, -1414, -1414, -1414,   901,   229, -1414, -1414, -1414, -1414,
-    9565, -1414, -1414, -1414, -1414,   -15,   301, -1414,  1624, -1414,
-   -1414, -1414, -1414,   302,  1806,   471,   143,  7613, -1414, -1414,
-    9603,  1367, -1414, -1414, -1414,  1721,   510,  3394,  1032,  1137,
-    1721,  1303, -1414, -1414,  1174,  1520, -1414,  1721,  1532, -1414,
-     385, -1414,   421,   523, -1414, -1414, -1414, -1414,   460,   301,
-      98, -1414,    98, -1414, -1414, -1414, -1414, 10414,  1624, -1414,
-   -1414,  1624, -1414,   447, -1414, 10444, -1414, -1414,  2082, 10554,
-   -1414,   399,   399,   399, -1414, -1414, -1414,    98, -1414, -1414,
-   -1414,   544,   555,   575, -1414, -1414, -1414,   617, -1414, -1414,
-   -1414, -1414, -1414,   621,   629, -1414, -1414,    11,  9069,  3253,
-     578,   492,   499,   631,   635,   642,   647,  9853,  7015,   649,
-     656, -1414,  9713, -1414, -1414, -1414, -1414,   661, -1414,   193,
-    3453,  3453, -1414,   667,   251, -1414, -1414, -1414, -1414,   692,
-     327,   346,   368,    98,   673, -1414, -1414,  1806,  3136,   748,
-   -1414,    12, -1414,    98,    98,   301, -1414, -1414,    75, -1414,
-      98,    98, -1414,  3167,   711,   722,   399,  6806, -1414, -1414,
-     726,  9565, -1414, -1414,  1721, -1414, -1414, -1414,   301, -1414,
-    1624,   -15, -1414,  7963, -1414,   399,   399,   399,   301, -1414,
-    1334, -1414,  5769, -1414, -1414,   709,   399, -1414,   399, -1414,
-     204,  9069, -1414,   763, -1414,   684,   765,   399, -1414,  1334,
-     750,   766, -1414,  7496,   705, -1414, -1414, -1414,  9532, -1414,
-   -1414, 10864, -1414,   748,    63,  6244, 10554,  2082,  3167, -1414,
-      85, -1414, -1414, 10444,  1624,   804,  7644, -1414, -1414,   319,
-   -1414, 11778,   782,   851,  4657,   828,  4994, 11639, -1414,   839,
-   -1414, -1414, -1414, -1414, 11658, 11658,  8841,   844, -1414, -1414,
-   -1414, -1414, -1414, -1414,   869, -1414,   759,  2440,  9183,  4994,
-   -1414,   593,   571,   645,   313,   861,   842,   858,   843,   911,
-     -20, -1414, -1414,   876,   326, -1414,    83, -1414, -1414,  3253,
-   -1414, -1414,   139,   900, -1414,   422,   900,   905,   204, -1414,
-   -1414,   909, 10414, -1414,   912,   917,  9297, -1414, -1414,  1382,
-    2358,  8427,  6806,  1721, -1414,  1721,   399,   399, -1414, -1414,
-   -1414, -1414, -1414, -1414,   399, 10414,  1624, -1414, -1414, 10584,
-    1776, -1414, 10304, -1414, -1414, -1414, -1414, -1414, -1414, -1414,
-     936, 11446,  4994, -1414, -1414, -1414, -1414, -1414, -1414, -1414,
-   -1414, -1414, -1414, -1414, -1414, -1414, -1414,  2082, -1414,   836,
-     947,   962,   963,   923,   965,   970,   972,  3136, -1414, -1414,
-     959,   -15,   975, -1414, -1414,   978, -1414, -1414, -1414,  9532,
-   -1414, -1414, -1414, -1414, -1414,  3167, -1414,  9069,  9069, -1414,
-     399,  2082,  6926,  1624,  8543, -1414, -1414, -1414, -1414,  9532,
-      63, -1414, -1414,  1721,   301, -1414, -1414,  9532, -1414,  6689,
-   -1414, -1414,   399,   399,   271, 10023,   907,   977,   960,   988,
-     399, -1414, -1414, -1414, -1414, 10980, -1414,   500,  6556, -1414,
-     301,   990, -1414,  2082, 11860, 11504, -1414, -1414, -1414, -1414,
-     935,  3167, -1414,  8659,   748,  6228, -1414, -1414, -1414,  1482,
-     550,   876,   684,  7644,  1180, 10444, -1414,  7644, -1414, -1414,
-   -1414, -1414,   561, -1414,   997,   851,   -13,  8841, -1414, 10694,
-   -1414, -1414,  8841, -1414,  8955,  8841, -1414, -1414,   996, -1414,
-     585,  1003,   455,  1017, -1414, -1414,  9993,  6037, -1414,   419,
-   -1414, -1414, 11562, -1414,   469, 11562, -1414, -1414, -1414, -1414,
-   -1414, -1414, -1414, -1414, -1414, -1414,  6244,  6244, -1414, -1414,
-    4994,  4994,  4994,  4994,  4994,  4994,  4994,  4994,  4994,  4994,
-    4994,  4994,  4994,  4994,  4994,  4994,  4994,  4994,  3735,  6244,
-   -1414,   326,  1049, -1414, -1414,    98,    98, -1414, -1414,  9069,
-   -1414, -1414,   978,   705, -1414,   978, 11581, -1414, -1414, -1414,
-    3645,  6037,  1016,  1018, -1414, 10554, -1414, -1414,   661, -1414,
-    1020,  1157,  1025,  2611,    95,   876, -1414,    98,    98,   876,
-     134, -1414,    98,    98,   978, -1414, -1414,    98,    98, -1414,
-     900, 10724,  1624, 12005,    69,   227, 10724, -1414, 10864, -1414,
-     876, -1414, 10414, -1414,   218,  8079,  8079,  8079,  1624, -1414,
-    5555,  1012,   260,   936,   778,  1021,  1024, -1414,  1026,  3453,
-     343, -1414,  1115,  1624,  8079,   705,  2082,   705,   748,   534,
-     900, -1414, -1414,   596,   900, -1414, -1414, -1414,   851, -1414,
-     900,   301, 10980, -1414,   687,  1042,   700,  1043, -1414,  1044,
-     301, -1414, -1414,  9532,   301,  1041, 10694,  1045, -1414,  2066,
-   -1414,   408,   416,   684, -1414,   684,  1047,  4994, -1414,   684,
-   12005, -1414, -1414,  1053, -1414, -1414, -1414,   705, -1414, 11933,
-     917, -1414,  8079,   489,  8427, -1414, -1414,   661,  1055,  1056,
-    1482,  3284, -1414, -1414,  7644, -1414, -1414,  1038, -1414, -1414,
-    1064, -1414,  1038,  1070, 11778,  6244,    93,  1051,   138,  1074,
-    1058,  1075,   844,  1069,  1077, -1414,  1079,  1081, 10133,  6775,
-   -1414,  6244, -1414,   455,  1974, -1414, -1414, -1414,    98,    98,
-    6104,  6244,  1076, -1414, -1414,   936,   707, -1414,  6244, -1414,
-   -1414,   677, -1414, -1414, -1414, -1414, -1414,   593,   593,   571,
-     571,   645,   645,   645,   645,   313,   313,   861,   842,   858,
-     843,   911,  4994,   847, -1414, 10980,  1083,  1084,  1088,  1049,
-   -1414, -1414, -1414, -1414, -1414, 10980,   717,  8079, -1414, 10414,
-   -1414,  7135,  9411, -1414, 10304,  7015, -1414, -1414,  1157, 10980,
-     945,  1089,  1090,  1095,  1096,  1099,  1100,  1105, -1414,  4392,
-    2611, -1414, -1414, -1414, -1414, -1414, -1414, -1414, -1414, -1414,
-   -1414, -1414, -1414, -1414, -1414, -1414, -1414, -1414,   978, -1414,
-   -1414, -1414,   876, -1414, -1414, -1414, -1414, -1414, -1414, -1414,
-   -1414,  1112, -1414,  1113,  1118, -1414, -1414,   -15,  1076,  5555,
-   -1414, -1414, -1414, 11446,  1116, -1414, -1414, -1414, -1414, -1414,
-     684,  6369,  1201, -1414, -1414, -1414, -1414,  1103,   -15, -1414,
-   -1414,   978, -1414, -1414,   978,   126,   978, -1414, -1414, -1414,
-   -1414, -1414, -1414,  9743, -1414,   301, -1414, -1414,   438,   452,
-   10584,  7255,  2372,  4994,  2870, -1414, -1414,  1127,    39,  1127,
-   -1414,   684, -1414,    98, -1414, -1414, 10163,   960, -1414, -1414,
-   -1414,   977,  1143,  1131, -1414, -1414,  1150,  1153, -1414,   489,
-    1995, -1414,   363, -1414,  3284,   876, -1414,  1160,  7644, 10834,
-    9069,  1161, -1414, -1414,  1151,  1162,  1156, -1414,  4994,   120,
-     279,  1163, -1414,  1166,   705,  1166,  6037,  6244, -1414, -1414,
-    1166,  1165, -1414,  1176,  1182,  1185,  1974, -1414, -1414, -1414,
-   11446, -1414, -1414, -1414, -1414,  1168,  6244,  1188,   705,  5555,
-   -1414, 11562, -1414,   705, -1414, -1414,  6244, -1414,   614,   900,
-   -1414, -1414, -1414, -1414, -1414, -1414, -1414,   936,   917,  9297,
-   -1414, -1414,  7375,  1187, -1414,   758,   900, -1414,   785,   797,
-     900, -1414,   399,  5912, -1414, -1414, -1414, 10980, 10980, -1414,
-    8543,  8543, -1414,  1186,  1189,  1191,  1199, -1414,  1206,   439,
-     119,  1076, -1414,   705, -1414,  3453, -1414,  6244,   480, -1414,
-    6655,  1211,  1212, 11388,  1213,  1217,    -6,    58,   117,  6244,
-    1221,   301,  6244,  6244,  1215,  1222,   610,  1203, -1414, -1414,
-   -1414,  1218, -1414, -1414, -1414, -1414, -1414, -1414, -1414, -1414,
-   -1414,   684,  1226,  6244, -1414, 10980, 10980,    98,  1228, -1414,
-   10273, -1414, -1414,   864, -1414,  2870, -1414, -1414, -1414, -1414,
-    2066, -1414, -1414,  1230, -1414, -1414, -1414, -1414,  1231,  1995,
-   -1414, -1414,  1223, -1414,  1038, -1414, -1414,  2082,  1235, -1414,
-   -1414, -1414,   744,  1237, -1414,   138,  1245,  4994,  1232,   138,
-     138,  1250,  1246, -1414,  9993,   825,   900, -1414, -1414,  1026,
-    6244,  1251,  1168,   536,   161,  1261, -1414,  1246, -1414,  1254,
-    1261, -1414, -1414,  1257, -1414, -1414,   978,  1270,  1271,  6895,
-    1272,  1275,  1280, -1414, -1414,  1283, -1414, -1414,   978, -1414,
-   -1414, -1414, -1414,   978,  6244,  6244,   917,  1282, -1414, -1414,
-   -1414, -1414, -1414, -1414, -1414, -1414, -1414, -1414, -1414, -1414,
-    4994,  4994,  1284,  1286,  1261, -1414, -1414,   684, -1414, -1414,
-   -1414,  5291, 10834,  6244,  6244,  1335,  6244, -1414,  1263, -1414,
-    1267, -1414,  1281,  6244,  1288,  6244,  1039,  1290,    28,    98,
-    5165,   856, -1414, -1414,  6369,  1287,   488, -1414, -1414, -1414,
-   -1414, -1414, -1414, -1414, -1414, -1414, 11206, -1414,  8659,  1304,
-   -1414, -1414, 10834,   490,   498, -1414,  1301,  1306,   851,  1317,
-   -1414,   418, -1414, -1414,  6244,  1316, -1414, -1414,   978,  1314,
-   -1414, -1414,  1318,   589,   691,   705,  1320,  1322, -1414,  1329,
-   -1414, 10980, -1414, -1414, -1414, -1414, -1414,  1330, -1414, 10980,
-   10980, 10980, -1414, -1414,  1332, -1414,  1333,  1336,  1339,   517,
-    8195,  8311, -1414, -1414,   123, -1414,  1343,  1348, -1414,  8775,
-     755,   768,  1342,   770,  6525, -1414, -1414, -1414,   508, -1414,
-     777,  1352,  1353,   301,  1403,   933, -1414, -1414,  6244, -1414,
-   11388, 11562, -1414, -1414, -1414,  1359,  1364, -1414, -1414, -1414,
-    1363, -1414, -1414, -1414, -1414, -1414, -1414, 10834,   851,   273,
-   -1414,  1347,   851,  1168,   268, 10980, -1414, -1414, -1414, -1414,
-   -1414, -1414, -1414, -1414,  1365, -1414, -1414, -1414, -1414, -1414,
-   -1414,  1368,  1371, -1414, -1414, -1414, -1414, -1414, -1414, -1414,
-    1375, -1414,  1374, -1414, -1414, 11388,    91,  6244, 11388, -1414,
-    1385,  6244, -1414,   288,  1402,  1405, -1414, -1414,  1390,  1393,
-    1376, -1414,   882, -1414, -1414, -1414,  1624,  2082,  1388,   869,
-     884,  4994, -1414,   803,  1394,  6244, -1414,   705,   705,  1399,
-    1406,  1407,  1409, -1414, -1414,  8543,  1397, -1414,  1473,  4994,
-    1404, -1414, -1414, 11299, -1414,   811, -1414,  1395, 11388,  1401,
-   -1414, -1414,  1410, -1414,  1412, -1414,  1433,  1441, -1414,  1415,
-   10834, -1414, -1414, -1414,   851,   705,  1429,  1417,  1436, -1414,
-    1446,  1261,  1261, -1414, -1414, -1414, -1414, -1414, 11388,   278,
-   -1414,   910, -1414, -1414,  7730, -1414, -1414,  1435,  6244, -1414,
-    6244,  7730,   301, 10694,   301, 10694,  1462, -1414,  1463, -1414,
-   -1414,  1460,   869, -1414,   812, -1414, -1414,  6244, -1414,  1465,
-    1466, -1414,  4994,  4994, -1414, -1414,  1007,    37, -1414, -1414,
-    1447, -1414,  1007, -1414, -1414,  2485,   705, -1414, -1414,   301,
-   10694,   301, 10694,  1472,  1450,   705, -1414, -1414, -1414, -1414,
-   -1414, 11299,  1468,  1007,  7847,  6244, 11210,  1475,  1007,  1477,
-    2485,  2994, -1414, -1414, -1414,  1495, -1414, -1414, -1414, -1414,
-    9069, -1414, -1414, -1414, 11077, -1414, 11299, -1414, -1414,  1476,
-   10984, -1414, -1414, 11210,   301,  2994,   301,  1502,  1506,   813,
-   -1414, 11077, -1414, -1414, -1414, 10984, -1414, -1414, -1414,   301,
-     301, -1414, -1414, -1414, -1414, -1414, -1414, -1414, -1414
+    7316,  8697, -1310,    16, -1310, -1310, -1310, -1310, -1310, -1310,
+   -1310,    22, -1310, -1310, -1310, -1310, -1310, -1310, -1310, -1310,
+   -1310, -1310, -1310, -1310, -1310, -1310,   101,   101,   101,  1152,
+     941,    64,  7548,   141, -1310, -1310, -1310, -1310, -1310,    87,
+   -1310, -1310, -1310,   868,   134, -1310, -1310, -1310, -1310,  9158,
+   -1310, -1310, -1310, -1310,   149,   144, -1310,  1337, -1310, -1310,
+   -1310, -1310,   139,   935,   260,   102,  2892, -1310, -1310,  9196,
+     790, -1310, -1310, -1310,   904,   293,  5512,   547,   778,   904,
+    1166, -1310, -1310,   554,   624, -1310,   904,  1343, -1310,   187,
+   -1310,   308,   336, -1310, -1310, -1310, -1310,   251,   144,   101,
+   -1310,   101, -1310, -1310, -1310, -1310,  8923,  1337, -1310, -1310,
+    1337, -1310,   337, -1310,  9043, -1310, -1310,  1053,  9381, -1310,
+    1729,  1729,  1729, -1310, -1310, -1310,   101, -1310, -1310, -1310,
+     410,   413,   418, -1310, -1310, -1310,   433, -1310, -1310, -1310,
+   -1310, -1310,   468,   477, -1310, -1310,    37,  8666,  2607,   742,
+     369,   496,   509,   523,   530,   535,  8584,  6836,   536,   546,
+   -1310,  9234, -1310, -1310, -1310, -1310,   561, -1310,   245,  4633,
+    4633, -1310,   562,   361, -1310, -1310, -1310, -1310,   574,   383,
+     408,   429,   101,   577, -1310, -1310,   935,  3015,   664, -1310,
+      86, -1310,   101,   101,   144, -1310, -1310,    89, -1310,   101,
+     101, -1310,  3541,   634,   653,  1729,  6748, -1310, -1310,   623,
+    9158, -1310, -1310,   904, -1310, -1310, -1310,   144, -1310,  1337,
+     149, -1310,  7737, -1310,  1729,  1729,  1729,   144, -1310,  1152,
+   -1310,  5996, -1310, -1310,   642,  1729, -1310,  1729, -1310,    87,
+    8666, -1310,   672, -1310,   941,   697,  1729, -1310,  1152,   699,
+     702, -1310,  7548,   567, -1310, -1310, -1310,  9125, -1310, -1310,
+    4167, -1310,   664,    10,  5116,  9381,  1053,  3541, -1310,    94,
+   -1310, -1310,  9043,  1337,   715, 10741, -1310, -1310,    11, -1310,
+   10483,   740,   772, 10231,   759, 10288, 10307, -1310,   763, -1310,
+   -1310, -1310, -1310, 10364, 10364,  8440,   765, -1310, -1310, -1310,
+   -1310, -1310, -1310,   799, -1310,   616,  2256,  8779, 10288, -1310,
+     475,   860,   810,   276,   913,   766,   767,   793,   832,    41,
+   -1310, -1310,   807,   704, -1310,   331, -1310, -1310,  2607, -1310,
+   -1310,   242,   835, -1310,   421,   835,   841,    87, -1310, -1310,
+     846,  8923, -1310,   847,   857,  8892, -1310, -1310,  1352,  2069,
+    8155,  6748,   904, -1310,   904,  1729,  1729, -1310, -1310, -1310,
+   -1310, -1310, -1310,  1729,  8923,  1337, -1310, -1310,  9419,  1457,
+   -1310,  7886, -1310, -1310, -1310, -1310, -1310, -1310, -1310,   875,
+   10098, 10288, -1310, -1310, -1310, -1310, -1310, -1310, -1310, -1310,
+   -1310, -1310, -1310, -1310, -1310, -1310,  1053, -1310,   928,   862,
+     891,   893,  1023,   916,   937,   951,  3015, -1310, -1310,   942,
+     149,   958, -1310, -1310,   970, -1310, -1310, -1310,  9125, -1310,
+   -1310, -1310, -1310, -1310,  3541, -1310,  8666,  8666, -1310,  1729,
+    1053,  6867,  1337,  8228, -1310, -1310, -1310, -1310,  9125,    10,
+   -1310, -1310,   904,   144, -1310, -1310,  9125, -1310,  6513, -1310,
+   -1310,  1729,  1729,   382,  5342,   969,   972,   960,  1031,  1729,
+   -1310, -1310, -1310, -1310,  9605, -1310,   450,  6629, -1310,   144,
+    1033, -1310,  1053, 10565, 10155, -1310, -1310, -1310, -1310,  1039,
+    3541, -1310,  8301,   664,  7432, -1310, -1310, -1310,   984,   626,
+     807,   941, 10741,   606,  9043, -1310, 10741, -1310, -1310, -1310,
+   -1310,   690, -1310,  1044,   772,   255,  8440, -1310,  9457, -1310,
+   -1310,  8440, -1310,  8553,  8440, -1310, -1310,  1042, -1310,   722,
+    1047,   818,  1048, -1310, -1310,  9310,  6479, -1310,   321, -1310,
+   -1310,  5116, -1310,   602,  5116, -1310, -1310, -1310, -1310, -1310,
+   -1310, -1310, -1310, -1310, -1310, -1310,  5116, -1310, -1310, 10288,
+   10288, 10288, 10288, 10288, 10288, 10288, 10288, 10288, 10288, 10288,
+   10288, 10288, 10288, 10288, 10288, 10288, 10288,  2426,  5116, -1310,
+     704,   830, -1310, -1310,   101,   101, -1310, -1310,  8666, -1310,
+   -1310,   970,   567, -1310,   970, 10212, -1310, -1310, -1310,  4524,
+    6479,  1049,  1054, -1310,  9381, -1310, -1310,   561, -1310,  1056,
+     774,  1073,  2515,    95,   807, -1310,   101,   101,   807,    98,
+   -1310,   101,   101,   970, -1310, -1310,   101,   101, -1310,   835,
+    9490,  1337, 10710,   283,   326,  9490, -1310,  4167, -1310,   807,
+   -1310,  8923, -1310,    80,  7852,  7852,  7852,  1337, -1310,  4787,
+    1065,   875,   744,  1066,  1067, -1310,  1070,  4633,   333, -1310,
+    1134,  1337,  7852,   567,  1053,   567,   664,   494,   835, -1310,
+   -1310,   584,   835, -1310, -1310, -1310,   772, -1310,   835,   144,
+    9605, -1310,   737,  1083,   750,  1090, -1310,  1089,   144, -1310,
+   -1310,  9125,   144,  1088,  9457,  1092, -1310,  1677, -1310,   441,
+     448,   941, -1310,   941,  1091, 10288, -1310,   941, 10710, -1310,
+   -1310,  1098, -1310, -1310, -1310,   567, -1310, 10638,   857, -1310,
+    7852,   853,  8155, -1310, -1310,   561,  1095,  1097,   984,  3316,
+   -1310, -1310, 10741, -1310, -1310,  1099, -1310, -1310,  1105, -1310,
+    1099,  1111, 10483,  5116,    62,  1102,   167,  1113,  1121,  1129,
+    1130, -1310,  1131,  1132,  9348,  6598, -1310,  5116, -1310,   818,
+     978, -1310, -1310, -1310,   101,   101,  5540,  5116,  1135, -1310,
+   -1310,   757, -1310,  5116, -1310, -1310,   914, -1310, -1310, -1310,
+   -1310,   475,   475,   860,   860,   810,   810,   810,   810,   276,
+     276,   913,   766,   767,   793,   832, 10288,   282, -1310,  9605,
+    1136,  1137,  1140,   830, -1310, -1310, -1310, -1310, -1310,  9605,
+     779,  7852, -1310,  8923, -1310,  6955,  9005, -1310,  7886,  6836,
+   -1310, -1310,   774,  9605,  1063,  1142,  1143,  1145,  1146,  1147,
+    1148,  1154, -1310,  3759,  2515, -1310, -1310, -1310, -1310, -1310,
+   -1310, -1310, -1310, -1310, -1310, -1310, -1310, -1310, -1310, -1310,
+   -1310, -1310,   970, -1310, -1310, -1310,   807, -1310, -1310, -1310,
+   -1310, -1310, -1310, -1310, -1310,  1156, -1310,  1159,  1160, -1310,
+   -1310,   149,  1135,  4787, -1310, -1310, -1310, 10098,  1157, -1310,
+   -1310, -1310, -1310,   941,  6225,  1247, -1310, -1310, -1310, -1310,
+    1150,   149, -1310, -1310,   970, -1310, -1310,   970,   137,   970,
+   -1310, -1310, -1310, -1310, -1310, -1310,  9272, -1310,   144, -1310,
+   -1310,   451,   452,  9419,  7074,  2178, 10288,  3429, -1310, -1310,
+    1149,    39,  1149, -1310,   941, -1310,   101, -1310, -1310,  8073,
+     960, -1310, -1310, -1310,   972,  1168,  1169, -1310, -1310,  1170,
+    1172, -1310,   853,  1305, -1310,   359, -1310,  3316,   807, -1310,
+    1177, 10741,  9528,  8666,  1180, -1310, -1310,  1175,  1182,  1164,
+   -1310, 10288,    56,   233,  1179, -1310,  1183,   567,  1183, -1310,
+   -1310,  1183,  1184, -1310,  1189,  1190,  1192,   978, -1310, -1310,
+   -1310, 10098, -1310, -1310, -1310, -1310,  1188,  5116,  1193,   567,
+   -1310,  5116, -1310,   567, -1310, -1310,  5116, -1310,   595,   835,
+   -1310, -1310, -1310, -1310, -1310, -1310, -1310,   875,   857,  8892,
+   -1310, -1310,  7193,  1196, -1310,   622,   835, -1310,   644,   649,
+     835, -1310,  1729,  4053, -1310, -1310, -1310,  9605,  9605, -1310,
+    8228,  8228, -1310,  1194,  1195,  1198,  1199, -1310,  1200,   531,
+      27,  1135, -1310,   567, -1310,  4633, -1310,  5116,   453, -1310,
+    6359,  1213,  1217, 10041,  1222,  1223,    43,    49,   106,  5116,
+    1228,   144,  5116,  5116,  1208,  1237,   142,  1218, -1310, -1310,
+   -1310,  1236, -1310, -1310, -1310, -1310, -1310, -1310, -1310, -1310,
+   -1310,   941,  1249,  5116, -1310,  9605,  9605,   101,  1252, -1310,
+    8810, -1310, -1310,   987, -1310,  3429, -1310, -1310, -1310, -1310,
+    1677, -1310, -1310,  1253, -1310, -1310, -1310, -1310,  1254,  1305,
+   -1310, -1310,  1239, -1310,  1099, -1310, -1310,  1053,  1258, -1310,
+   -1310, -1310,   806,  1262, -1310,   167,  1267, 10288,  1248,   167,
+     167,  1273,  9310,   693,   835, -1310, -1310,  1070,  5116,  1274,
+    1188,   208,   157,  1269, -1310, -1310,  1278,  1269, -1310, -1310,
+    1282, -1310, -1310,   970,  1286,  1288,  6717,  1287,  1289,  1291,
+   -1310, -1310,  1290, -1310, -1310,   970, -1310, -1310, -1310, -1310,
+     970,  5116,  5116,   857,  1292, -1310, -1310, -1310, -1310, -1310,
+   -1310, -1310, -1310, -1310, -1310, -1310, -1310, 10288, 10288,  1294,
+    1295,  1269, -1310, -1310,   941, -1310, -1310, -1310,  5073,  9528,
+    5116,  5116,  1370,  5116, -1310,  1298, -1310,  1299, -1310,  1302,
+    5116,  1306,  5116,  1123,  1307,    30,   101,  5821,  1435, -1310,
+   -1310,  6225,  1303,   456, -1310, -1310, -1310, -1310, -1310, -1310,
+   -1310, -1310, -1310,  9861, -1310,  8301,  1330, -1310, -1310,  9528,
+     463,   481, -1310,  1328,  1314,   772,  1341, -1310,   306, -1310,
+   -1310, -1310, -1310,   970,  1332, -1310, -1310,  1342,   753,   834,
+     567,  1345, -1310,  1350, -1310,  9605, -1310, -1310, -1310, -1310,
+   -1310,  1351, -1310,  9605,  9605,  9605, -1310, -1310,  1359, -1310,
+    1362,  1365,  1366,   557,  7925,  8040, -1310, -1310,   420, -1310,
+    1368,  1371, -1310,  8374,   815,   844,  1346,   866,  6094, -1310,
+   -1310, -1310,   485, -1310,   888,  1369,  1375,   144,  1417,  1051,
+   -1310, -1310,  5116, -1310, 10041,  5116, -1310, -1310, -1310,  1377,
+    1379, -1310, -1310, -1310,  1376, -1310, -1310, -1310, -1310, -1310,
+   -1310,  9528,   772,   195, -1310,  1353,   772,  9605, -1310, -1310,
+   -1310, -1310, -1310, -1310, -1310, -1310, -1310, -1310, -1310, -1310,
+   -1310, -1310,  1384,  1388, -1310, -1310, -1310, -1310, -1310, -1310,
+   -1310,  1394, -1310,  1397, -1310, -1310, 10041,   217,  5116, 10041,
+   -1310,  1400,  5116, -1310,   289,  1421,  1423, -1310, -1310,  1403,
+    1415,  1393, -1310,  1001, -1310, -1310, -1310,  1337,  1053,  1412,
+     799,   323, 10288, -1310,   953, -1310,   567,   567,  1418,  1425,
+    1426,  1428, -1310, -1310,  8228,  1427, -1310,  1497, 10288,  1420,
+   -1310, -1310,  9953, -1310,   955, -1310,  1419, 10041,  1424, -1310,
+   -1310,  1442, -1310,  1445, -1310,  1461,  1462, -1310,  1430,  9528,
+   -1310, -1310, -1310,   772,   567,  1453,  1436,  1459,  1269,  1269,
+   -1310, -1310, -1310, -1310, -1310, 10041,   204, -1310,   370, -1310,
+   -1310,  3684, -1310, -1310,  1439,  5116, -1310,  5116,  3684,   144,
+    9457,   144,  9457,  1463, -1310,  1465, -1310, -1310,  1464,   799,
+   -1310,   968, -1310, -1310, -1310,  1460,  1466, -1310, 10288, 10288,
+   -1310, -1310,  1075,   122, -1310, -1310,  1444, -1310,  1075, -1310,
+   -1310,  2191,   567, -1310, -1310,   144,  9457,   144,  9457,  1472,
+    1450,   567, -1310, -1310, -1310, -1310,  9953,  1469,  1075,  7664,
+    5116,  9865,  1470,  1075,  1479,  2191,  3509, -1310, -1310, -1310,
+    1482, -1310, -1310, -1310, -1310,  8666, -1310, -1310, -1310,  9732,
+   -1310,  9953, -1310, -1310,  1468,  9644, -1310, -1310,  9865,   144,
+    3509,   144,  1484,  1486,   976, -1310,  9732, -1310, -1310, -1310,
+    9644, -1310, -1310, -1310,   144,   144, -1310, -1310, -1310, -1310,
+   -1310, -1310, -1310, -1310
 };
 
@@ -1755,29 +1755,29 @@
 static const yytype_int16 yypgoto[] =
 {
-   -1414,  4377,  3077, -1414,  1645, -1414,   305,   958,   -11, -1414,
-     552,  -530,  -487,  -944,  -142,  3604,     0, -1414,  1277,   511,
-     529,   298,   549,  1057,  1060,  1054,  1062,  1065, -1414,  -211,
-    -327,  5116,  -961,  -725,  -952, -1414,  -200,  -594,   572, -1414,
-    1379, -1414,   397, -1413, -1414, -1414,   129, -1414, -1160,  -935,
-     246, -1414, -1414, -1414, -1414,    68, -1131, -1414, -1414, -1414,
-   -1414, -1414, -1414,   321, -1152,    33, -1414,  -696, -1414,   506,
-     296, -1414,   169, -1414,  -339, -1414, -1414, -1414,   558,  -728,
-   -1414, -1414,    19,  -974,   177,  2303, -1414, -1414, -1414,   -91,
-   -1414,   166,   269,  -194,  1705,  3615, -1414, -1414,    36,   224,
-     628,  -235,  1694, -1414,  1557, -1414, -1414,   200,  2163, -1414,
-    2278,   185, -1414, -1414, -1414,  -607, -1414,   956,   957,   545,
-     725,  -320, -1414, -1414, -1414,   950,   719,  -493, -1414,  -472,
-    -355,  1296, -1414, -1414,  -899,  -946,   440,   524,  1067,   168,
-   -1414,  1040,   317,  -281,  -198,  -141,   672,   781, -1414,  1005,
-   -1414,  2834,    55,  -450,   932, -1414, -1414,   712, -1414,  -228,
-   -1414,   104, -1414, -1414, -1414, -1285,   420, -1414, -1414, -1414,
-    1178, -1414,    31, -1414, -1414,  -862,   -94, -1364,  -152,  1641,
-   -1414,  3733, -1414,   927, -1414,  -170,   493,  -184,  -183,  -181,
-       7,   -42,   -36,   -33,  1610,     4,    10,    14,  -143,  -177,
-    -172,  -162,  -161,  -319,  -513,  -508,  -498,  -547,  -310,  -528,
-   -1414, -1414,  -511,  1101,  1102,  1110,  1575,  4802,  -565,  -560,
-    -559,  -541,  -551, -1414,  -506,  -744,  -736,  -732,  -593,  -267,
-    -227, -1414, -1414,   624,   294,   -85, -1414,  3753,    44,  -634,
-    -173
+   -1310,  4585,  3220, -1310,  1680, -1310,    79,   965,  -162, -1310,
+     542,  -525,  -472,  -928,   -58,  5006,     0, -1310,   115,   571,
+     588,   220,   578,  1041,  1045,  1037,  1040,  1043, -1310,   682,
+    -568,  4467,  -949, -1310,  -743,   627,  -136,  -680,   399, -1310,
+     364, -1310,   400, -1052, -1310, -1310,   143, -1310, -1280, -1058,
+     249, -1310, -1310, -1310, -1310,    74, -1199, -1310, -1310, -1310,
+   -1310, -1310, -1310,   317, -1213,    36, -1310,  -398, -1310,   501,
+     296, -1310,   175, -1310,  -322, -1310, -1310, -1310,   558,  -827,
+   -1310, -1310,    14,  -963,    60,  1949, -1310, -1310, -1310,   -66,
+   -1310,    19,  1219,  -202,  1852,  4238, -1310, -1310,    54,    75,
+     689,  -242,  1416, -1310,  1975, -1310, -1310,   158,  2131, -1310,
+    2701,  1038, -1310, -1310, -1310,  -621, -1310,   944,   946,   541,
+     713,  -254, -1310, -1310, -1310,   938,   714,  -169, -1310,  -117,
+    -134,  1167, -1310, -1310,  -857,  -878,   837,   910,  1055,    25,
+   -1310,   900,   597,   -39,  -190,  -145,   668,   773, -1310,   993,
+   -1310,  2728,  1561,  -434,   920, -1310, -1310,   708, -1310,  -238,
+   -1310,   241, -1310, -1310, -1310, -1226,   414, -1310, -1310, -1310,
+    1165, -1310,    35, -1310, -1310,  -830,  -111, -1309,  -151,  3288,
+   -1310,  3069, -1310,   921, -1310,  -170,   169,  -182,  -181,  -166,
+       7,   -35,   -33,   -32,   813,     2,    29,    44,  -122,  -165,
+    -164,  -158,  -153,  -314,  -519,  -491,  -490,  -538,  -301,  -501,
+   -1310, -1310,  -512,  1078,  1084,  1085,  2540,  5063,  -571,  -588,
+    -558,  -543,  -557, -1310,  -503,  -733,  -723,  -722,  -570,  -311,
+    -274, -1310, -1310,   240,   176,   -77, -1310,  3991,   136,  -632,
+    -222
 };
 
@@ -1785,757 +1785,739 @@
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -526
+#define YYTABLE_NINF -521
 static const yytype_int16 yytable[] =
 {
-      50,   115,   151,   400,   401,   771,   402,    99,   152,   973,
-     403,   153,   429,   454,   874,   404,   756,   974,   408,  1080,
-     116,   975,   262,   441,   269,   405,   406,   744,   850,   384,
-     385,   605,    50,    51,  1142,   982,    70,   411,   833,    99,
-     610,   825,   826,   727,   149,   409,   499,   732,   154,  1150,
-      50,    31,  1398,   836,   155,  1462,   832,   163,   156,   843,
-     827,   800,   282,   145,   188,    51,  1208,   211,    70,   528,
-      50,   195,   343,   824,   218,   567,  1200,   228,    31,   597,
-     671,  -235,  -235,   400,   401,  1184,   402,   926,   821,   221,
-     403,  1318,   170,   822,   168,   404,   520,   737,   408,  1194,
-     680,  1217,  1218,   823,   738,   405,   406,   115,   684,   426,
-     568,   476,   478,  1550,    31,   115,   171,   124,   268,   273,
-     283,   254,   217,   412,    31,   409,  1209,   410,   715,  1462,
-    1210,  1182,  1183,  1561,    31,  1419,  1420,    31,   629,   244,
-    1565,   955,   633,   865,   866,   151,   675,   677,   308,   149,
-     412,   152,  -235,  1079,   153,  1481,   163,   115,   346,   168,
-    1319,   884,   211,   863,   863,   863,    64,   472,   973,   374,
-     722,   204,   477,    31,   217,   528,   974,    57,   117,  1260,
-     975,   853,   863,   920,   420,   854,   412,   188,   188,  1212,
-    1211,   154,   328,   578,   482,   163,   412,   155,    64,   579,
-      78,   156,   528,   268,   834,  1421,   602,   821,   528,    57,
-     956,    50,   822,   669,   731,  1190,   716,   217,   163,   938,
-     293,   205,   823,   211,    71,   151,   179,   674,   676,  1127,
-     444,   152,    78,   746,   153,  1213,  1087,   666,  -113,  -113,
-     863,   308,  1191,   841,   212,   602,  1263,   222,   580,   958,
-     412,   125,   216,    50,  -113,   437,    71,   589,   825,   826,
-      99,   273,   144,  1466,   667,  1026,   273,   268,   268,   836,
-     118,  1152,   506,   115,  1264,   163,   263,   827,   217,   264,
-     864,   864,   864,  1025,   464,   328,    51,   343,  1001,    70,
-    1013,   214,  1184,   610,   108,   108,   308,  1103,   804,   864,
-    1090,   146,  1343,   658,   216,   821,   113,   520,   308,   378,
-     822,   666,   520,   148,  1004,   520,   217,   437,   725,   161,
-     823,   217,  1199,  1508,   572,   379,   108,   477,   472,   149,
-    1200,   673,  1419,  1420,   448,   863,   374,   678,   667,   855,
-    -470,   157,   115,   856,   905,  1184,   346,   216,   472,   569,
-     603,   621,   168,   461,   597,   528,   472,   864,  1537,   597,
-    1539,  1466,  1080,   810,   108,   626,  1466,   388,   793,   626,
-     930,  -470,   115,  -470,  1492,   833,   260,  -470,  -113,   825,
-     826,   685,  1401,   389,   161,  1405,  1466,   579,   440,  1128,
-     599,  1182,  1183,  1466,   715,  1551,  1129,   268,   827,  -113,
-     442,  1191,  1430,   557,   558,   859,   217,   188,   216,     8,
-       9,    10,    11,    12,   374,   173,   850,   324,   183,    64,
-      43,   252,  1566,   876,   473,   268,   340,   308,   308,  1247,
-      57,   268,   837,  1251,   626,   571,   840,   412,    31,   559,
-     560,   343,   484,   391,    46,    47,   216,   443,   494,   501,
-     495,   216,   864,    78,   877,   115,   644,   857,    78,   392,
-     878,   860,   393,  1451,  1452,  1214,    34,  1170,  1172,  1184,
-    1138,   328,   328,   268,   203,   855,   431,    71,   394,  1110,
-     435,   268,   716,   626,   395,    50,   929,   217,   374,   721,
-    1200,   112,    99,    98,   736,   115,  1079,  1200,  1114,   499,
-     396,   249,    41,    42,  1148,  1259,   888,   308,   875,   115,
-     324,  1024,   308,  -291,   308,   308,  1457,   179,    51,   917,
-     610,    70,   754,  -521,   921,    98,   115,   346,  1341,   217,
-     763,   583,   923,   412,   630,  1342,   216,   150,   634,   328,
-     922,   112,   435,    98,  1026,   489,   919,   108,   924,    43,
-    1200,  -106,    41,    42,   921,  -106,   715,   191,   328,   466,
-      98,  1521,   886,    98,   753,   522,   412,  1526,   923,   254,
-    1091,   572,   572,    46,    47,   214,  1381,   161,   265,   308,
-     769,   995,  1006,    43,  1092,   473,  1094,   810,  1546,  1138,
-     626,   346,   472,  1553,   920,   621,  1197,  1097,   939,  1097,
-     602,   603,   331,   603,  1197,   473,  1332,    46,    47,   332,
-     706,   588,  1198,   473,  1334,   594,   707,   216,   935,    78,
-    1324,   626,  1333,   328,   751,  1024,   626,   812,   621,  1367,
-    1335,  1126,   626,  1368,   627,   626,   626,   626,   631,    78,
-    1382,   340,    98,   889,   716,   412,  -113,    78,  -113,   713,
-     217,    64,  -113,   -10,   626,    98,   268,   895,  1039,   216,
-     723,   112,    57,   343,  -444,   851,   724,  -113,  -113,  1037,
-     599,   733,    41,    42,   165,  1181,   810,   734,   217,  1029,
-     399,   191,   288,   217,  -445,    78,   115,   254,   330,   914,
-    1084,   553,   554,    41,    42,   750,   324,   324,   214,   231,
-    1348,   751,   929,   232,    98,   892,   236,   412,   238,    71,
-    1379,   550,   626,   940,   621,   247,    98,   551,   552,   515,
-     721,   721,  1122,  1154,   689,   412,   278,   959,   400,   401,
-     280,   402,  1044,   555,   556,   403,  1498,   118,   281,   165,
-     404,   333,   597,  1498,   408,   334,    98,   929,   115,   346,
-     405,   406,   335,   754,   754,   217,   112,   336,   141,   142,
-     480,   372,   489,   112,   324,   373,   489,    41,    42,   217,
-     377,   409,  1111,   113,    41,    42,   522,   112,   522,   108,
-     216,   522,   386,   324,   522,  1151,   973,  1429,    41,    42,
-     852,  1392,   994,   991,   974,   340,  1547,   899,   975,   572,
-    1249,   390,  1350,   751,   715,   398,   867,   626,   216,   626,
-     901,  1009,   410,   216,   626,   346,   751,   990,   603,   743,
-     427,   883,    98,   991,   739,   343,   740,  1003,  1174,   741,
-     603,   428,   747,   707,   764,   436,  1039,   743,   433,   770,
-     743,   451,   231,   604,   529,   530,   531,   443,   324,   473,
-     112,   812,   141,   142,  1245,   781,   782,   783,   784,   808,
-     579,    41,    42,  1292,  1293,  1375,   217,  1166,   532,   412,
-     533,   751,   534,   535,  1500,   473,  1501,  -368,  1376,  -397,
-    1378,   308,   462,    78,   751,   216,   751,  1383,   466,   870,
-     849,   505,   716,   751,  1169,   594,   602,   436,   463,   216,
-     191,   858,   501,   626,  1195,   704,  1171,   810,   602,    78,
-     115,   346,   914,  1447,   914,   713,   929,    70,   485,  1444,
-     524,  1467,  1514,  1571,   214,   666,   115,   751,  1515,   579,
-     917,  1548,   165,   293,  1256,  1370,   412,   509,   214,   940,
-     940,   529,   530,   531,   721,   254,   330,   412,   514,   115,
-     308,   528,   667,   561,   562,   689,   526,   919,    49,   114,
-     885,   563,   887,   751,   996,   532,   346,   533,  1115,   534,
-    1321,   716,   565,    37,   330,   412,   754,    40,    98,   929,
-     929,   231,   604,   236,    41,    42,   564,   114,   114,   705,
-      49,  1388,  1389,   489,   328,    43,   216,  1439,   991,  1533,
-    1444,  1445,    49,  1300,  1301,   566,  1303,   569,    49,   346,
-      44,   339,   934,  1308,  -441,  1310,    49,   340,   587,    46,
-      47,   694,    49,  1240,   590,    49,  1493,  1494,    49,    -3,
-     626,   626,   420,   662,   412,   214,     2,   208,     4,     5,
-       6,     7,   114,   114,   482,   330,   412,    64,   639,  1138,
-     308,  1419,  1420,   851,   834,   330,   602,   659,    57,     8,
-       9,    10,    11,    12,   777,   778,    49,   217,   668,    49,
-     143,   231,   660,   661,  1446,   663,    49,   713,  1005,   693,
-     664,    78,   665,   808,   779,   780,  1202,   670,    31,   259,
-     115,   697,  1459,   695,   820,   914,   604,  1311,  1312,  1313,
-     914,    35,   699,    36,  -239,    71,   735,    49,   748,   940,
-     785,   786,   704,   752,   959,    49,    34,   268,   959,   959,
-      49,  1349,  1351,  1352,   243,   246,  1116,   760,   813,   -12,
-     814,   524,   817,   524,   626,   343,   524,   828,   -13,   524,
-    -292,   872,   873,    43,   880,    49,    49,     8,     9,    10,
-      11,    12,   900,   902,   724,   907,   903,   910,   571,   346,
-     412,    49,   928,  -418,    -3,  1519,  1459,    46,    47,    49,
-    -525,   943,   808,   950,   964,   108,    31,  1425,    49,   340,
-     952,    49,   918,   957,   963,   965,   967,   968,   114,   969,
-     929,   970,   986,   998,   999,   689,   705,   216,  1000,  1015,
-    1016,   273,   115,   114,    34,  1017,  1018,   114,   929,  1019,
-    1020,    49,   114,   820,   604,  1021,   473,   489,  1117,   324,
-     115,   221,  1032,  -406,   308,    49,    49,    57,  -405,    37,
-    1081,  1046,    49,    40,  1083,   704,   443,  1339,   626,    49,
-      41,    42,   115,   108,   913,   704,   112,  1105,   141,   240,
-      78,    43,   112,  1104,   141,   142,   217,    41,    42,   704,
-      70,  1115,  1106,    41,    42,  1107,   818,   751,   602,  1131,
-    1113,  1123,  1124,  1125,    71,    46,    47,  1134,   849,  1130,
-     980,   929,   929,   241,  1140,   458,  1135,    49,   242,   728,
-     626,   626,  1136,  1144,   729,  1137,   743,  1164,  1144,   273,
-    1143,  1187,  1185,  1442,   308,  1186,  -293,    49,    49,  1188,
-     693,   820,  1559,     8,     9,    10,    11,    12,  1189,   705,
-    1203,  1204,  1206,   604,    49,   713,  1207,  1399,    49,   705,
-    1215,  1399,  1219,    -3,  1220,  1222,  1227,   115,  1232,   645,
-    1202,  1237,    31,   705,   108,  1235,   400,   401,  1144,   402,
-    1241,  1246,   494,   403,   217,    49,  1115,  1248,   404,   689,
-    1253,   408,  1254,  1261,  1250,    49,  1268,  1270,   405,   406,
-      34,     2,   208,     4,     5,     6,     7,  1265,   212,   222,
-    1272,  1273,  1302,    49,  1274,   666,   216,  1275,   409,    49,
-      64,    49,  1276,  1278,  1285,  1305,  1294,   268,  1295,  1306,
-     230,    57,  1323,   808,   713,  1093,   131,   918,   132,   133,
-     134,  1532,   667,  1307,  1330,   626,  1336,    41,    42,  1116,
-    1309,   646,  1317,  1338,    78,   214,   114,  1340,  1344,  1346,
-    1347,    49,  1353,  1482,  1354,   175,    35,   604,    36,    49,
-     115,  1355,  1357,    49,  1363,  1364,  1365,    49,    71,  1366,
-     114,  1377,   114,  1068,    37,  1373,   176,   177,    40,  1115,
-    1374,  1384,  1385,  1313,   115,    41,    42,   704,   704,  1393,
-     473,   115,   645,   115,  1394,   115,   442,  1395,   255,  1402,
-    1413,    57,  1405,  1414,   216,  -407,  1417,   114,   151,   340,
-     645,   373,   114,   645,   152,  1428,   108,   153,  1432,  1436,
-    1202,  1434,  1437,  1443,    78,  1531,  1448,  1202,  1438,  1453,
-     115,  1117,   115,  1368,  1116,  1458,  1454,  1455,   108,  1456,
-    1472,  1463,  1474,   443,   115,   704,   704,  1468,    71,  1476,
-    1531,  1531,   726,  1470,   730,  -294,   108,  1478,   163,  1485,
-     308,   114,     8,     9,    10,    11,    12,  1480,    49,  1486,
-     693,   705,   705,  1487,    37,  1531,  1488,    76,    40,    49,
-    1202,    49,   374,   511,  1441,    41,    42,  1499,  1144,  1144,
-    1144,    31,  1509,  1511,   418,  1513,    43,  1517,  1518,  1525,
-      49,  1540,  1541,  1545,   328,   548,   549,  1554,   918,    76,
-    1552,   720,   112,   918,   141,   142,    49,   438,   108,    34,
-      46,    47,   114,    41,    42,  1556,  1117,   446,  1562,   705,
-     705,    49,  1569,   114,    49,   114,  1570,  1116,  1221,   789,
-     787,  1322,  1520,   548,   788,  1205,   743,   224,   790,  1431,
-     473,   108,   791,  1572,   245,  1387,  1252,   473,  1403,  1226,
-    1502,    57,   908,   909,  1098,  1234,  1102,    49,    57,   931,
-     806,   114,  1139,   114,  1045,   879,   945,   114,  1112,   548,
-     164,   953,  1331,   718,    78,   114,     0,   126,   129,   130,
-       0,    78,   796,   797,   196,   521,  1328,   219,    49,    49,
-     229,   798,     0,     0,   871,     0,     0,     0,    71,     0,
-     473,     0,    49,     0,     0,    71,    37,     0,   176,   177,
-      40,    57,     0,   178,     0,    67,   119,    41,    42,  1117,
-       0,   704,  1144,  1144,   693,   354,     0,     0,     0,   704,
-     704,   704,     0,     0,    78,     2,   208,     4,     5,     6,
-       7,     0,     0,   925,   108,   927,     0,    67,     0,   458,
-       0,   256,  1505,   257,  1505,     0,     0,     0,    71,     0,
-    1483,     0,     0,   178,     0,   162,   178,     0,   108,   164,
-    1329,   215,     0,     0,     0,   108,   414,     0,     0,     0,
-       0,   234,   375,   422,     0,   223,    49,     0,     0,  1505,
-       0,  1505,     0,     0,     0,   704,     0,     0,    49,   450,
-      35,     0,    36,     0,     0,   705,  1068,     0,   164,     0,
-       0,     0,   178,   705,   705,   705,     0,     0,     0,   324,
-      76,  1534,   261,   215,     0,    76,     0,     0,   108,     0,
-    1542,   164,     0,   682,   397,     0,     0,   774,   775,   776,
-       0,   645,     0,   445,   416,   417,     0,     0,   114,   421,
-       0,   423,   424,     0,     0,   414,     0,     0,    37,   708,
-     176,   177,    40,     0,   329,     0,   215,     0,     0,    41,
-      42,    49,   261,   351,     0,   178,     0,     0,     0,   705,
-      49,     0,    49,     0,     0,     0,     0,     0,    37,   114,
-     185,   186,    40,     0,     0,   377,   521,     0,     0,    41,
-      42,   521,  1391,   407,   521,     0,     0,     0,     0,   577,
-      43,     0,    49,     0,     0,     0,     0,   581,   425,   224,
-     584,   430,   432,   646,     0,   187,   162,   215,     0,   178,
-    1049,     0,   114,     0,    46,    47,   178,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   449,   645,   375,
-       0,   452,     0,   453,     0,     0,   114,  1418,     0,   645,
-    1426,   114,   460,     0,     0,   215,     0,     0,    67,     0,
-     215,  1099,     0,   474,     0,     0,     0,     0,   898,     0,
-       0,     0,     0,   481,   414,   500,    76,     0,   422,     0,
-       0,   432,     0,     0,     8,     9,    10,    11,    12,     0,
-       0,   354,     0,     0,   178,  1465,    76,     0,     0,     0,
-    1469,   114,     0,     0,    76,     8,     9,    10,    11,    12,
-       0,   178,     0,    31,     0,   178,     0,   375,     0,     0,
-     646,     0,   354,   480,     0,     0,     0,     0,     0,     0,
-    1491,     0,     0,     0,    31,     0,     0,   981,     0,   114,
-     354,    34,    76,     0,     0,   215,     0,   261,     0,     0,
-     897,   595,     0,    49,     0,   414,     0,   623,    49,   904,
-       0,     0,    34,   906,     0,     0,     0,     0,    43,     0,
-     628,     0,     0,     0,   628,    49,     0,   261,   178,     0,
-       0,     0,     0,   753,   354,   412,     0,     0,     0,    43,
-       0,   997,    46,    47,     0,     0,     0,  1506,     0,  1506,
-       0,  1002,     0,     0,   939,     0,   602,     0,     0,     0,
-       0,     0,     0,    46,    47,  1014,  1560,     0,     0,     0,
-       0,  1049,  1560,     0,   474,     0,   215,     0,     0,     0,
-       0,     0,     0,  1560,  1506,     0,  1506,  1560,    37,   351,
-     185,   186,    40,   215,   474,     0,   577,   577,   354,    41,
-      42,     0,   474,     0,    37,   114,   185,   186,    40,     0,
-      43,     0,     0,    79,     0,    41,    42,     0,   215,     0,
-     700,     0,     0,   432,     0,   912,    43,   412,    49,     0,
-       0,     0,     0,   913,    46,    47,     0,     0,   714,     0,
-      67,   267,   354,   354,   354,    79,     0,     0,   432,     0,
-      46,    47,   432,     0,     0,     0,     0,     0,     0,     0,
-       0,   354,     0,     0,     0,     0,   801,   802,     0,     0,
-       0,   114,   114,   114,     0,     0,     0,     0,     0,   354,
-       0,   261,   351,   225,   890,   178,     0,  1298,   893,     0,
-      76,     0,     0,     0,     0,   835,     0,     0,   838,   839,
-       0,   842,     0,   844,   845,     0,     0,     0,   846,   847,
-       0,     0,     0,     0,     0,     0,    76,   178,     0,   354,
-       0,     0,     0,     0,     0,     0,     0,   799,    81,   645,
-       0,     0,     0,   178,  1089,     0,   548,     0,     0,   215,
-       0,     0,     0,     0,     0,   628,   811,     0,   178,     0,
-       0,     0,     0,    58,    58,     0,   354,     0,   830,     0,
-      81,     0,     0,     0,     0,     0,     0,   215,     0,     0,
-       0,   356,   215,  1179,  1180,     0,   595,   511,     0,     0,
-       0,   595,     0,     0,     0,    58,     0,   628,     0,     0,
-     351,   351,   351,     0,     0,     0,     0,     0,   226,     0,
-       0,     0,   354,     0,    49,    49,     0,     0,     0,   351,
-       0,     0,   354,     0,   354,   114,   114,     0,     0,   224,
-      58,     0,   354,    58,   577,     0,   354,   700,     0,   178,
-       0,  1229,  1230,     0,     0,     0,     0,     0,   474,     0,
-       0,     0,     0,     0,   215,     0,     0,     0,     0,   978,
-     979,     0,     0,   114,     0,     0,     0,     0,   215,     0,
-       0,     0,     0,     0,   474,     0,    79,   351,     0,     0,
-       0,    79,     0,     0,     0,     0,   944,     0,   500,   432,
-      37,     0,   185,   186,    40,     0,   357,     0,    76,     0,
-    1216,    41,    42,     0,    37,     0,   185,   186,    40,     0,
-       0,     0,    43,   261,   714,    41,    42,     0,     0,   976,
-       0,   349,     0,    49,   114,     0,    43,   601,   354,   602,
-       0,     0,     0,   114,     0,     0,    46,    47,     0,     0,
-       0,   912,     0,   412,     0,     0,     0,     0,    49,    49,
-      46,    47,     0,   414,     0,     0,     0,     0,     0,     0,
-     700,     0,     0,     0,     0,   215,     0,     0,     0,     0,
-     700,     0,   351,    49,   628,   225,     0,  1012,     0,   628,
-     811,     0,     0,   354,   700,     0,    58,     0,     0,     0,
-       0,    81,     0,     0,  1023,     0,    81,   536,   537,   538,
-     539,   540,   541,   542,   543,   544,   545,     0,   178,     0,
-       0,     0,     0,     0,     0,     0,    58,    37,     0,   185,
-     186,    40,     0,     0,  1100,     0,     0,  1356,    41,    42,
-       0,   546,     0,  1155,     0,  1358,  1359,  1360,     0,    43,
-       0,     0,    79,     0,   354,   354,    67,   354,   354,     0,
-    1167,     0,     0,     0,  1530,     0,   412,   356,     0,     0,
-       0,     0,    79,    46,    47,     0,     0,    76,   628,     0,
-      79,     0,     0,     0,     0,   261,   714,     0,     0,  1095,
-       0,     8,     9,    10,    11,    12,     0,     0,   356,     0,
-     226,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1406,   354,   354,     0,  1109,   356,     0,    79,     0,
-      31,     0,     0,   432,   119,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   414,     0,
-       0,   351,     0,     0,     0,     0,     0,     0,    34,     0,
-       0,     0,     0,    37,     0,   185,   186,    40,     0,     0,
-     356,     0,  1386,     0,    41,    42,     0,    81,     0,     0,
-       0,     0,     0,     0,     0,    43,   215,     0,     0,     0,
-    1257,     0,   357,     0,   595,     0,   354,    81,     0,     0,
-     601,     0,   602,     0,     0,    81,     0,   430,  1231,    46,
-      47,     0,   700,   700,     0,   351,   351,   349,     0,     0,
-       0,     0,     0,   357,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   356,  1201,     0,     0,     0,   224,
-       0,   357,     0,    81,     0,     0,     0,     0,     0,     0,
+      49,   114,   453,   428,   399,   400,   268,    98,   150,   766,
+     151,   152,   819,   973,   868,   115,   964,   407,   752,    63,
+     401,   402,   403,   358,   383,   384,   965,   966,   404,   261,
+     440,   827,    49,   405,   596,   604,    50,   410,   498,    98,
+     357,   740,   820,   148,  1070,   153,   830,  1069,   609,    49,
+     844,    63,   837,   948,    69,  1137,   162,   821,   725,   794,
+      56,   116,   730,   187,   826,   408,   210,   144,    50,    49,
+     194,   919,   154,   217,   409,    70,   227,  1187,    31,   342,
+     112,   815,   178,   220,   399,   400,    69,   155,   281,  1439,
+     628,   425,    56,  1302,   632,  1379,   669,   407,   123,   818,
+     401,   402,   403,  1204,  1205,  1181,   114,    70,   404,   816,
+     817,   475,   477,   405,   114,  1195,   678,   267,   272,   476,
+     505,  1197,  1443,  1177,   682,    31,   211,   923,    31,   221,
+     203,   124,   262,    31,    31,   263,   566,    31,   527,   493,
+      31,   213,   494,  1171,   527,   408,   282,   307,   148,  1178,
+     411,   150,   145,   151,   152,   162,   114,   345,    77,   519,
+    1439,   210,  1303,  1169,  1170,  1117,  -231,  -231,   373,    97,
+     567,   714,   964,   143,   720,  1196,   107,   107,  1199,  1245,
+     204,  1198,   965,   966,   913,   167,   187,   187,   153,   476,
+      77,   471,   949,  1458,   162,   253,   147,   411,   419,   815,
+     411,    97,   267,   481,   828,   411,   601,   835,   107,   601,
+      49,   568,   149,  1186,   287,   154,  1443,   162,    97,   527,
+     667,  1443,   210,  1200,   819,    41,    42,   816,   817,   443,
+     155,   150,   190,   151,   152,    97,   664,  -231,    97,  1484,
+     307,  1443,  1248,  1139,   439,   107,   156,  1077,  1443,   292,
+     167,   514,    49,  1016,   820,   182,   169,   830,   172,    98,
+     272,  1398,  1399,   202,   588,   272,   267,   267,   723,   821,
+    1249,    63,   114,  1512,   162,  1514,   472,   527,   951,  1080,
+     170,   991,   441,   327,   665,   656,  1015,   463,    50,   164,
+     672,   674,  1093,   815,   342,   307,  -287,   442,   483,   358,
+    1468,   609,  1526,   248,  1382,   500,    69,   307,   251,   596,
+     664,  1003,    56,   671,   596,   804,   357,    97,  -119,   676,
+    -119,   816,   817,   571,  -119,  1187,  1178,    70,   148,  1541,
+      97,  1400,   465,  1398,  1399,   373,  -516,   527,  1084,  -119,
+    -119,   114,   734,  1118,   819,   345,   436,  1171,   713,   602,
+     620,   579,   471,   411,   164,   398,   190,   853,   665,   898,
+     253,   377,   827,  1119,   625,   735,   556,   557,   625,  1201,
+     519,   114,   471,   178,   820,   519,   327,   378,   519,    97,
+     471,  1070,   831,  1116,  1069,   736,   834,   673,   675,   821,
+     629,    97,   358,   111,   633,   847,   267,  1171,   747,   848,
+     510,   558,   559,  1409,    41,    42,   187,   851,   436,   357,
+      77,   854,   986,   373,  1496,    77,  1325,  1169,  1170,   174,
+    1501,    97,   547,   548,   267,   213,   307,   307,   107,   844,
+     267,   787,   759,   625,   714,   479,  1326,   472,   849,  1423,
+    1521,   577,   850,   167,   870,  1528,   642,   578,   342,  1525,
+     435,  1157,  1159,  1424,   114,   729,   358,   472,  1428,  1429,
+     547,  1362,   254,   871,  1126,   472,   859,   860,   264,  1536,
+     447,   849,   267,   357,   742,  1100,  1540,   387,  1187,   330,
+     267,   598,   625,   877,    49,  1187,  1469,   373,   719,   460,
+     498,    98,   683,   388,   114,  1244,   547,    97,   578,   390,
+    1470,   711,   869,    63,   888,   881,   307,  1104,   114,  1135,
+    1014,   307,   435,   307,   307,   391,  1171,   910,   603,   -10,
+      50,   750,  -440,   609,   392,   114,   345,  -441,  1016,   996,
+     582,  -467,   411,  -467,   804,   523,  1187,  1434,    69,   798,
+     393,   931,   277,   879,    56,   394,   112,   164,   213,  1236,
+    -467,     2,   207,     4,     5,     6,     7,   914,   417,    70,
+     704,   395,   327,   327,   916,   912,   705,   914,   916,  1184,
+     571,   571,  1184,   915,   952,   190,    77,   279,   307,  1316,
+     917,   437,  1126,  1081,  1082,  1185,   280,   913,  1308,   625,
+     345,   445,   549,   714,   620,  1317,    77,  1318,   550,   551,
+     602,   747,   602,   882,    77,   411,   331,   760,  1360,  1276,
+    1277,   713,   765,  1319,  1474,   471,    35,  1363,    36,   332,
+     625,  1474,   804,  1014,  1019,   625,   111,   620,   140,   239,
+     327,   625,   994,   333,   625,   625,   625,    41,    42,   111,
+     334,   928,    77,  -102,   806,   335,   846,  -102,   371,   327,
+      41,    42,   625,    97,   267,   372,  1087,   603,  1087,   520,
+     107,   465,   861,   240,   768,   769,   770,   342,   241,  1348,
+     376,  1027,  1522,  1349,   111,   358,   876,   385,   111,    -3,
+     140,   141,  1408,   389,   114,    41,    42,   907,   596,    41,
+      42,  1074,   357,   885,   691,   411,   111,   442,   140,   141,
+     472,   528,   529,   530,  1141,  1112,   411,    41,    42,   397,
+     625,   933,   620,   764,   327,   726,  1101,  1234,   719,   719,
+     727,  1238,  1034,   399,   400,   531,   472,   532,   409,   533,
+     534,  1153,   878,   411,   880,   432,   721,   407,   244,   401,
+     402,   403,   722,   426,   114,   345,   523,   404,   523,   750,
+     750,   523,   405,  1156,   523,   601,   845,   500,  1158,   230,
+     601,   598,   427,   231,   711,  1476,   235,  1477,   237,   814,
+     713,   603,   964,   213,   450,   246,   775,   776,   777,   778,
+    1373,  -288,   965,   966,   927,   408,  -364,   213,     8,     9,
+      10,    11,    12,   571,     2,   207,     4,     5,     6,     7,
+     731,   625,  1241,   625,   411,   999,   732,   680,   625,   345,
+    1161,  -393,   602,   570,  1425,   411,   111,    31,   140,   141,
+    1523,    45,    46,   229,   602,   111,   342,    41,    42,   484,
+    1436,   461,   746,   706,   462,   714,    41,    42,   747,    77,
+       8,     9,    10,    11,    12,    34,    37,   892,   804,   504,
+      40,   253,   329,   747,   292,   864,   911,    41,    42,    35,
+     894,    36,   163,   806,  1330,    77,   747,   980,   508,    31,
+     520,   972,   513,   981,   307,   520,   195,   525,   520,   218,
+     213,   527,   228,   812,   562,   601,  1168,   814,   603,   993,
+    1182,    45,    46,    63,   563,   705,   625,    34,   554,   555,
+    1494,  1436,   230,   114,   345,   907,   111,   907,     2,   207,
+       4,     5,     6,     7,   714,   664,  1232,    41,    42,   114,
+     910,   564,   578,   711,   691,  1356,   565,   749,    69,   411,
+     142,   747,   933,   933,    56,    45,    46,   719,   568,   570,
+      37,   411,   114,   307,    40,  1332,   338,    45,    46,    70,
+    -437,    41,    42,   952,  1357,   586,  1105,   952,   952,   589,
+     747,   163,   932,   665,   601,    48,   113,   750,   912,    -3,
+      45,    46,   657,    35,   374,    36,  1359,    43,  1508,   552,
+     553,   814,   747,   242,   245,    45,    46,   638,     8,     9,
+      10,    11,    12,   603,   113,   113,  1227,    48,  1364,   345,
+     163,   658,  1106,   659,   747,   560,   561,    37,    48,   184,
+     185,    40,   713,   111,    48,   140,   141,    31,    41,    42,
+     625,   625,    48,   163,    41,    42,   661,  1126,    48,   984,
+     981,    48,    77,   890,    48,   444,  1121,   253,   329,   411,
+     307,   230,   897,   235,   186,    34,   899,   662,   113,   113,
+     107,   666,    45,    46,  1284,  1285,    37,  1287,  1132,   472,
+      40,   663,  1132,  1426,  1292,  1444,  1294,    41,    42,  1423,
+     668,   747,    48,  1323,  1083,    48,   911,   442,  1490,   327,
+     114,   258,    48,   692,  1491,   907,  1546,   749,   693,   411,
+     907,   695,   578,   718,  1189,    45,    46,   329,   411,   933,
+      56,    45,    46,   737,   215,   738,   603,   267,   739,  1369,
+    1370,   743,  1132,    48,   547,    70,  1418,   981,   107,  1398,
+    1399,    48,   625,   771,   772,    37,    48,   184,   185,    40,
+     342,   230,   419,   660,   411,   845,    41,    42,   779,   780,
+    1351,   374,   773,   774,   457,   697,   345,  -235,   481,   329,
+     411,    48,    48,   733,   744,   510,   215,   748,   756,   691,
+    1380,   807,   266,   873,  1380,   711,   808,    48,   811,  -289,
+      45,    46,   828,   329,   601,    48,     8,     9,    10,    11,
+      12,  1295,  1296,  1297,    48,   822,   867,    48,   272,   114,
+    1331,  1333,  1334,   893,   113,   -12,   -13,   866,    77,   215,
+     895,   896,   900,   220,   903,    31,   921,   114,  -414,   113,
+    -520,   307,   936,   113,   943,   722,   107,    48,   113,   374,
+     117,   945,  1404,   956,   130,   625,   131,   132,   133,   114,
+      63,    48,    48,    34,   950,    41,    42,   957,    48,   958,
+     959,   960,   961,  1105,   711,    48,   988,   989,   211,   221,
+     990,   977,  1005,  1006,   911,  1007,  1008,  1009,  1010,   911,
+     215,  1459,  1079,   213,  1011,    69,  1022,  1421,   160,  -402,
+    -401,    56,  1036,  1058,   625,   625,  1071,  1534,  1094,   906,
+     644,  1073,  1096,   272,  1097,  1095,    70,  1103,   307,  1106,
+    1113,   747,  1114,    48,  1115,  1120,  1122,   971,   215,  1123,
+    1124,   702,  1125,   215,  1128,  1131,  1151,   472,  1174,  1175,
+    1172,  1173,  1176,    48,    48,     8,     9,    10,    11,    12,
+     691,   114,  1190,   399,   400,   259,  1191,  1132,  1132,  1132,
+      48,  1193,  1194,   160,    48,  1105,   407,  1202,  1206,   401,
+     402,   403,  1189,   441,    31,   643,  -290,   404,    56,  1207,
+    1209,    -3,   405,     8,     9,    10,    11,    12,   442,  1214,
+     664,    48,  1219,    70,  1224,   107,   323,   493,  1222,    77,
+    1507,    48,    34,  1228,   703,   339,  1233,   922,   267,  1235,
+    1237,  1106,    31,  1240,   408,  1250,  1246,   107,   215,    48,
+    1252,   724,  1254,   728,   625,    48,  1256,    48,  1257,  1258,
+    1262,  1259,  1420,  1260,  1269,   107,  1278,  1279,   665,    37,
+      34,   175,   176,    40,   932,  1203,   601,  1286,  1307,   114,
+      41,    42,    45,    46,    37,   430,   175,   176,    40,   434,
+    1289,  1290,   113,  1105,  1291,    41,    42,    48,  1293,  1301,
+    1314,   114,  1192,  1320,  1322,    48,    77,  1328,   114,    48,
+     114,  1324,   114,    48,  1329,  1358,   113,  1335,   113,   323,
+     472,   372,  1336,  1338,   107,  1132,  1132,   472,   985,   215,
+     150,  1344,   151,   152,  1345,  1346,  1347,  1297,  1365,  1106,
+    1354,  1506,   214,  1355,  1366,  1383,   114,  1374,   114,  1375,
+    1376,   434,   233,   113,   488,  1189,  1392,   107,   113,   114,
+    1393,    56,  1189,  1460,  -403,  1506,  1506,   702,    56,  1396,
+    1407,   215,  1415,   162,   521,   307,    70,  1411,   472,  1413,
+     528,   529,   530,    70,  1416,  1417,   160,  1422,  1430,    37,
+    1506,   175,   176,    40,   214,  1431,  1432,   373,  1433,  1435,
+      41,    42,   865,  1349,   531,  1029,   532,   113,   533,  1305,
+    1440,  1445,  1449,  1189,    48,  1451,  1447,  1453,  1455,    56,
+     587,  1509,  1457,  1462,   593,    48,   376,    48,  1463,  1464,
+    1517,  1475,  1492,  1485,    70,  1487,  1500,   214,  1493,  1489,
+     703,  1515,  1516,   626,  1520,  1527,    48,   630,   922,  1529,
+     339,   918,  1531,   920,  1544,   107,  1545,   457,  1208,    77,
+    1537,   783,    48,   781,  1130,   784,    77,   113,   782,   785,
+    1058,  1306,  1495,  1410,  1547,  1368,    48,   107,   113,    48,
+     113,  1239,  1384,  1478,   107,  1088,   702,   216,   901,  1213,
+     902,  1221,   215,   922,  1092,   924,   702,   800,   214,  1127,
+    1035,   872,   938,  1315,   243,   323,   323,  1102,   790,   716,
+     702,   327,    48,   946,   791,   792,   113,    77,   113,     0,
+     215,  1367,   113,     0,     0,   215,     0,     0,  1138,     0,
+     113,     0,     0,   687,   479,   107,   214,     0,     0,   216,
+       0,   214,     0,    48,    48,     0,   117,     0,     0,     0,
+    1482,     0,  1482,     0,     0,     0,   499,    48,     0,   703,
+       0,     0,     0,  1372,     0,     0,     0,     0,     0,   703,
+       0,   488,     0,   323,     0,   488,     0,     0,     0,  1029,
+       0,     0,   216,   703,     0,   521,  1482,   521,  1482,     0,
+     521,     0,   323,   521,     0,     0,   215,   177,     0,     8,
+       9,    10,    11,    12,   339,     0,     0,     0,     0,    37,
+     215,   184,   185,    40,     0,  1397,     0,     0,  1405,     0,
+      41,    42,     0,     0,     0,     0,   214,   644,    31,     0,
+       0,     0,     0,  1039,     0,     0,     0,    48,     0,     0,
+       0,     0,     0,   216,     0,     0,   905,   177,   411,    48,
+     177,     0,     0,     0,    45,    46,    34,   323,     0,   922,
+       0,  1442,     0,     0,     0,     0,  1446,   906,   802,     0,
+       0,     0,     0,  1479,  1089,  1483,     0,     0,     0,     0,
+       0,   216,     0,     0,     0,     0,   216,     0,     0,     0,
+       0,     0,   643,     0,  1467,     0,   177,   891,   113,   843,
+       0,     0,     0,   215,   593,     0,     0,   214,     0,  1511,
+     852,  1513,    66,   118,   702,   702,     0,     0,     0,   922,
+     922,    48,     0,     0,   214,     0,     0,     0,     0,     0,
+      48,   644,    48,     0,     0,     0,     0,     0,     0,   113,
+       0,     0,     0,     0,    66,     0,     0,     0,     0,   214,
+       0,     0,     0,  1542,     0,  1543,     0,     0,     0,   177,
+       0,   161,    48,   687,     0,     0,     0,     0,  1550,  1551,
+       0,   216,   702,   702,     0,     0,     0,     0,  1535,     0,
+       0,   222,   113,     0,  1535,     0,     0,   703,   703,     0,
+       0,     0,     0,     0,     0,  1535,   643,     0,     0,  1535,
+       0,   488,     0,     0,   113,     0,     0,     0,   113,    57,
+      57,     0,     0,   177,     0,     0,   987,     0,   260,     0,
+     177,     0,     0,   339,     0,     0,   992,     0,     0,     0,
+       0,  1039,     0,     0,     0,    75,     0,     0,     0,     0,
+    1004,    57,     0,     0,     0,   703,   703,     0,     0,     0,
+       0,     0,   216,     0,     0,     0,     0,     0,   113,     0,
+     328,     0,     0,     0,     0,     0,     0,    75,   260,   350,
+     214,     0,     0,     0,     0,    57,     0,     0,    57,     0,
+       0,     0,   995,     0,     0,     0,     0,   802,   177,     0,
+       0,     0,     0,     0,   216,     0,   113,     0,   214,   406,
+     215,     0,     0,   214,   223,   177,     0,     0,     0,   177,
+      48,     0,     0,     0,   424,    48,     0,   429,   431,     0,
+    1312,     0,   161,     0,   922,     0,     0,     0,     0,     0,
+       0,     0,    48,     0,     0,     0,     0,     0,     0,     0,
+     922,     0,     0,   448,  1282,     0,     0,   451,     0,   452,
+       0,     0,   702,     0,     0,     0,     0,     0,   459,     0,
+     702,   702,   702,     0,    66,     0,   348,     0,     0,   473,
+       0,     0,   177,     0,   214,   802,     0,     0,     0,   480,
+       0,     0,   339,     0,     0,     0,     0,   431,   214,     0,
+       0,    78,   353,  1313,     0,     0,     0,     0,   687,     0,
+       0,    37,     0,   184,   185,    40,     0,     0,   499,   113,
+     922,   922,    41,    42,     0,   216,     0,     0,     0,     0,
+     488,  1107,   323,    78,   702,   703,     0,     0,     0,     0,
+       0,    57,    48,   703,   703,   703,     0,     0,   600,     0,
+     601,     0,     0,   216,  1166,  1167,    45,    46,   216,     0,
+       0,     0,     0,   260,     0,     0,     0,   594,     0,     0,
+     224,    57,     0,   622,     0,     0,   449,     0,     0,     0,
+       0,     0,     0,   113,   113,   113,   627,     0,   843,     0,
+     627,   214,     0,   260,     0,     0,   215,    75,     0,     0,
+       0,     0,    75,     0,     0,     0,     0,   703,     0,     0,
+       0,     0,  1216,  1217,     0,     0,     0,     0,     0,     0,
+      37,     0,   184,   185,    40,     0,     0,     0,     0,   216,
+       0,    41,    42,    37,     0,   184,   185,    40,     0,   177,
+     473,     0,     0,   216,    41,    42,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   350,     0,   905,   355,   411,
+     473,     0,     0,     0,     0,    45,    46,     0,   473,   687,
+    1505,   177,   411,     0,     0,     0,     0,     0,    45,    46,
+       0,     0,     0,     0,     0,     0,   698,   177,     0,   431,
+       0,   215,     0,     0,     0,     0,   223,     0,     0,     0,
+       0,   177,     0,     0,   712,     0,    66,     0,     0,     0,
+       0,   802,    48,    48,   431,     0,     0,     0,   431,     0,
+       0,   113,   113,   535,   536,   537,   538,   539,   540,   541,
+     542,   543,   544,     0,     0,     0,   216,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   260,   350,     0,
+       0,     0,   348,    78,     0,     0,     0,   545,    78,   113,
+       0,     0,     0,    75,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   353,     0,
+       0,     0,   177,    75,     0,     0,     0,     0,   214,     0,
+       0,    75,  1337,   793,     0,     0,   339,     0,     0,     0,
+    1339,  1340,  1341,    57,     0,     0,     0,     0,     0,   353,
+       0,   627,   805,     0,     0,     0,    48,   113,  1107,     0,
+       0,     0,     0,     0,   824,     0,   113,   353,     0,    75,
+       0,     0,     0,   283,   284,     0,   285,     0,     0,     0,
+      48,    48,   594,     0,     0,   348,     0,   594,     0,     0,
+       0,     0,   224,   627,     0,     0,   350,   350,   350,     0,
+       0,     0,   286,     0,  1385,    48,     0,     0,   287,     0,
+       0,   353,   288,     0,   350,   289,   290,   291,   292,    41,
+      42,     0,   293,   294,     0,     0,     0,     0,     0,     0,
+       0,     0,   698,     0,     0,     8,     9,    10,    11,    12,
+       0,     0,     0,   473,     0,   295,     0,   379,     0,   348,
+    1107,     0,     0,    45,    46,   297,   298,   299,   300,    78,
+       0,     0,     0,     0,    31,     0,   786,     0,     0,   473,
+       0,     0,   350,   216,   355,   353,     0,     0,     0,    78,
+       0,   937,     0,     0,   431,     0,   177,    78,     0,     0,
+       0,     0,    34,   348,   348,   348,     0,    37,     0,   184,
+     185,    40,     0,     0,     0,   355,   260,   712,    41,    42,
+       0,   348,   967,     0,   214,     0,     0,     0,     0,   353,
+     353,   353,     0,   355,     0,    78,     0,     8,     9,    10,
+      11,    12,     0,     0,   600,     0,   601,   353,     0,     0,
+       0,     0,    45,    46,     0,     0,     0,     0,  1107,     0,
+       0,   698,     0,     0,     0,   353,    31,     0,     0,     0,
+       0,   698,     0,   350,     0,   627,    75,   355,  1002,   348,
+     627,   805,     0,     0,     0,   698,     0,     0,     0,  1481,
+       0,  1481,     0,     0,    34,  1013,     0,     0,     0,    37,
+       0,     0,    75,    40,     0,   353,     0,     0,     0,     0,
+      41,    42,     0,     0,     0,     0,     0,     0,     0,   214,
+       0,    80,     0,     0,     0,  1481,     0,  1481,     0,     0,
+       0,     0,     0,     0,     0,     0,    43,     0,     0,     0,
+     353,   355,     0,     0,    45,    46,    66,     0,    87,     0,
+     413,     0,     0,    80,   323,     0,     0,   421,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   627,   216,
+     348,     0,     0,     0,     0,   260,   712,     0,   348,  1085,
+      87,     0,     0,     0,   353,   355,   355,   355,     0,     0,
+     225,     0,     0,     0,   353,     0,   353,     0,     0,     0,
+       0,   223,     0,   355,   353,  1099,     0,     0,   353,     0,
+       0,     0,     0,   431,   118,     0,     0,   226,     0,     0,
+       0,   355,     0,     0,     0,     0,     0,     0,     0,   413,
+       0,     0,    78,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    57,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    78,     0,
+       0,   355,     0,     0,   216,     0,     0,     0,     0,    75,
+       0,   594,     0,     0,     0,     0,     0,     0,   356,     0,
+       0,     0,     0,   576,   429,     0,     0,     0,     0,   698,
+     698,   580,   350,   350,   583,     0,   355,     0,     0,   353,
+       0,     0,     0,     0,     0,   363,     0,   177,     0,     0,
+       0,    57,  1188,     0,     0,   206,     2,   207,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+     355,     0,    26,    27,    28,     0,     0,   698,   698,     0,
+     355,    31,   355,     0,     0,     0,     0,   224,   413,     0,
+     355,     0,   421,     0,   355,     0,     0,     0,     0,     0,
+       0,     0,     0,    80,     0,     0,     0,     0,    80,    34,
+       0,    35,     0,    36,    37,     0,   208,    39,    40,   348,
+     348,     0,     0,     0,   627,    41,    42,     0,     0,     0,
+      87,     0,     0,     0,     0,    87,     0,     0,     0,    57,
+       0,     0,   353,   353,     0,   353,   353,     0,   712,     0,
+       0,    43,     0,   209,     0,    78,     0,     0,     0,    45,
+      46,     0,     0,     0,     0,    75,     0,     0,     0,   413,
+       0,     0,     0,     0,     0,     8,     9,    10,    11,    12,
+       0,     0,     0,     0,     0,   355,     0,     0,     0,     0,
+       0,  1283,     0,     0,     0,     0,     0,     0,     0,     0,
+     353,   353,   225,     0,    31,     0,     0,   177,     0,   260,
+       0,     0,     0,    66,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   698,     0,   712,     0,   226,
+       0,   118,    34,     0,     0,     0,     0,    37,     0,   184,
+     185,    40,     0,     0,     0,   127,   127,   127,    41,    42,
+       0,     0,     0,     0,     0,     0,     0,   698,     0,     0,
+     576,   576,     0,     0,     0,   698,   698,   698,     0,    80,
+       0,   353,     0,     0,   186,     0,   350,   350,     0,     0,
+       0,     0,    45,    46,   356,     0,     0,    57,    57,    80,
+    1188,     0,     0,     0,     0,     0,    87,    80,   355,   355,
+       0,   355,   355,     0,     0,     0,     0,     0,     0,     0,
+      57,   363,     0,     0,   223,   356,    87,     0,   127,     0,
+     127,    78,     0,   118,    87,     0,     0,     0,    57,   698,
+       0,     0,     0,   356,     0,    80,    75,     0,     0,     0,
+       0,     0,   363,     0,     0,   276,     0,   883,   353,     0,
+     353,   886,     0,     0,     0,     0,   355,   355,     0,     0,
+     363,     0,    87,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   348,   348,     0,     0,   356,     0,     0,
+     353,     0,    57,     0,     0,     0,     0,    57,   353,   353,
+     353,     0,     0,     0,     0,     0,   350,     0,     0,   353,
+     353,   127,     0,     0,   363,     0,     0,     0,     0,   127,
+       0,   127,   127,    75,     0,     0,   127,     0,   127,   127,
+      57,   118,     0,   168,     0,   173,     0,   355,   179,   180,
+     181,     0,   183,     0,     0,     0,     0,     0,     0,     0,
+       0,   356,     0,  1188,     0,     0,     0,   234,     0,     0,
+    1188,     0,   353,     0,     0,     0,     0,     0,     0,   249,
+     250,     0,     0,     0,   125,   128,   129,     0,   363,     0,
+     224,     0,     0,     0,     0,     0,     8,     9,    10,    11,
+      12,     0,     0,   576,     0,   356,   356,   356,   127,     0,
+       0,     0,    78,   348,     0,     0,     0,     0,     0,     0,
+       0,  1188,     0,   356,   355,    31,   355,     0,  1530,     0,
+       0,     0,   363,   363,   363,     0,     0,     0,    57,   353,
+       0,   356,     0,     0,     0,     0,     0,     0,     0,     0,
+     363,     0,    80,    34,     0,     0,   355,   255,    37,   256,
+      57,     0,    40,     0,   355,   355,   355,    57,   363,    41,
+      42,     0,     0,     0,     0,   355,   355,     0,    80,    87,
+       0,   356,     0,     0,     0,     0,    75,     0,     0,    78,
+       0,     0,     0,    75,     0,   718,     0,     0,     0,     0,
+       0,     0,     0,    45,    46,    87,     0,     0,   363,     8,
+       9,    10,    11,    12,     0,     0,   356,     0,    57,     0,
+       0,   413,     0,     0,     0,     0,     0,     0,   355,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    31,     0,
+     396,     0,     0,   363,    75,     0,     0,     0,     0,     0,
+     415,   416,     0,     0,     0,   420,     0,   422,   423,     0,
+     356,     0,     0,     0,     0,     0,    34,     0,     0,     0,
+     356,    37,   356,   184,   185,    40,     0,   225,     0,     0,
+     356,     0,    41,    42,   356,     0,     0,   363,     0,     8,
+       9,    10,    11,    12,     0,   355,     0,   363,  1142,   363,
+       0,     0,     0,     0,   226,     0,     0,   363,   905,     0,
+     411,   363,     0,     0,     0,  1154,    45,    46,    31,     0,
+       0,     8,     9,    10,    11,    12,     0,     0,     0,     0,
+       0,     0,     0,     0,   591,     0,   599,     0,     0,     0,
+       0,     0,    78,     0,     0,    80,    34,   623,   624,    78,
+      31,    37,     0,   184,   185,    40,     0,     0,     0,     0,
+       0,     0,    41,    42,     0,     0,     0,     0,     0,     0,
+       0,     0,    87,     0,     0,   356,     0,     0,    34,     0,
+       0,     0,     0,    37,     0,   184,   185,    40,  1505,     0,
+     411,     0,     0,   413,    41,    42,    45,    46,     0,     0,
+      78,     0,   363,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   127,   127,     0,     0,     0,     0,     0,
+     266,     0,     0,     0,     0,     0,     0,     0,    45,    46,
+       0,     0,     0,  1242,     0,     0,     0,     0,     0,     0,
+       0,     0,   127,     0,     0,   127,   127,     0,   127,     0,
+     127,   127,     0,     0,     0,   127,   127,     1,     2,   207,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,  -291,     0,    26,    27,    28,    29,   356,   356,
+      30,   356,   356,    31,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    76,     0,     0,     0,     0,     0,     0,    58,     0,
-     700,   700,     0,   354,     0,   354,     0,     0,   356,   356,
-     356,     0,     0,     0,     0,   357,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   356,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   354,     0,
-     349,     0,     0,     0,    88,   356,   354,   354,   354,   628,
-       0,     0,     0,     0,     0,     0,    79,   354,   354,     0,
-       0,  1503,     0,  1507,     0,     0,     0,     0,     0,     0,
-    1320,    76,     0,     0,   714,   178,    88,     0,     0,   357,
-       0,     0,    79,     0,     0,   356,     0,     0,     0,     0,
-       8,     9,    10,    11,    12,     0,     0,     0,  1536,     0,
-    1538,     0,     0,     0,   349,   215,     0,     0,     0,     0,
-       0,     0,   354,     0,   227,     0,     0,  1299,     0,    31,
-       0,     0,   356,   357,   357,   357,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   261,     0,     0,     0,    67,
-       0,     0,   357,  1567,     0,  1568,     0,    34,   349,   349,
-     349,   700,    37,   714,   185,   186,    40,   119,  1575,  1576,
-     357,     0,     0,    41,    42,     0,     0,   349,   356,     0,
-       0,    81,     0,     0,    43,     0,     0,     0,   356,     0,
-     356,     0,   354,     0,     0,   225,   700,     0,   356,   912,
-       0,   412,   356,     0,   700,   700,   700,    81,    46,    47,
-     357,     0,   364,   215,     0,   351,   351,     0,     0,     0,
-       0,     0,     0,     0,     8,     9,    10,    11,    12,  1201,
-       0,     0,     0,     0,     0,   349,     0,     0,     0,     0,
-       0,    76,     0,     0,     0,     0,     0,   357,    76,     0,
-       0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
-       0,   178,   119,     0,    79,     0,     0,     0,     0,     0,
-     700,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    34,     0,     0,     0,     0,    37,     0,   185,   186,
-      40,     0,     0,   357,   356,     0,     0,    41,    42,     0,
-       0,    76,     0,   357,     0,   357,     0,    88,    43,     0,
-     226,     0,    88,   357,     0,     0,     0,   357,     0,     0,
-       0,     0,     0,  1530,     0,   412,     0,     0,     0,     0,
-     349,     0,    46,    47,     0,     0,     0,     0,   349,     0,
-     351,     0,     0,     0,     0,     0,     0,     0,     0,   356,
-       0,   169,     0,   174,     0,     0,   180,   181,   182,     0,
-     184,     0,     0,     0,     0,   119,     8,     9,    10,    11,
-      12,     0,     0,     0,     0,   235,     0,     0,     0,    81,
-       0,     0,     0,     0,     0,     0,     0,   250,   251,  1201,
-       0,     0,     0,     0,     0,    31,  1201,     8,     9,    10,
-      11,    12,     0,     0,    58,     0,   227,     0,     0,   357,
-     356,   356,     0,   356,   356,     0,     0,     0,     0,     0,
-       0,     0,     0,    34,     0,     0,    31,     0,    37,     0,
-     185,   186,    40,    79,     0,     0,     0,     0,     0,    41,
-      42,     0,     0,     0,     0,     0,     0,     0,     0,  1201,
-      43,     0,     0,     0,    34,     0,  1555,     0,     0,    37,
-       0,   185,   186,    40,   357,   187,     0,     0,   356,   356,
-      41,    42,    58,    88,    46,    47,     0,     0,     0,     0,
-       0,    43,     0,     8,     9,    10,    11,    12,   364,   349,
-       0,     0,     0,    88,     0,     0,   267,     0,     0,     0,
-       0,    88,     0,     0,     0,    46,    47,     0,     0,     0,
-       0,     0,    31,     0,     8,     9,    10,    11,    12,   364,
-       0,     0,     0,     0,     0,   357,   357,     0,   357,   357,
-       0,     0,     0,     0,     0,     0,     0,   364,     0,    88,
-      34,     0,   356,    31,     0,    37,     0,     0,    81,    40,
-       0,     0,     0,   349,   349,     0,    41,    42,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-       0,    34,     0,    58,     0,     0,    37,     0,     0,     0,
-      40,   364,    44,   357,   357,   225,     0,    41,    42,     0,
-       0,    46,    47,     0,     0,     0,     0,     0,    43,     0,
-       0,     0,     0,     0,     0,     0,     0,    79,     0,     0,
-       0,     0,     0,   720,     0,     0,     0,     0,     0,   356,
-       0,   356,    46,    47,     8,     9,    10,    11,    12,    13,
+       0,    80,     0,     0,     0,   363,   363,     0,   363,   363,
+       0,    34,     0,    35,     0,    36,     0,     0,    38,    39,
+       0,     0,  -291,     0,     0,     0,  1012,     0,    87,     8,
+       9,    10,    11,    12,     0,     0,   356,   356,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    44,   283,   284,    31,   285,
+       0,    45,    46,   363,   363,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   127,   127,   286,    34,     0,     0,     0,
+       0,   287,     0,     0,     0,   288,     0,     0,   289,   290,
+     291,   292,    41,    42,     0,   293,   294,   356,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   795,   796,     0,     0,     0,     0,   295,     0,
+     379,     0,     0,     0,   363,     0,   344,    46,   297,   298,
+     299,   300,     0,     0,     0,     0,     0,     0,     0,     0,
+     225,   829,     0,     0,   832,   833,     0,   836,     0,   838,
+     839,     0,     0,     0,   840,   841,     0,     0,     0,     0,
+       0,     0,    80,     0,     0,     0,     0,   226,     0,   925,
+       0,   926,     0,     0,   356,     0,   356,     0,   929,   930,
+       0,     0,     0,   935,     0,     0,     0,     0,     0,    87,
+       0,     0,     0,     0,     0,   940,     0,     0,     0,     0,
+     944,   363,     0,   363,     0,     0,   356,     0,     0,     0,
+       0,     0,     0,     0,   356,   356,   356,     0,     0,     0,
+       0,     0,     0,     0,     0,   356,   356,     0,   978,     0,
+     127,     0,     0,   363,     0,   127,     0,     0,     0,    80,
+       0,   363,   363,   363,     0,     0,     0,     0,     0,     0,
+       0,     0,   363,   363,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    87,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   356,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     166,     0,   969,   970,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   363,     0,   219,     0,     0,
+    1162,     0,     0,     8,     9,    10,    11,    12,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,  1023,  1024,  1025,
+    1026,     0,  1028,     0,     0,     0,     0,     0,     0,     0,
+     283,   284,    31,   285,     0,   356,     0,  1072,     0,     0,
+       0,     0,     0,     0,     0,   166,     0,     0,     0,   273,
+       0,  1078,     0,     0,     0,     0,     0,     0,     0,   286,
+      34,     0,   363,     0,     0,   287,     0,     0,     0,   288,
+       0,     0,   289,   290,   291,   292,    41,    42,   166,   293,
+     294,     0,    80,     0,     0,     0,   127,     0,   369,    80,
+       0,  1098,   375,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   295,     0,   379,     0,     0,     0,     0,    87,
+    1163,    46,   297,   298,   299,   300,    87,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,  1129,    26,    27,    28,
+      80,   166,  1136,     0,  1090,     0,    31,  1140,     0,     0,
+       0,     0,  1144,   219,  1145,     0,     0,     0,  1147,     0,
+    1148,  1149,     0,     0,  1152,     0,     0,    87,     0,     0,
+       0,   166,     0,  1164,    34,     0,     0,     0,     0,     0,
+       0,   208,    39,     0,     0,     0,     0,     0,     0,     0,
+       0,  1179,  1180,     0,     0,     0,   375,     0,     0,     0,
+       0,     0,     0,   166,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   127,     0,     0,  1210,     0,
+       0,  1212,     0,     0,    45,    46,   524,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   166,     0,
+       0,     0,     0,     0,   212,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   232,     0,   236,     0,   238,     0,
+       0,     0,     0,     0,  1226,   247,     0,     0,     0,     0,
+    1230,  1231,     0,     0,     0,     0,   597,     0,     0,     0,
+       0,   621,     0,     0,     0,     0,     0,     0,     0,     0,
+    1247,     0,     0,  1251,     0,     0,   212,  1253,   236,   238,
+     247,     0,     0,     0,     0,  1218,     0,     0,     0,     0,
+    1261,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,  1268,     0,  1270,  1271,  1272,  1273,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   212,
+       0,  1280,     0,  1281,     0,     0,     0,   173,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   166,   166,     0,
+       0,     0,     0,     0,   369,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1309,  1310,     0,     0,
+       0,     0,     0,     0,     0,   524,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     212,     0,   236,   238,   247,     0,     0,     0,     0,     0,
+       0,     0,     0,   715,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   166,  1342,  1343,     0,     0,
+       0,     0,     0,     0,  1304,     0,  1353,   524,   212,   524,
+       0,     0,   524,   212,   166,   524,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   369,   497,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,   592,     0,   600,   364,     0,     0,     0,     0,
-       0,     0,     0,    31,   356,   624,   625,   357,     0,     0,
-       0,     0,   356,   356,   356,     0,     0,     0,     0,     0,
-       0,     0,     0,   356,   356,     0,     0,     0,     0,     0,
-       0,    34,     0,     0,     0,     0,     0,    79,     0,   364,
-     364,   364,     0,     0,     0,     0,     0,     0,     0,     0,
-     226,     0,     0,     0,     0,     0,     0,     0,   364,     0,
-     284,   285,     0,   286,     0,     0,     0,     0,     0,     0,
-       0,     0,    81,     0,    58,    58,   364,     0,   356,     0,
-       0,     0,     0,     0,   357,     0,   357,    88,     0,   287,
-       0,     0,     0,     0,     0,   288,     0,    58,     0,   289,
-       0,     0,   290,   291,   292,   293,    41,    42,     0,   294,
-     295,     0,     0,    88,     0,    58,   364,    43,     0,   357,
-       0,     0,     0,     0,     0,     0,     0,   357,   357,   357,
-       0,     0,   296,     0,   380,     0,     0,   381,   357,   357,
-       0,    46,    47,   298,   299,   300,   301,     0,   356,     0,
-       0,     0,    81,   364,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   349,   349,     0,     0,     0,     0,     0,
-       0,     0,    58,     0,     0,     0,     0,    58,     0,     0,
+      24,    25,  -291,     0,    26,    27,    28,  1388,     0,  1389,
+    1390,  1391,     0,    31,     0,     0,   212,     0,     0,   166,
+       0,  1395,     0,     0,     0,     0,     0,     0,     0,     0,
+    1406,   369,     0,     0,     0,   810,     0,     0,   212,     0,
+       0,    34,     0,   236,   238,     0,    37,     0,   336,   337,
+      40,   247,  -291,     0,     0,  1427,     0,    41,    42,     0,
+       0,   597,     0,     0,   321,     0,   597,     0,     0,     0,
+       0,     0,     0,     0,   346,   369,   369,   369,     0,   157,
+       0,     0,     0,   634,     0,   338,   382,   382,     0,     0,
+       0,    45,    46,   369,   212,     0,     0,     0,  1465,  1466,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   357,     0,     0,     0,    79,     0,   364,
-       0,     0,     0,     0,    79,     0,     0,     0,     0,   364,
-      58,   364,     0,     0,     0,     0,   227,     0,     0,   364,
-       0,     0,     0,   364,     0,     8,     9,    10,    11,    12,
+       0,  1471,   212,     0,     0,     0,     0,   212,  1471,   212,
+     283,   284,     0,   285,     0,   524,     0,   252,     0,     0,
+       0,     0,     0,     0,     0,     0,   212,   257,     0,   212,
+     212,     0,     0,     0,     0,     0,     0,   212,     0,   286,
+    1504,   369,     0,   934,  1510,   287,     0,   321,     0,   288,
+       0,   212,   289,   290,   291,   292,    41,    42,   212,   293,
+     294,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   478,  1532,     0,  1533,     0,   715,     0,     0,     0,
+       0,     0,   295,   157,   379,     0,     0,   380,     0,     0,
+      45,    46,   297,   298,   299,   300,     0,   386,     0,     0,
+       0,     0,  1548,  1549,     0,     0,     0,     0,     0,     0,
+    1552,  1553,     0,     0,     0,     0,     0,     0,     0,     0,
+     418,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   369,     0,   433,     0,   621,     0,     0,     0,
+     369,     0,     0,   438,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   446,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   283,   284,     0,   285,     0,     0,
+       0,     0,   212,     0,     0,     0,     0,     0,   464,     0,
+       0,     0,     0,   474,     0,     0,     0,   382,     0,     0,
+       0,     0,     0,   286,     0,     0,   482,     0,     0,   287,
+     212,     0,   492,   288,   496,   212,   289,   290,   291,   292,
+      41,    42,     0,   293,   294,     0,     0,     0,     0,     0,
+       0,   526,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   715,   295,     0,   379,     0,
+       0,     0,     0,   757,    45,    46,   297,   298,   299,   300,
+     524,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   585,     0,     0,     0,     0,   590,     0,
+       0,     0,     0,     0,   166,     0,   212,     0,     0,     0,
+       0,   709,     0,     0,     0,     0,     0,     0,     0,     0,
+     212,     0,     0,     0,     0,     0,     0,   635,     0,     0,
+       0,   636,   637,     0,   639,     0,     0,     0,     0,     0,
+     497,   650,   651,     0,   652,   653,     0,   654,     0,   655,
+     741,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     597,     0,     0,   758,     0,     0,   585,     0,   741,     0,
+       0,   741,     0,     0,   670,     0,     0,     0,     0,     0,
+       0,   369,   369,   767,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   681,
+       0,   212,     0,     0,     0,   788,     0,     0,     0,     0,
+       0,     0,     0,   212,     0,   797,     0,     0,     0,     0,
+       0,     0,   346,     0,     0,   707,     0,   758,     0,     0,
+       0,   710,   212,     0,     0,     0,   464,     0,     0,     0,
+       0,   524,     0,     0,     0,     0,   206,     2,   207,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,   745,    26,    27,    28,   862,     0,     0,     0,
+       0,     0,    31,     0,   382,     0,     0,   763,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   715,     0,     0,
+      34,     0,    35,     0,    36,     0,     0,   208,    39,     0,
+       0,     0,     0,   283,   284,   789,   285,     0,     0,     0,
+       0,     0,     0,     0,   799,     0,     0,     0,     0,     0,
+       0,   801,     0,     0,     0,   212,     0,   809,     0,   219,
+       0,     0,   286,     0,   209,     0,   823,     0,   287,     0,
+      45,    46,   288,     0,     0,   289,   290,   291,   292,    41,
+      42,     0,   293,   294,     0,   212,     0,     0,     0,     0,
+       0,     0,   758,     0,   963,     0,   715,     0,     0,   341,
+     364,     0,     0,     0,   974,   295,   863,   379,     0,     0,
+     982,     0,     0,    45,    46,   297,   298,   299,   300,     0,
+     212,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   212,     0,   414,     0,     0,     0,     0,     0,     0,
+     414,     0,   809,     0,     0,   369,   369,     0,     0,     0,
+     904,     0,  1000,  1001,   219,     0,   346,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   507,
+     346,   509,   512,     0,     0,     0,     0,     0,     0,   515,
+     516,   252,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   941,   942,   509,   509,     0,     0,     0,     0,     0,
+       0,     0,     0,   212,     0,     0,     0,     0,     0,     0,
+    1031,     0,   414,     0,   382,     0,     0,   212,     0,     0,
+       0,     0,     0,     0,   979,     0,     0,     0,     0,   983,
+       0,   509,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,   346,    26,    27,    28,     0,     0,     0,     0,     0,
+       0,    31,   684,     0,     0,   369,   414,   509,     0,     0,
+       0,     0,     0,     0,   414,   581,     0,   414,   584,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   364,    34,
+     321,     0,   613,  1017,     0,     0,    38,    39,     0,     0,
+    1018,     0,     0,     0,     0,     0,   212,     0,     0,     0,
+       0,   631,     0,  1020,   341,  1021,     0,     0,   382,     0,
+       0,   524,     0,   524,   974,     0,     0,     0,   741,  1033,
+       0,     0,     0,   685,     0,  1037,     0,   686,     0,    45,
+      46,   414,     0,     0,     0,   414,     0,  1075,     0,  1150,
+    1076,     0,     0,     0,     0,     0,     0,   524,     0,   524,
+    1165,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   364,     0,     0,     0,
+       0,     0,   382,     0,  1183,     0,   166,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   974,
+     974,   212,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+    1215,     0,   414,     0,     0,   364,     0,   590,     0,     0,
+       0,    31,     0,     0,     0,   509,   509,   509,   509,   509,
+     509,   509,   509,   509,   509,   509,   509,   509,   509,   509,
+     509,   509,   509,     0,     0,     0,     0,   283,   284,    34,
+     285,     0,  1146,     0,   414,     0,     0,     0,   341,   364,
+       0,     0,     0,     0,     0,   974,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   286,     0,     0,     0,
+       0,     0,   287,   862,     0,     0,   288,     0,     0,   289,
+     290,   291,   292,    41,    42,     0,   293,   294,  1266,  1267,
+       0,     0,     0,   414,   414,     0,     0,     0,     0,     0,
+     526,     0,     0,     0,     0,     0,  1211,     0,     0,   295,
+       0,   379,   803,   364,   971,     0,     0,    45,    46,   297,
+     298,   299,   300,   613,     0,   613,   613,     0,     0,     0,
+       0,     0,   613,     0,     0,     0,     0,     0,     0,     0,
+    1223,     0,   842,   364,     0,  1225,     0,     0,   364,     0,
+       0,     0,     0,  1229,     0,     0,     0,   364,   364,   364,
+       0,   509,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   364,     0,     0,     0,     0,
+     414,   884,     0,     0,   414,   887,  1255,     0,     0,     0,
+       0,   889,     0,     0,     0,     0,     0,     0,  1263,     0,
+       0,  1264,     0,  1265,     0,     0,     0,     0,     0,     0,
+     414,     0,     0,     0,     0,     0,     0,  1274,  1275,     0,
+       0,     0,   509,     0,     0,     0,     0,     0,   212,  1371,
+       0,     0,   741,   364,   613,     0,     0,     0,     0,  1288,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   509,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   341,   364,     0,
+       0,     0,   414,   414,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1327,     0,     0,     0,
+       0,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,  -291,
+       0,    26,    27,    28,     0,     0,   414,     0,     0,     0,
+      31,     0,     0,     0,   364,     0,     0,     0,     0,     0,
+       0,   803,   364,     0,     0,   613,     0,   613,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   613,    34,     0,
+       0,     0,     0,    37,     0,   336,   337,    40,     0,  -291,
+       0,  1377,     0,  1378,    41,    42,     0,     0,     0,     0,
+       0,     0,   509,     0,     0,  1386,     0,  1387,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   338,     0,  1394,     0,     0,     0,    45,    46,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+    1412,  1414,     0,     0,     0,     0,     0,   509,     0,   803,
+       0,  1419,     0,     0,  1229,     0,   341,   364,   414,     0,
+     414,     0,     0,     0,   414,     0,     0,     0,     0,     0,
+       0,     0,   321,     0,     0,  1441,     0,     0,     0,     0,
+       0,     0,   509,     0,  1448,   613,   613,  1450,     0,  1452,
+    1454,  1456,     0,     0,     0,   509,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,  -291,     0,     0,     0,     0,     0,
+     414,     0,     0,     0,     0,    31,     0,     0,     0,  1486,
+       0,  1488,     0,  1229,     0,     0,   509,     0,     0,     0,
+       0,   414,  1143,     0,     0,     0,     0,     0,  1499,     0,
+       0,     0,   364,    34,     0,     0,     0,     0,   414,  1155,
+       0,   613,   613,  1160,  -291,     0,     0,     0,     0,     0,
+       0,     0,     0,   364,   364,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     1,     2,   207,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,   509,    26,    27,    28,    29,     0,     0,
+      30,   283,   284,    31,   285,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   414,     0,   414,     0,
+       0,     0,     0,   414,     0,     0,     0,     0,     0,     0,
+     286,    34,   613,    35,     0,    36,   287,     0,    38,    39,
+     288,     0,     0,   289,   290,   291,   292,    41,    42,     0,
+     293,   294,     0,   509,   509,   803,   414,  1243,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   295,     0,  1055,     0,     0,     0,   364,
+       0,    45,    46,   297,   298,   299,   300,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  -126,     0,     1,     2,
+     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,  -295,     0,    26,    27,    28,     0,     0,
-       0,     0,   213,     0,    31,     0,     0,    79,     0,     0,
-       0,     0,   233,   357,   237,     0,   239,     0,     0,     0,
-       0,     0,     0,   248,     0,     0,     0,     0,     0,     0,
-       0,     0,    34,     0,     0,    88,     0,    37,   349,   337,
-     338,    40,     0,  -295,     0,     0,     0,     0,    41,    42,
-       0,     0,     0,     0,   213,     0,   237,   239,   248,    43,
-       0,     0,    81,    58,     0,   364,     0,     0,     0,    81,
-       0,     0,     0,     0,   635,     0,   339,     0,     0,   128,
-     128,   128,     0,    46,    47,     0,     0,    58,     0,     0,
-       0,     0,   284,   285,    58,   286,     0,   213,   932,     0,
-     933,     0,     0,     0,     0,     0,     0,   936,   937,     0,
-       0,     0,   942,     0,     0,     0,     0,     0,     0,     0,
-     364,   287,    81,   167,   947,     0,     0,   288,     0,   951,
-       0,   289,     0,     0,   290,   291,   292,   293,    41,    42,
-     220,   294,   295,     0,     0,     0,     0,    58,     0,    43,
-       0,     0,     0,   128,     0,   128,     0,     0,   213,   987,
-     237,   239,   248,     0,   296,     0,   380,     0,     0,     0,
-       0,     0,   792,    46,    47,   298,   299,   300,   301,     0,
-     277,   364,   364,     0,   364,   364,     0,     0,   167,     0,
-       0,     0,   274,     0,     0,     0,   213,     0,     0,     0,
-       0,   213,     0,     0,    88,     0,     0,     0,   508,     0,
-     510,   513,     0,     0,     0,     0,   498,     0,   516,   517,
-       0,   167,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   370,   510,   510,     0,   376,   128,     0,     0,   364,
-     364,     0,     0,     0,   128,     0,   128,   128,     0,     0,
-       0,   128,     0,   128,   128,     0,     0,     0,     0,     0,
-    1033,  1034,  1035,  1036,   213,  1038,     0,     0,     0,     0,
-     510,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1082,     0,     0,   167,     0,   213,     0,     0,     0,
-       0,   237,   239,     0,     0,  1088,   220,     0,     0,   248,
-       0,     0,     0,     0,     0,     0,   510,     0,     0,     0,
-       0,     0,     0,   364,   167,     0,     0,     0,     0,     0,
-       0,     0,     0,   128,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,  1108,     0,     0,     0,   376,
-       0,     0,   213,     0,     0,     0,   167,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   227,     0,     0,     0,
-     213,     0,     0,     0,     0,   213,     0,   213,     0,   525,
-       0,     0,     0,     0,     0,     0,     0,     0,    88,     0,
-       0,   167,  1141,     0,   213,     0,     0,   213,   213,  1149,
-     364,     0,   364,     0,  1153,   213,     0,     0,     0,  1157,
-       0,  1158,     0,     0,     0,  1160,     0,  1161,  1162,   213,
-       0,  1165,     0,     0,     0,     0,   213,     0,     0,   598,
-    1177,     0,     0,     0,   622,   364,     0,     0,     0,     0,
-       0,     0,     0,   364,   364,   364,     0,     0,  1192,  1193,
-       0,     0,     0,     0,   364,   364,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    88,     0,
-       0,     0,     0,     0,     0,  1223,     0,     0,  1225,     0,
-       0,     0,     0,     0,   510,   510,   510,   510,   510,   510,
-     510,   510,   510,   510,   510,   510,   510,   510,   510,   510,
-     510,   510,     0,     0,     0,     0,     0,     0,     0,   364,
-     167,   167,     0,     0,     0,     0,     0,   370,     0,     0,
-       0,  1239,     0,     0,     0,     0,     0,  1243,  1244,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   525,  1255,
-     213,     0,     0,     0,     0,     0,     0,     0,     0,  1262,
-       0,     0,  1266,     0,  1267,     0,     0,  1269,     0,     0,
-       0,     0,     0,     0,     0,     0,   717,     0,   213,     0,
-    1277,     0,     0,   213,     0,     0,     0,     0,   167,   364,
-       0,     0,     0,  1284,     0,  1286,  1287,  1288,  1289,     0,
-     525,     0,   525,     0,     0,   525,     0,   167,   525,     0,
-       0,  1296,     0,  1297,     0,     0,     0,   174,     0,     0,
-     370,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    88,     0,
-       0,   510,     0,     0,     0,    88,  1325,  1326,   128,   128,
-       0,     0,     0,     0,     0,   213,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   213,
-       0,     0,   167,     0,     0,     0,     0,   128,     0,     0,
-     128,   128,     0,   128,   370,   128,   128,     0,   816,   498,
-     128,   128,     0,     0,     0,     0,     0,     0,    88,  1361,
-    1362,     0,     0,     0,   510,     0,     0,     0,     0,  1372,
-       0,     0,     0,     0,   598,     0,     0,     0,     0,   598,
-       0,     0,     0,     0,     0,     0,     0,     0,   370,   370,
-     370,     0,     0,     0,     0,     0,   510,     0,     0,  1022,
-       0,     0,     8,     9,    10,    11,    12,   370,     0,     0,
-       0,     0,     0,     0,   213,     0,     0,     0,     0,     0,
-    1404,     0,   158,     0,     0,     0,   213,     0,     0,   284,
-     285,    31,   286,  1409,     0,  1410,  1411,  1412,     0,   525,
-       0,     0,     0,     0,     0,   213,     0,  1416,     0,     0,
-       0,     0,     0,     0,     0,     0,  1427,     0,   287,    34,
-       0,     0,     0,     0,   288,   370,     0,   941,   289,     0,
-     253,   290,   291,   292,   293,    41,    42,     0,   294,   295,
-     258,     0,     0,  1450,     0,     0,    43,     0,     0,     0,
-       0,   128,   128,     0,     0,     0,     0,     0,     0,     0,
-       0,   296,   717,   380,     0,     0,     0,     0,     0,     0,
-     345,    47,   298,   299,   300,   301,     0,   510,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,  1489,  1490,
-       0,     0,     0,     0,     0,     0,   158,     0,     0,     0,
-       0,  1495,     0,     0,     0,     0,     0,     0,  1495,     0,
-     387,     0,     0,     0,     0,     0,     0,     0,     0,   213,
-     370,     0,   510,     0,   622,     0,     0,     0,   370,     0,
-       0,     0,     0,   419,     0,     0,     0,     0,     0,     0,
-       0,  1529,     0,     0,     0,  1535,     0,   434,     0,     0,
-       0,   213,     0,     0,     0,     0,   439,     0,     0,     0,
-     510,     0,     0,     0,     0,     0,   447,     0,     0,     0,
-       0,     0,     0,   510,  1557,     0,  1558,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   213,     0,     0,
-       0,   465,     0,     0,     0,     0,   475,     0,   213,     0,
-       0,     0,     0,     0,  1573,  1574,     0,     0,     0,   483,
-       0,   128,  1577,  1578,   510,   493,   128,   497,     0,     0,
-       0,     0,     0,     0,   717,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   527,     0,     0,     0,     0,   525,
+      23,    24,    25,     0,     0,    26,    27,    28,    29,     0,
+       0,    30,   283,   284,    31,  1040,  1041,     0,  1042,     0,
+     341,  1043,  1044,  1045,  1046,  1047,  1048,  1049,  1050,     0,
+       0,     0,  1051,     0,     0,     0,  1052,  1053,   364,    33,
+       0,   286,    34,     0,    35,     0,    36,  1054,     0,    38,
+      39,   288,     0,     0,   289,   290,   291,   292,    41,    42,
+       0,   293,   294,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   284,   285,     0,   286,     0,     0,
-       0,     0,     0,   167,     0,     0,     0,     0,     0,     0,
-     213,     0,     0,     0,     0,     0,   586,     0,     0,   370,
-       0,   591,     0,   287,   213,     0,     0,     0,     0,   288,
-       0,   510,     0,   289,     0,     0,   290,   291,   292,   293,
-      41,    42,     0,   294,   295,     0,     0,     0,     0,     0,
-     636,    43,     0,     0,   637,   638,     0,   640,     0,     0,
-       0,     0,   598,     0,   652,   653,   507,   654,   655,     0,
-     656,     0,   657,     0,     0,    46,    47,   298,   299,   300,
-     301,     0,     0,   370,   370,     0,     0,     0,     0,   586,
-       0,     0,     0,     0,   510,   510,     0,   672,     0,     0,
+       0,     0,     0,     0,   295,     0,  1055,   364,   364,   172,
+       0,     0,    45,    46,   297,   298,   299,   300,     0,     0,
+       0,     0,  1056,     0,     0,     0,     0,  -126,     0,     0,
+       0,     0,     1,     2,   207,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,     0,   509,    26,
+      27,    28,    29,     0,     0,    30,   283,   284,    31,   285,
+       0,     0,     0,     0,   509,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   213,     0,     0,     0,
-     128,     0,   683,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   286,    34,     0,    35,     0,
+      36,   287,     0,    38,    39,   288,     0,     0,   289,   290,
+     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   364,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   295,     0,
+      44,     0,     0,     0,   509,   509,    45,    46,   297,   298,
+     299,   300,     0,     2,   207,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
+      27,    28,     0,     0,     0,     0,   283,   284,    31,   285,
+       0,     0,     0,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,  -292,     0,     0,   414,   286,    34,     0,    35,     0,
+      36,   287,    31,    38,    39,   288,     0,     0,   289,   290,
+     291,   292,    41,    42,     0,   293,   294,     0,   414,   414,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   525,     0,     0,     0,     0,   709,     0,
-       0,     0,     0,     0,   712,     0,     0,  -520,     0,   465,
-       1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
+      34,     0,     0,     0,     0,     0,     0,     0,   295,     0,
+     343,  -292,     0,   414,     0,   757,   344,    46,   297,   298,
+     299,   300,     2,   207,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,     0,     0,     0,     0,   283,   284,    31,   285,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
+      27,    28,     0,     0,   286,    34,     0,    35,    31,    36,
+     287,     0,    38,    39,   288,     0,     0,   289,   290,   291,
+     292,    41,    42,     0,   293,   294,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    34,     0,     0,     0,
+       0,   111,     0,    38,    39,     0,     0,   295,     0,   962,
+       0,     0,    41,    42,   757,   344,    46,   297,   298,   299,
+     300,     2,   207,     4,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
-      29,     0,     0,    30,     0,   749,    31,    32,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     768,     0,   717,     0,   213,     0,     0,     0,     0,     0,
-       0,    33,     0,     0,    34,     0,    35,     0,    36,    37,
-       0,    38,    39,    40,     0,     0,     0,     0,     0,     0,
-      41,    42,     0,     0,     0,     0,     0,     0,   795,     0,
-       0,    43,   128,     0,   220,     0,     0,   805,     0,   342,
-     365,     0,     0,     0,   807,     0,    44,     0,    45,     0,
-     815,     0,     0,     0,     0,    46,    47,     0,     0,   829,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   717,     0,   415,     0,     0,     0,     0,     0,     0,
-     415,     0,     0,     0,     0,   510,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     869,     0,     0,   510,     0,     0,     0,     0,     0,     0,
-       0,   284,   285,     0,   286,     0,     0,     0,     0,     0,
-       0,     0,     0,   370,   370,     0,     0,     0,     0,     0,
-       0,     0,   220,     0,     0,     0,   815,     0,     0,     0,
-     287,     0,     0,     0,   911,     0,   288,     0,     0,     0,
-     289,     0,   415,   290,   291,   292,   293,    41,    42,     0,
-     294,   295,     0,     0,     0,     0,     0,     0,    43,     0,
-       0,     0,     0,     0,     0,   253,   510,   510,     0,     0,
-       0,     0,     0,   296,     0,   948,   949,     0,     0,     0,
-       0,     0,    46,    47,   298,   299,   300,   301,     0,   966,
-       0,     0,     0,     0,     0,     0,   415,     0,     0,     0,
-       0,     0,     0,     0,   415,   582,     0,   415,   585,     0,
-     988,     0,   989,     0,     0,     0,   993,     0,   365,     0,
-       0,     0,   614,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   370,     0,
-     213,   632,     0,     0,   342,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,  -295,     0,    26,    27,    28,     0,     0,
-       0,   415,     0,     0,    31,   415,     0,     0,     0,     0,
-       0,  1027,     0,     0,     0,     0,     0,     0,  1028,     0,
-       0,     0,     0,     0,     0,     0,   525,     0,   525,     0,
-       0,  1030,    34,  1031,     0,     0,   365,    37,     0,   337,
-     338,    40,     0,  -295,     0,     0,     0,  1043,    41,    42,
-       0,     0,     0,     0,  1047,     0,     0,     0,     0,    43,
-       0,     0,     0,   525,   322,   525,  1085,     0,     0,  1086,
-       0,     0,     0,     0,   347,     0,   339,     0,     0,     0,
-       0,     0,   415,    46,    47,   365,   383,   383,     0,     0,
-       0,     0,     0,   167,   207,     2,   208,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
-       0,    26,    27,    28,   415,     0,     0,     0,   342,   365,
-      31,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   591,     0,
-       0,     0,     0,     0,     0,     0,     0,   322,    34,     0,
-      35,     0,    36,     0,     0,   209,    39,     0,     0,     0,
-       0,     0,     0,   415,   415,     0,     0,     0,     0,     0,
-       0,   479,     0,     0,  1159,    43,     0,     0,     0,     0,
-       0,     0,   809,   365,     0,     0,     0,     0,     0,     0,
-       0,     0,   210,   614,     0,   614,   614,     0,     0,    46,
-      47,     0,   614,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   848,   365,     0,     0,     0,     0,   365,     0,
-       0,     0,     0,     0,     0,     0,     0,   365,   365,   365,
-       0,     0,   527,     0,     0,     0,     0,     0,  1224,     0,
-       0,     0,     0,     0,     0,     0,   365,     0,     0,     0,
-       0,   415,   891,     0,     0,   415,   894,     0,     0,     0,
-       0,     0,   896,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,  1236,     0,     0,     0,     0,  1238,     0,     0,
-       0,   415,     0,     0,     0,  1242,     0,   383,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   365,   614,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1271,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,  1279,     0,     0,  1280,     0,  1281,     0,
-     342,   365,     0,     0,     0,   415,   415,     0,     0,     0,
-       0,     0,  1290,  1291,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,  1304,     0,     0,     0,     0,     0,
-       0,   711,   284,   285,     0,   286,     0,     0,     0,     0,
-       0,   415,     0,     0,     0,     0,     0,     0,     0,   365,
-       0,     0,     0,     0,     0,     0,   809,   365,     0,     0,
-     614,   287,   614,     0,     0,     0,     0,   288,     0,     0,
-     745,   289,   614,  1345,   290,   291,   292,   293,    41,    42,
-       0,   294,   295,   762,     0,     0,     0,     0,   745,    43,
-       0,   745,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   772,   773,   296,     0,   380,     0,     0,     0,
-       0,   761,     0,    46,    47,   298,   299,   300,   301,     0,
-       0,     0,     0,     0,     0,   794,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   803,     0,     0,     0,     0,
-       0,     0,   347,     0,     0,   809,     0,   762,     0,  1396,
-       0,  1397,   342,   365,   415,     0,   415,     0,     0,     0,
-     415,     0,     0,     0,     0,  1407,     0,  1408,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   614,   614,     0,     0,  1415,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   868,     0,     0,     0,
-       0,  1433,  1435,     0,     0,   383,     0,     0,   365,     0,
-       0,     0,  1440,     0,     0,  1242,     0,     0,   415,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,  -295,  1464,     0,
-     415,  1156,     0,     0,     0,     0,     0,  1471,    31,     0,
-    1473,   365,  1475,  1477,  1479,     0,     0,   415,  1168,     0,
-     614,   614,  1173,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   365,   365,     0,     0,    34,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,  -295,     0,     0,
-       0,     0,     0,     0,  1510,     0,  1512,     0,  1242,     0,
-       0,     0,     0,     0,     0,   762,     0,   972,     0,     0,
-       0,     0,     0,     0,  1524,     0,     0,   983,     0,     0,
-       0,     0,     0,     0,   992,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   415,     0,   415,     0,     0,
-       0,     0,   415,     0,     0,     0,     0,     0,     0,     0,
-       0,   614,     0,     0,     0,     0,     0,     0,     0,  1175,
-       0,     0,     8,     9,    10,    11,    12,  1010,  1011,     0,
-       0,   347,     0,     0,     0,     0,   809,   415,  1258,     0,
-       0,     0,     0,     0,     0,   347,     0,     0,     0,   284,
-     285,    31,   286,     0,     0,     0,     0,     0,     0,     0,
-       0,   365,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   287,    34,
-       0,     0,     0,     0,   288,  1041,     0,     0,   289,   383,
-       0,   290,   291,   292,   293,    41,    42,     0,   294,   295,
-       0,     0,     0,     0,     0,     0,    43,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   296,   342,   380,     0,     0,     0,   347,     0,     0,
-    1176,    47,   298,   299,   300,   301,     0,     0,     0,     0,
-     365,     2,   208,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,     0,   322,    26,    27,    28,
-       0,     0,     0,     0,   284,   285,    31,   286,     0,     0,
-       0,     0,  1132,  1133,     0,     0,     0,     0,     0,     0,
-       0,     0,   365,   365,     0,     0,   383,     0,     0,     0,
-       0,     0,   983,   287,    34,  1147,    35,   745,    36,   288,
-       0,    38,    39,   289,     0,     0,   290,   291,   292,   293,
-      41,    42,     0,   294,   295,     0,     0,     0,  1163,     0,
-       0,    43,     0,     0,     0,     0,     0,     0,     0,  1178,
-       0,   284,   285,     0,   286,     0,   296,     0,   344,     0,
-       0,     0,     0,   761,     0,   345,    47,   298,   299,   300,
-     301,   383,     0,  1196,     0,     0,     0,     0,     0,     0,
-     287,     0,     0,     0,     0,     0,   288,     0,   983,   983,
-     289,     0,     0,   290,   291,   292,   293,    41,    42,     0,
-     294,   295,     0,     0,     0,     0,     0,     0,    43,  1228,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   296,     0,   380,     0,   365,   980,     0,
-       0,     0,    46,    47,   298,   299,   300,   301,     0,     0,
-       0,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+       0,     0,     0,     0,   283,   284,    31,   285,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,   983,     0,    26,    27,
-      28,    29,     0,     0,    30,     0,     0,    31,    32,     0,
-       0,     0,     0,     0,     0,   868,     0,     0,     0,     0,
-       0,   284,   285,     0,   286,     0,     0,     0,     0,     0,
-    1282,  1283,    33,     0,     0,    34,     0,    35,     0,    36,
-      37,     0,    38,    39,    40,     0,     0,   415,     0,     0,
-     287,    41,    42,     0,     0,     0,   288,     0,     0,     0,
-     289,     0,    43,   290,   291,   292,   293,    41,    42,     0,
-     294,   295,   415,   415,     0,     0,     0,    44,    43,    45,
-       0,     0,     0,  -524,     0,     0,    46,    47,     0,     0,
-       0,     0,     0,   296,     0,   380,     0,   415,     0,     0,
-       0,     0,    46,    47,   298,   299,   300,   301,     0,     0,
-     983,     0,     1,     2,   208,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
-      27,    28,    29,     0,     0,    30,   284,   285,    31,  1050,
-    1051,     0,  1052,     0,     0,  1053,  1054,  1055,  1056,  1057,
-    1058,  1059,  1060,     0,     0,     0,  1061,     0,     0,     0,
-    1062,  1063,     0,    33,  1390,   287,    34,   745,    35,     0,
-      36,  1064,     0,    38,    39,   289,     0,     0,   290,   291,
-     292,   293,    41,    42,     0,   294,   295,     0,     0,     0,
-       0,     0,     0,    43,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   296,     0,
-    1065,     0,     0,   173,     0,     0,     0,    46,    47,   298,
-     299,   300,   301,     0,     0,     0,     0,  1066,     0,     0,
-       0,  -130,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,  1449,     0,     0,     0,     0,     0,     0,     1,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,    29,     0,
-       0,    30,   284,   285,    31,   286,     8,     9,    10,    11,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,     0,     0,   286,    34,     0,    35,    31,    36,   287,
+       0,    38,    39,   288,     0,     0,   289,   290,   291,   292,
+      41,    42,     0,   293,   294,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    34,     0,     0,     0,     0,
+       0,     0,    38,    39,     0,     0,   295,     0,   962,     0,
+       0,     0,     0,   757,    45,    46,   297,   298,   299,   300,
+       2,   207,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
       22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
-       0,   287,    34,     0,    35,    31,    36,   288,     0,    38,
-      39,   289,     0,  1516,   290,   291,   292,   293,    41,    42,
-       0,   294,   295,     0,     0,     0,     0,     0,     0,    43,
-       0,     0,     0,    34,     0,     0,     0,     0,   112,     0,
-      38,    39,     0,     0,   296,     0,  1065,     0,     0,    41,
-      42,     0,     0,    46,    47,   298,   299,   300,   301,     0,
-       0,     0,     0,     0,     0,     0,   322,  -130,     1,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,    29,     0,
-       0,    30,   284,   285,    31,   286,     0,     0,     0,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,  -296,     0,     0,
-       0,   287,    34,     0,    35,     0,    36,   288,    31,    38,
-      39,   289,     0,     0,   290,   291,   292,   293,    41,    42,
-       0,   294,   295,     0,     0,     0,     0,     0,     0,    43,
-       0,     0,     0,     0,     0,     0,    34,     0,     0,     0,
-       0,     0,     0,     0,   296,     0,    45,  -296,     0,     0,
-       0,     0,     0,    46,    47,   298,   299,   300,   301,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+       0,     0,     0,   283,   284,    31,   285,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
+       0,     0,   286,    34,     0,    35,    31,    36,   287,     0,
+      38,    39,   288,     0,     0,   289,   290,   291,   292,    41,
+      42,     0,   293,   294,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    34,     0,     0,     0,     0,     0,
+       0,   208,    39,     0,     0,   295,     0,   343,     0,     0,
+       0,     0,     0,   344,    46,   297,   298,   299,   300,     2,
+     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
       23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,   284,   285,    31,   286,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
-       0,   287,    34,     0,    35,    31,    36,   288,     0,    38,
-      39,   289,     0,     0,   290,   291,   292,   293,    41,    42,
-       0,   294,   295,     0,     0,     0,     0,     0,     0,    43,
-       0,     0,     0,    34,     0,     0,     0,     0,     0,     0,
-      38,    39,     0,     0,   296,     0,   971,     0,     0,     0,
-       0,   761,     0,   345,    47,   298,   299,   300,   301,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,   284,   285,    31,   286,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
-       0,   287,    34,     0,    35,    31,    36,   288,     0,    38,
-      39,   289,     0,     0,   290,   291,   292,   293,    41,    42,
-       0,   294,   295,     0,     0,     0,     0,     0,     0,    43,
-       0,     0,     0,    34,     0,     0,     0,     0,     0,     0,
-     209,    39,     0,     0,   296,     0,   971,     0,     0,     0,
-       0,   761,     0,    46,    47,   298,   299,   300,   301,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,   284,   285,    31,   286,     0,     0,     0,     0,
+       0,     0,   283,   284,    31,   285,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   287,    34,     0,    35,     0,    36,   288,     0,    38,
-      39,   289,     0,     0,   290,   291,   292,   293,    41,    42,
-       0,   294,   295,     0,     0,     0,     0,     0,     0,    43,
+       0,   286,    34,     0,    35,     0,    36,   287,     0,   208,
+      39,   288,     0,     0,   289,   290,   291,   292,    41,    42,
+       0,   293,   294,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   296,     0,   344,     0,     0,     0,
-       0,     0,     0,   345,    47,   298,   299,   300,   301,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,   284,   285,    31,   286,     0,     0,     0,     0,
+       0,     0,     0,     0,   295,     0,   997,     0,     0,     0,
+       0,     0,   998,    46,   297,   298,   299,   300,     2,   207,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
+       0,   283,   284,    31,   285,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   287,    34,     0,    35,     0,    36,   288,     0,   209,
-      39,   289,     0,     0,   290,   291,   292,   293,    41,    42,
-       0,   294,   295,     0,     0,     0,     0,     0,     0,    43,
+     286,    34,     0,    35,     0,    36,   287,     0,    38,    39,
+     288,     0,     0,   289,   290,   291,   292,    41,    42,     0,
+     293,   294,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   296,     0,  1007,     0,     0,     0,
-       0,     0,     0,  1008,    47,   298,   299,   300,   301,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,   284,   285,    31,   286,     0,     0,     0,     0,
+       0,     0,     0,   295,     0,   962,     0,     0,     0,     0,
+       0,   344,    46,   297,   298,   299,   300,     2,   207,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
+     283,   284,    31,   285,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   286,
+      34,     0,    35,     0,    36,   287,     0,   208,    39,   288,
+       0,     0,   289,   290,   291,   292,    41,    42,     0,   293,
+     294,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   287,    34,     0,    35,     0,    36,   288,     0,    38,
-      39,   289,     0,     0,   290,   291,   292,   293,    41,    42,
-       0,   294,   295,     0,     0,     0,     0,     0,     0,    43,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   296,     0,   971,     0,     0,     0,
-       0,     0,     0,   345,    47,   298,   299,   300,   301,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,   284,   285,    31,   286,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   287,    34,     0,    35,     0,    36,   288,     0,   209,
-      39,   289,     0,     0,   290,   291,   292,   293,    41,    42,
-       0,   294,   295,     0,     0,     0,     0,     0,     0,    43,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   296,     0,   380,     0,     0,     0,
-       0,     0,     0,    46,    47,   298,   299,   300,   301,     1,
+       0,     0,   295,     0,   379,     0,     0,     0,     0,     0,
+      45,    46,   297,   298,   299,   300,  -515,     0,     0,     1,
        2,     3,     4,     5,     6,     7,     8,     9,    10,    11,
       12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
@@ -2547,66 +2529,321 @@
       38,    39,    40,     0,     0,     0,     0,     0,     0,    41,
       42,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      43,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    44,     0,    45,     0,     0,
-       0,     0,     0,     0,    46,    47,   207,     2,   208,     4,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    43,     0,    44,     0,     0,
+       0,     0,     0,    45,    46,     1,     2,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,    29,     0,     0,    30,     0,
+       0,    31,    32,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    33,     0,     0,    34,
+       0,    35,     0,    36,    37,     0,    38,    39,    40,     0,
+       0,     0,     0,     0,     0,    41,    42,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    43,     0,    44,     0,     0,     0,  -519,     0,    45,
+      46,     1,     2,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,    29,     0,     0,    30,     0,     0,    31,    32,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    33,     0,     0,    34,     0,    35,     0,    36,
+      37,     0,    38,    39,    40,     0,     0,     0,     0,     0,
+       0,    41,    42,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    43,     0,    44,
+       0,     0,     0,     0,     0,    45,    46,     1,     2,   207,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,     0,    26,    27,    28,    29,     0,     0,
+      30,     0,     0,    31,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    34,     0,    35,     0,    36,     0,     0,    38,    39,
+       0,     2,   207,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
+       0,     0,     0,     0,     0,    44,    31,     0,     0,     0,
+       0,    45,    46,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    34,     0,    35,     0,    36,    37,
+       0,   208,    39,    40,     0,     0,     0,     0,     0,     0,
+      41,    42,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    43,     0,   209,     0,
+       0,     0,     0,     0,    45,    46,     2,   207,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,     0,    26,    27,    28,     0,     0,     0,     0,     0,
+       0,    31,     0,     0,     0,     0,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,     0,    26,    27,    28,    34,
+       0,    35,     0,    36,     0,    31,    38,    39,     0,     2,
+     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    34,     0,    26,    27,    28,     0,     0,
+      38,    39,  -399,   677,    31,     0,     0,     0,     0,    45,
+      46,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    34,     0,    35,   634,    36,   338,     0,    38,
+      39,     0,     0,    45,    46,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,  1350,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   677,     0,     0,     0,
+       0,     0,    45,    46,     2,   207,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,     0,     0,     0,     0,     0,    31,
+       0,     0,     0,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,    34,     0,    35,
+       0,    36,    31,   684,    38,    39,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,  1352,     0,     0,     0,
+      34,     0,     0,     0,     0,     0,     0,    38,    39,     0,
+       0,   677,     0,     0,     0,     0,     0,    45,    46,     2,
+     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,   685,    26,    27,    28,  1091,     0,
+      45,    46,     0,     0,    31,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    34,     0,    35,     0,    36,     0,     0,   208,
+      39,     0,     2,   207,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,     0,     0,     0,     0,     0,   271,    31,     0,     0,
+       0,     0,    45,    46,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    34,     0,    35,     0,    36,
+       0,     0,    38,    39,     0,     2,   207,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
+       0,    26,    27,    28,     0,     0,     0,     0,     0,   677,
+      31,     0,     0,     0,     0,    45,    46,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    34,     0,
+      35,     0,    36,     0,     0,    38,    39,     0,     2,   207,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
+       0,     0,   592,    31,     0,     0,     0,     0,    45,    46,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    34,     0,    35,     0,    36,     0,     0,   208,    39,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,     0,     0,     0,   283,   284,    31,
+     285,     0,     0,     0,     0,   209,     0,     0,     0,     0,
+       0,    45,    46,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   286,    34,     0,     0,
+       0,     0,   287,     0,    38,    39,   288,     0,     0,   289,
+     290,   291,   292,    41,    42,     0,   293,   294,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   295,
+       0,   517,     0,     0,   172,     0,     0,    45,    46,   297,
+     298,   299,   300,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
+     283,   284,    31,   285,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,     0,    26,    27,    28,     0,     0,   286,
+      34,     0,     0,    31,     0,   287,     0,    38,    39,   288,
+       0,     0,   289,   290,   291,   292,    41,    42,     0,   293,
+     294,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    34,     0,     0,     0,     0,    37,     0,   336,   337,
+      40,     0,   295,   -35,   296,     0,     0,    41,    42,     0,
+      45,    46,   297,   298,   299,   300,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,   338,    26,    27,    28,     0,
+       0,    45,    46,   283,   284,    31,   285,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
+       0,     0,   286,    34,     0,     0,    31,     0,   287,     0,
+      38,    39,   288,     0,     0,   289,   290,   291,   292,    41,
+      42,     0,   293,   294,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    34,     0,     0,     0,     0,   111,
+       0,    38,    39,     0,     0,   295,     0,   296,     0,     0,
+      41,    42,     0,    45,    46,   297,   298,   299,   300,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,     0,    44,    26,
+      27,    28,     0,     0,    45,    46,   283,   284,    31,   285,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,     0,   286,    34,     0,     0,    31,
+     684,   287,     0,    38,    39,   288,     0,     0,   289,   290,
+     291,   292,    41,    42,     0,   293,   294,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    34,     0,     0,
+       0,     0,     0,     0,    38,    39,     0,     0,   295,     0,
+     158,     0,     0,     0,     0,     0,    45,    46,   297,   298,
+     299,   300,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,   685,    26,    27,    28,  1220,     0,    45,    46,   283,
+     284,    31,   285,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,     0,     0,    26,    27,    28,     0,     0,   286,    34,
+       0,     0,    31,     0,   287,     0,    38,    39,   288,     0,
+       0,   289,   290,   291,   292,    41,    42,     0,   293,   294,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      34,     0,     0,     0,     0,     0,     0,    38,    39,     0,
+       0,   295,     0,   592,     0,     0,     0,     0,     0,    45,
+      46,   297,   298,   299,   300,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,   258,    26,    27,    28,     0,     0,
+      45,    46,   283,   284,    31,   285,     0,     0,     0,     0,
+       0,     0,     0,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,   286,    34,    26,    27,    28,     0,   287,     0,    38,
+      39,   288,    31,     0,   289,   290,   291,   292,    41,    42,
+       0,   293,   294,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+      34,     0,     0,     0,   295,     0,   379,    38,    39,     0,
+       0,     0,    45,    46,   297,   298,   299,   300,   467,     2,
+     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,   158,    26,    27,    28,     0,     0,
+      45,    46,     0,     0,    31,     0,     0,     0,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,     0,    34,     0,    35,     0,    36,    31,     0,    38,
+      39,     0,     0,     0,     0,     0,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,     0,    34,    26,    27,    28,     0,
+      37,     0,    38,    39,    40,    31,     0,     0,     0,    -3,
+       0,    41,    42,     0,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,     0,    34,    26,    27,    28,    43,    37,   158,
+      38,    39,    40,    31,     0,    45,    46,     0,     0,    41,
+      42,     0,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+       0,    34,    26,    27,    28,    43,    37,    44,   208,    39,
+      40,    31,     0,    45,    46,     0,     0,    41,    42,     0,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,  -291,    34,
+      26,    27,    28,    43,    37,   271,   336,   337,    40,    31,
+       0,    45,    46,     0,     0,    41,    42,     0,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,  -291,    34,    26,    27,
+      28,   634,     0,   338,    38,    39,     0,    31,  -291,    45,
+      46,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
+       0,    26,    27,    28,     0,    34,     0,     0,     0,   634,
+      31,   338,    38,    39,     0,     0,  -291,    45,    46,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,     0,    34,    26,
+      27,    28,     0,     0,     0,   208,    39,     0,    31,   338,
+       0,     0,     0,     0,     0,    45,    46,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,    34,    26,    27,    28,
+       0,     0,   271,    38,    39,     0,    31,     0,    45,    46,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
+      26,    27,    28,     0,    34,     0,     0,     0,     0,    31,
+     338,    38,    39,     0,     0,     0,    45,    46,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,    34,    26,    27,
+      28,     0,     0,     0,    38,    39,     0,    31,   685,     0,
+       0,     0,     0,     0,    45,    46,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    34,     0,     0,     0,     0,
+       0,   592,    38,    39,     0,     0,     0,    45,    46,     2,
+     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,     0,     0,    26,    27,    28,     0,    44,
+       0,     0,     0,     0,    31,    45,    46,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    34,     0,    35,     0,    36,     0,     0,    38,
+      39,   283,   284,     0,   285,  1041,     0,  1042,     0,     0,
+    1043,  1044,  1045,  1046,  1047,  1048,  1049,  1050,     0,     0,
+    1524,  1051,     0,     0,     0,  1052,  1053,     0,    33,     0,
+     286,     0,     0,     0,     0,  -412,  1054,     0,     0,     0,
+     288,     0,     0,   289,   290,   291,   292,    41,    42,     0,
+     293,   294,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   295,     0,   379,     0,     0,   172,     0,
+       0,    45,    46,   297,   298,   299,   300,     0,     0,   283,
+     284,  1056,   285,  1041,     0,  1042,  -126,     0,  1043,  1044,
+    1045,  1046,  1047,  1048,  1049,  1050,     0,     0,     0,  1051,
+       0,     0,     0,  1052,  1053,     0,    33,     0,   286,     0,
+       0,     0,     0,     0,  1054,     0,     0,     0,   288,     0,
+       0,   289,   290,   291,   292,    41,    42,     0,   293,   294,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   295,     0,   379,     0,     0,   172,     0,     0,    45,
+      46,   297,   298,   299,   300,     0,     0,     0,     0,  1056,
+       0,     0,     0,     0,  -126,     2,   207,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
+       0,    26,    27,    28,     0,     0,     0,     0,     0,     0,
+      31,     0,   283,   284,     0,   285,  1041,     0,  1042,  1398,
+    1399,  1043,  1044,  1045,  1046,  1047,  1048,  1049,  1050,     0,
+       0,  1524,  1051,     0,     0,     0,  1052,  1053,    34,    33,
+      35,   286,    36,     0,     0,    38,    39,  1054,     0,     0,
+       0,   288,     0,     0,   289,   290,   291,   292,    41,    42,
+       0,   293,   294,     0,     0,     0,     0,  1311,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   295,     0,   379,     0,     0,   172,
+       0,     0,    45,    46,   297,   298,   299,   300,     0,     0,
+     283,   284,  1056,   285,  1041,     0,  1042,  1398,  1399,  1043,
+    1044,  1045,  1046,  1047,  1048,  1049,  1050,     0,     0,     0,
+    1051,     0,     0,     0,  1052,  1053,     0,    33,     0,   286,
+       0,     0,     0,     0,     0,  1054,     0,     0,     0,   288,
+       0,     0,   289,   290,   291,   292,    41,    42,     0,   293,
+     294,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   295,     0,   379,     0,     0,   172,     0,     0,
+      45,    46,   297,   298,   299,   300,     0,     0,   283,   284,
+    1056,   285,  1041,     0,  1042,     0,     0,  1043,  1044,  1045,
+    1046,  1047,  1048,  1049,  1050,     0,     0,     0,  1051,     0,
+       0,     0,  1052,  1053,     0,    33,     0,   286,     0,     0,
+       0,     0,     0,  1054,     0,     0,     0,   288,     0,     0,
+     289,   290,   291,   292,    41,    42,     0,   293,   294,     0,
+       0,     0,     0,     0,     0,   283,   284,     0,   285,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     295,     0,   379,     0,     0,   172,     0,     0,    45,    46,
+     297,   298,   299,   300,   286,     0,     0,     0,  1056,     0,
+     640,     0,   140,   141,   288,     0,     0,   289,   290,   291,
+     292,    41,    42,     0,   293,   294,     0,     0,     0,     0,
+       0,     0,   283,   284,     0,   285,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   295,     0,   641,
+       0,   642,   380,     0,     0,    45,    46,   297,   298,   299,
+     300,   286,     0,     0,     0,     0,     0,   287,     0,     0,
+       0,   288,     0,     0,   289,   290,   291,   292,    41,    42,
+       0,   293,   294,     0,     0,     0,     0,     0,     0,   283,
+     284,     0,   285,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   295,     0,   379,     0,   283,   284,
+       0,   285,   708,    46,   297,   298,   299,   300,   286,     0,
+       0,     0,     0,     0,   287,     0,     0,     0,   288,     0,
+       0,   289,   290,   291,   292,    41,    42,   286,   293,   294,
+       0,     0,     0,   287,     0,     0,     0,   288,     0,     0,
+     289,   290,   291,   292,    41,    42,     0,   293,   294,     0,
+       0,   295,     0,   379,     0,   283,   284,     0,   285,   344,
+      46,   297,   298,   299,   300,     0,     0,     0,     0,     0,
+     506,     0,     0,     0,   283,   284,     0,   285,    45,    46,
+     297,   298,   299,   300,   286,     0,     0,     0,     0,     0,
+     287,     0,     0,     0,   288,     0,     0,   289,   290,   291,
+     292,    41,    42,   286,   293,   294,     0,     0,     0,   287,
+       0,     0,     0,   288,     0,     0,   289,   290,   291,   292,
+      41,    42,     0,   293,   294,     0,     0,   295,     0,     0,
+       0,   283,   284,     0,   285,    45,    46,   297,   298,   299,
+     300,     0,     0,     0,     0,     0,   511,     0,     0,     0,
+       0,     0,     0,     0,    45,    46,   297,   298,   299,   300,
+     286,     0,     0,     0,     0,     0,   287,     0,     0,     0,
+     288,     0,     0,   289,   290,   291,   292,    41,    42,     0,
+     293,   294,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   514,     0,     0,     0,     0,     0,     0,
+       0,    45,    46,   297,   298,   299,   300,     2,   207,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-       0,     0,    31,     0,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,   486,   487,   488,
-      34,     0,    35,    31,    36,    37,     0,   209,    39,    40,
-       0,     0,     0,     0,     0,     0,    41,    42,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-       0,    34,     0,     0,     0,     0,     0,     0,    38,    39,
-       0,     0,    44,     0,   210,     0,     0,     0,     0,     0,
-       0,    46,    47,     1,     2,   208,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,  -295,     0,
-      26,    27,    28,    29,     0,     0,    30,     0,     0,    31,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    34,     0,    35,
-       0,    36,     0,     0,    38,    39,     0,     0,  -295,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    43,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    45,     0,     0,     0,     0,     0,     0,    46,    47,
-       1,     2,   208,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
-      29,     0,     0,    30,     0,     0,    31,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    34,     0,    35,     0,    36,     0,
-       0,    38,    39,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    43,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    45,     0,
-       0,     0,     0,     0,     0,    46,    47,     2,   208,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
+      25,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,    31,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      34,     0,    35,     0,    36,    37,     0,   209,    39,    40,
-       0,     0,     0,     0,     0,     0,    41,    42,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    44,     0,   210,     0,     0,     0,     0,     0,
-       0,    46,    47,     2,   208,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
-      27,    28,     0,     0,     0,     0,     0,     0,    31,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    34,     0,    35,     0,
-      36,     0,     0,    38,    39,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    43,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,  -403,
-     679,     0,     0,     0,     0,     0,     0,    46,    47,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      34,     0,    35,     0,    36,    37,     0,   175,   176,    40,
+       0,     0,     0,     0,     0,     0,    41,    42,   206,     2,
+     207,     4,     5,     6,     7,     8,     9,    10,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
       23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
@@ -2614,391 +2851,27 @@
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    34,     0,    35,     0,    36,     0,     0,    38,
-      39,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    43,
-       0,  1369,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   679,     0,     0,     0,
-       0,     0,     0,    46,    47,     2,   208,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
-       0,    26,    27,    28,     0,     0,     0,     0,     0,     0,
-      31,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    34,     0,
-      35,     0,    36,     0,     0,    38,    39,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    43,     0,  1371,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   679,     0,     0,     0,     0,     0,     0,    46,
-      47,     2,   208,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
-       0,     0,     0,     0,     0,     0,    31,     0,     0,     0,
+       0,     0,    34,     0,    35,     0,    36,     0,     0,   208,
+      39,   467,     2,   207,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,     0,     0,     0,     0,     0,     0,    31,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    34,     0,    35,     0,    36,     0,
-       0,   209,    39,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    43,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   272,     0,
-       0,     0,     0,     0,     0,    46,    47,     2,   208,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-       0,     0,    31,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      34,     0,    35,     0,    36,     0,     0,    38,    39,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   679,     0,     0,     0,     0,     0,
-       0,    46,    47,     2,   208,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
-      27,    28,     0,     0,     0,     0,     0,     0,    31,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    34,     0,    35,     0,
-      36,     0,     0,    38,    39,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,    43,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     593,     0,     0,     0,     0,     0,     0,    46,    47,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,     0,     0,    31,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    34,     0,    35,     0,    36,     0,     0,   209,
-      39,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    43,
-       0,    26,    27,    28,     0,     0,     0,     0,   284,   285,
-      31,   286,     0,     0,     0,     0,   210,     0,     0,     0,
-       0,     0,     0,    46,    47,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   287,    34,     0,
-       0,     0,     0,   288,     0,    38,    39,   289,     0,     0,
-     290,   291,   292,   293,    41,    42,     0,   294,   295,     0,
-       0,     0,     0,     0,     0,    43,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     296,     0,   518,     0,     0,   173,     0,     0,     0,    46,
-      47,   298,   299,   300,   301,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,   284,   285,    31,   286,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   287,    34,     0,     0,     0,     0,   641,     0,    38,
-      39,   289,     0,     0,   290,   291,   292,   293,    41,    42,
-       0,   294,   295,     0,     0,     0,     0,     0,     0,    43,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   296,   -35,   742,     0,     0,     0,
-       0,     0,     0,    46,    47,   298,   299,   300,   301,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,     0,     0,    26,
-      27,    28,     0,     0,     0,     0,   284,   285,    31,   286,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   287,    34,     0,     0,     0,
-       0,   288,     0,    38,    39,   289,     0,     0,   290,   291,
-     292,   293,    41,    42,     0,   294,   295,     0,     0,     0,
-       0,     0,     0,    43,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   296,     0,
-     297,     0,     0,     0,     0,     0,     0,    46,    47,   298,
-     299,   300,   301,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-     284,   285,    31,   286,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   287,
-      34,     0,     0,     0,     0,   288,     0,    38,    39,   289,
-       0,     0,   290,   291,   292,   293,    41,    42,     0,   294,
-     295,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   296,     0,   159,     0,     0,     0,     0,     0,
-       0,    46,    47,   298,   299,   300,   301,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,     0,     0,    26,    27,    28,
-       0,     0,     0,     0,   284,   285,    31,   286,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   287,    34,     0,     0,     0,     0,   288,
-       0,    38,    39,   289,     0,     0,   290,   291,   292,   293,
-      41,    42,     0,   294,   295,     0,     0,     0,     0,     0,
-       0,    43,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   296,     0,   593,     0,
-       0,     0,     0,     0,     0,    46,    47,   298,   299,   300,
-     301,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
-       0,    26,    27,    28,     0,     0,     0,     0,   284,   285,
-      31,   286,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   287,    34,     0,
-       0,     0,     0,   288,     0,    38,    39,   289,     0,     0,
-     290,   291,   292,   293,    41,    42,     0,   294,   295,     0,
-       0,     0,     0,     0,     0,    43,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     296,     0,   380,     0,     0,     0,     0,     0,     0,    46,
-      47,   298,   299,   300,   301,   468,     2,   208,     4,     5,
-       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-       0,     0,    26,    27,    28,     0,     0,     0,     0,     0,
-       0,    31,     0,     0,     0,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,    34,
-       0,    35,     0,    36,    31,     0,    38,    39,     0,     0,
-       0,     0,     0,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,    34,    26,    27,    28,     0,    37,     0,    38,
-      39,    40,    31,     0,     0,     0,    -3,     0,    41,    42,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    43,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      34,     0,     0,     0,    44,    37,   159,    38,    39,    40,
-       0,     0,     0,    46,    47,     0,    41,    42,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    44,     0,    45,     0,     0,     0,     0,     0,
-       0,    46,    47,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-       0,     0,    31,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-      34,     0,    31,     0,     0,    37,     0,   209,    39,    40,
-       0,     0,     0,     0,     0,     0,    41,    42,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-      34,     0,     0,     0,     0,    37,     0,   337,   338,    40,
-       0,     0,    44,     0,   272,     0,    41,    42,     0,     0,
-       0,    46,    47,     0,     0,     0,     0,    43,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   635,     0,   339,     0,     0,     0,     0,     0,
-       0,    46,    47,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-       0,     0,    31,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-      34,     0,    31,     0,     0,    37,     0,   337,   338,    40,
-       0,     0,     0,     0,     0,     0,    41,    42,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-      34,     0,     0,     0,     0,   112,     0,    38,    39,     0,
-       0,     0,     0,     0,   339,     0,    41,    42,     0,     0,
-       0,    46,    47,     0,     0,     0,     0,    43,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    45,     0,     0,     0,     0,     0,
-       0,    46,    47,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,  -295,     0,    26,    27,    28,     0,     0,     0,     0,
-       0,     0,    31,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-      34,     0,    31,   686,     0,     0,     0,    38,    39,     0,
-       0,  -295,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-      34,     0,     0,     0,     0,     0,     0,    38,    39,     0,
-       0,     0,   635,     0,   339,     0,     0,     0,     0,     0,
-       0,    46,    47,     0,     0,     0,     0,    43,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   687,     0,     0,     0,   688,     0,
-       0,    46,    47,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,  -295,     0,    26,    27,    28,     0,     0,     0,     0,
-       0,     0,    31,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-      34,     0,    31,   686,     0,     0,     0,    38,    39,     0,
-       0,  -295,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-      34,     0,     0,     0,     0,     0,     0,    38,    39,     0,
-       0,     0,     0,     0,   339,     0,     0,     0,     0,     0,
-       0,    46,    47,     0,     0,     0,     0,    43,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   687,     0,     0,     0,  1101,     0,
-       0,    46,    47,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-       0,     0,    31,   686,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-      34,     0,     0,    31,     0,     0,     0,    38,    39,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    43,     0,     0,
-       0,    34,     0,     0,     0,     0,     0,     0,    38,    39,
-       0,     0,     0,     0,   687,     0,     0,     0,  1233,     0,
-       0,    46,    47,     0,     0,     0,     0,     0,    43,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   635,     0,   339,     0,     0,     0,     0,
-       0,     0,    46,    47,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,     0,     0,    31,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,    34,     0,    31,     0,     0,     0,     0,    38,    39,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    43,     0,
-       0,    34,     0,     0,     0,     0,     0,     0,    38,    39,
-       0,     0,     0,     0,     0,   259,     0,     0,     0,     0,
-       0,     0,    46,    47,     0,     0,     0,     0,    43,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   159,     0,     0,     0,     0,
-       0,     0,    46,    47,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,     0,     0,    31,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,    34,     0,    31,     0,     0,     0,     0,   209,    39,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    43,     0,
-       0,    34,     0,     0,     0,     0,     0,     0,    38,    39,
-       0,     0,     0,     0,     0,   272,     0,     0,     0,     0,
-       0,     0,    46,    47,     0,     0,     0,     0,    43,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   339,     0,     0,     0,     0,
-       0,     0,    46,    47,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,     0,     0,    31,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,    34,     0,    31,     0,     0,     0,     0,    38,    39,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    43,     0,
-       0,    34,     0,     0,     0,     0,     0,     0,    38,    39,
-       0,     0,     0,     0,     0,   687,     0,     0,     0,     0,
-       0,     0,    46,    47,     0,     0,     0,     0,    43,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   593,     0,     0,     0,     0,
-       0,     0,    46,    47,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,     0,     0,    31,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,     0,     0,    26,    27,    28,     0,     0,     0,
-       0,    34,     0,    31,     0,     0,     0,     0,    38,    39,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,    43,     0,
-       0,    34,     0,     0,     0,     0,     0,     0,   209,    39,
-       0,     0,     0,     0,     0,    45,     0,     0,     0,     0,
-       0,     0,    46,    47,     0,     0,     0,     0,    43,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    46,    47,     2,   208,     4,     5,     6,     7,
+       0,     0,     0,     0,     0,    34,     0,    35,     0,    36,
+       0,     0,    38,    39,     2,   207,     4,     5,     6,     7,
        8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
       18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
       26,    27,    28,     0,     0,     0,     0,     0,     0,    31,
-       0,   284,   285,     0,   286,  1051,     0,  1052,     0,     0,
-    1053,  1054,  1055,  1056,  1057,  1058,  1059,  1060,     0,     0,
-    1549,  1061,     0,     0,     0,  1062,  1063,    34,    33,    35,
-     287,    36,     0,     0,    38,    39,  1064,     0,     0,     0,
-     289,     0,     0,   290,   291,   292,   293,    41,    42,     0,
-     294,   295,     0,     0,     0,     0,     0,     0,    43,     0,
+       0,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,     0,
+       0,    26,    27,    28,   485,   486,   487,    34,     0,    35,
+      31,    36,     0,     0,   208,    39,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-    -416,     0,     0,   296,     0,   380,     0,     0,   173,     0,
-       0,     0,    46,    47,   298,   299,   300,   301,     0,     0,
-       0,     0,  1066,     0,   284,   285,  -130,   286,  1051,     0,
-    1052,     0,     0,  1053,  1054,  1055,  1056,  1057,  1058,  1059,
-    1060,     0,     0,     0,  1061,     0,     0,     0,  1062,  1063,
-       0,    33,     0,   287,     0,     0,     0,     0,     0,  1064,
-       0,     0,     0,   289,     0,     0,   290,   291,   292,   293,
-      41,    42,     0,   294,   295,     0,     0,     0,     0,     0,
-       0,    43,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   296,     0,   380,     0,
-       0,   173,     0,     0,     0,    46,    47,   298,   299,   300,
-     301,     0,     0,     0,     0,  1066,     0,     0,     0,  -130,
-       2,   208,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,     0,     0,    26,    27,    28,     0,
-       0,     0,     0,     0,     0,    31,     0,   284,   285,     0,
-     286,  1051,     0,  1052,  1419,  1420,  1053,  1054,  1055,  1056,
-    1057,  1058,  1059,  1060,     0,     0,  1549,  1061,     0,     0,
-       0,  1062,  1063,    34,    33,    35,   287,    36,     0,     0,
-      38,    39,  1064,     0,     0,     0,   289,     0,     0,   290,
-     291,   292,   293,    41,    42,     0,   294,   295,     0,     0,
-       0,     0,  1327,     0,    43,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   296,
-       0,   380,     0,     0,   173,     0,     0,     0,    46,    47,
-     298,   299,   300,   301,     0,     0,   284,   285,  1066,   286,
-    1051,     0,  1052,  1419,  1420,  1053,  1054,  1055,  1056,  1057,
-    1058,  1059,  1060,     0,     0,     0,  1061,     0,     0,     0,
-    1062,  1063,     0,    33,     0,   287,     0,     0,     0,     0,
-       0,  1064,     0,     0,     0,   289,     0,     0,   290,   291,
-     292,   293,    41,    42,     0,   294,   295,     0,     0,     0,
-       0,     0,     0,    43,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   296,     0,
-     380,     0,     0,   173,     0,     0,     0,    46,    47,   298,
-     299,   300,   301,     0,     0,   284,   285,  1066,   286,  1051,
-       0,  1052,     0,     0,  1053,  1054,  1055,  1056,  1057,  1058,
-    1059,  1060,     0,     0,     0,  1061,     0,     0,     0,  1062,
-    1063,     0,    33,     0,   287,     0,     0,     0,     0,     0,
-    1064,     0,     0,     0,   289,     0,     0,   290,   291,   292,
-     293,    41,    42,     0,   294,   295,     0,     0,     0,     0,
-       0,     0,    43,   284,   285,     0,   286,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   296,     0,   380,
-       0,     0,   173,     0,     0,     0,    46,    47,   298,   299,
-     300,   301,   287,     0,     0,     0,  1066,     0,   641,     0,
-     141,   142,   289,     0,     0,   290,   642,   292,   293,    41,
-      42,     0,   294,   295,     0,     0,     0,     0,     0,     0,
-      43,   284,   285,     0,   286,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   296,     0,   643,     0,   644,
-     381,     0,     0,     0,    46,    47,   298,   299,   300,   301,
-     287,     0,     0,     0,     0,     0,   288,     0,     0,     0,
-     289,     0,     0,   290,   291,   292,   293,    41,    42,     0,
-     294,   295,     0,     0,     0,     0,     0,     0,    43,   284,
-     285,     0,   286,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   296,     0,   380,     0,     0,   284,   285,
-       0,   286,   710,    47,   298,   299,   300,   301,   287,     0,
-       0,     0,     0,     0,   641,     0,     0,     0,   289,     0,
-       0,   290,   291,   292,   293,    41,    42,   287,   294,   295,
-       0,     0,     0,   288,     0,     0,    43,   289,     0,     0,
-     290,   291,   292,   293,    41,    42,     0,   294,   295,     0,
-       0,   296,     0,   765,     0,    43,   284,   285,     0,   286,
-      46,    47,   298,   299,   300,   301,     0,     0,     0,     0,
-     296,     0,   380,     0,     0,   284,   285,     0,   286,   345,
-      47,   298,   299,   300,   301,   287,     0,     0,     0,     0,
-       0,   288,     0,     0,     0,   289,     0,     0,   290,   291,
-     292,   293,    41,    42,   287,   294,   295,     0,     0,     0,
-     288,     0,     0,    43,   289,     0,     0,   290,   291,   292,
-     293,    41,    42,     0,   294,   295,     0,     0,   512,     0,
-       0,     0,    43,     0,     0,     0,     0,    46,    47,   298,
-     299,   300,   301,     0,     0,     0,     0,   515,     0,     0,
-       0,     0,     0,     0,     0,     0,    46,    47,   298,   299,
-     300,   301,     2,   208,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    31,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    34,     0,    35,     0,    36,
-      37,     0,   176,   177,    40,     0,     0,     0,     0,     0,
-       0,    41,    42,   207,     2,   208,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,     0,     0,
-      26,    27,    28,     0,     0,     0,     0,     0,     0,    31,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    34,     0,    35,
-       0,    36,     0,     0,   209,    39,   468,     2,   208,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,     0,     0,    26,    27,    28,     0,     0,     0,     0,
-       0,     0,    31,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      34,     0,    35,     0,    36,     0,     0,    38,    39,     2,
-     208,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,     0,     0,    26,    27,    28,     0,     0,
-       0,     0,     0,     0,    31,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    34,     0,    35,     0,    36,     0,     0,   209,
-      39
+       0,     0,     0,     0,     0,     0,     0,     0,    34,     0,
+       0,     0,     0,     0,     0,    38,    39
 };
 
 #define yypact_value_is_default(yystate) \
-  ((yystate) == (-1414))
+  ((yystate) == (-1310))
 
 #define yytable_value_is_error(yytable_value) \
@@ -3007,706 +2880,700 @@
 static const yytype_int16 yycheck[] =
 {
-       0,     1,    44,   187,   187,   535,   187,     0,    44,   753,
-     187,    44,   206,   241,   648,   187,   522,   753,   188,   881,
-       1,   753,   107,   221,   118,   187,   187,   514,   621,   170,
-     171,   350,    32,     0,   986,   760,     0,   189,   603,    32,
-     350,   601,   601,   493,    44,   188,   281,   497,    44,   993,
-      50,    39,  1337,   604,    44,  1419,   603,    50,    44,   610,
-     601,   572,    51,    32,    64,    32,    72,    67,    32,    82,
-      70,    64,   157,   601,    67,    95,  1050,    70,    39,   346,
-     419,    44,    45,   267,   267,  1031,   267,   694,   601,    70,
-     267,    63,   107,   601,    50,   267,   296,   110,   268,  1043,
-     439,  1062,  1063,   601,   117,   267,   267,   107,   447,   203,
-     130,   263,   264,  1526,    39,   115,   131,    82,   118,   119,
-     109,   109,    67,   111,    39,   268,   132,    64,   483,  1493,
-      72,  1030,  1031,  1546,    39,    44,    45,    39,   365,    84,
-    1553,   735,   369,   636,   637,   187,   427,   428,   148,   149,
-     111,   187,   115,   881,   187,  1440,   149,   157,   158,   115,
-     132,   654,   162,   635,   636,   637,     0,   258,   912,   162,
-     489,    28,   109,    39,   119,    82,   912,     0,     1,  1140,
-     912,   112,   654,   689,   109,   116,   111,   187,   188,    72,
-     132,   187,   148,   110,   109,   188,   111,   187,    32,   116,
-       0,   187,    82,   203,   109,   114,   111,   720,    82,    32,
-     117,   211,   720,   411,   495,    96,   483,   162,   211,   712,
-      82,    78,   720,   223,     0,   267,    58,   427,   428,   109,
-     223,   267,    32,   514,   267,   118,   110,   407,   115,   116,
-     712,   241,   123,   109,    67,   111,    85,    70,   109,   111,
-     111,   109,    67,   253,   131,   211,    32,   342,   818,   818,
-     253,   261,   109,  1423,   407,   830,   266,   267,   268,   820,
-       1,   996,   283,   273,   113,   268,   108,   818,   223,   111,
-     635,   636,   637,   830,   253,   241,   253,   372,   799,   253,
-     818,    67,  1238,   603,     0,     1,   296,   931,   579,   654,
-     907,    11,  1254,   397,   119,   818,     1,   507,   308,   116,
-     818,   481,   512,   109,   807,   515,   261,   273,   491,    50,
-     818,   266,  1050,  1475,   324,   132,    32,   109,   419,   329,
-    1304,   425,    44,    45,   230,   807,   329,   431,   481,   112,
-      80,   112,   342,   116,   683,  1291,   346,   162,   439,   131,
-     350,   351,   308,   249,   621,    82,   447,   712,  1510,   626,
-    1512,  1521,  1224,   590,    70,   365,  1526,   116,   568,   369,
-     697,   111,   372,   113,    96,   940,   107,   117,   110,   939,
-     939,   110,   109,   132,   115,   117,  1546,   116,   220,   110,
-     346,  1290,  1291,  1553,   749,  1526,   117,   397,   939,   131,
-     223,   123,   114,    90,    91,   632,   351,   407,   223,    10,
-      11,    12,    13,    14,   407,   114,  1009,   148,   116,   253,
-      94,     0,  1553,    80,   258,   425,   157,   427,   428,  1125,
-     253,   431,   605,  1129,   434,   109,   609,   111,    39,   126,
-     127,   526,   274,   116,   118,   119,   261,   223,   129,   281,
-     131,   266,   807,   253,   111,   455,   113,   630,   258,   132,
-     117,   634,   116,  1407,  1408,  1059,    67,  1018,  1019,  1415,
-     976,   427,   428,   473,     3,   112,   207,   253,   132,   116,
-     211,   481,   749,   483,   116,   485,   697,   432,   481,   489,
-    1464,    72,   485,     0,   505,   495,  1224,  1471,   948,   734,
-     132,   116,    83,    84,   991,  1139,   658,   507,   649,   509,
-     241,   830,   512,     3,   514,   515,  1415,   349,   485,   689,
-     830,   485,   522,     0,   116,    32,   526,   527,   110,   474,
-     111,   109,   116,   111,   366,   117,   351,    44,   370,   495,
-     132,    72,   273,    50,  1109,   276,   689,   253,   132,    94,
-    1524,   112,    83,    84,   116,   116,   911,    64,   514,   254,
-      67,  1496,   656,    70,   109,   296,   111,  1502,   116,   109,
-     132,   571,   572,   118,   119,   351,  1304,   308,   131,   579,
-     111,   792,   809,    94,   132,   419,   913,   814,  1523,  1095,
-     590,   591,   683,  1528,  1100,   595,   116,   917,   109,   919,
-     111,   601,   110,   603,   116,   439,   116,   118,   119,   110,
-     110,   342,   132,   447,   116,   346,   116,   432,   709,   419,
-     132,   621,   132,   579,   116,   944,   626,   591,   628,   112,
-     132,   958,   632,   116,   365,   635,   636,   637,   369,   439,
-     132,   372,   149,   109,   911,   111,   110,   447,   112,   483,
-     595,   485,   116,   109,   654,   162,   656,   668,   869,   474,
-     110,    72,   485,   748,   109,   621,   116,   131,   132,   867,
-     626,   110,    83,    84,    50,  1030,   903,   116,   623,   852,
-     187,   188,    72,   628,   109,   485,   686,   109,   110,   689,
-     888,   120,   121,    83,    84,   110,   427,   428,   474,    71,
-     111,   116,   913,    75,   211,   109,    78,   111,    80,   485,
-    1304,   118,   712,   713,   714,    87,   223,   124,   125,   109,
-     720,   721,   950,   109,   455,   111,   109,   738,   912,   912,
-     109,   912,   873,    88,    89,   912,  1464,   468,   109,   115,
-     912,   110,  1009,  1471,   914,   110,   253,   958,   748,   749,
-     912,   912,   110,   753,   754,   700,    72,   110,    74,    75,
-     267,   112,   493,    72,   495,   109,   497,    83,    84,   714,
-     109,   914,   945,   468,    83,    84,   507,    72,   509,   485,
-     595,   512,   115,   514,   515,   996,  1530,  1381,    83,    84,
-     622,  1321,   115,   116,  1530,   526,  1524,   110,  1530,   799,
-    1127,   109,   111,   116,  1159,   132,   638,   807,   623,   809,
-     110,   811,    64,   628,   814,   815,   116,   110,   818,   514,
-     109,   653,   329,   116,   507,   910,   509,   110,  1022,   512,
-     830,   109,   515,   116,   529,   211,  1047,   532,   112,   534,
-     535,   132,   214,   350,    85,    86,    87,   623,   579,   683,
-      72,   815,    74,    75,   110,   557,   558,   559,   560,   590,
-     116,    83,    84,  1190,  1191,   110,   811,   109,   109,   111,
-     111,   116,   113,   114,  1468,   709,  1470,   114,   110,   114,
-     110,   881,   132,   683,   116,   700,   116,   110,   583,   111,
-     621,   109,  1159,   116,   109,   626,   111,   273,   132,   714,
-     407,   632,   734,   903,  1045,   465,   109,  1134,   111,   709,
-     910,   911,   912,   110,   914,   749,  1127,   881,   114,   116,
-     296,   110,   110,   110,   700,  1095,   926,   116,   116,   116,
-    1100,  1525,   308,    82,   109,  1290,   111,   109,   714,   939,
-     940,    85,    86,    87,   944,   109,   110,   111,   109,   949,
-     950,    82,  1095,    92,    93,   686,   112,  1100,     0,     1,
-     655,   119,   657,   116,   117,   109,   966,   111,   949,   113,
-     114,  1238,   129,    72,   110,   111,   976,    76,   485,  1190,
-    1191,   353,   489,   355,    83,    84,   128,    29,    30,   465,
-      32,    58,    59,   724,   950,    94,   811,   115,   116,  1505,
-     116,   117,    44,  1203,  1204,    94,  1206,   131,    50,  1009,
-     109,   111,   707,  1213,   109,  1215,    58,   748,   109,   118,
-     119,   114,    64,  1117,   112,    67,   116,   117,    70,   112,
-    1030,  1031,   109,   110,   111,   811,     4,     5,     6,     7,
-       8,     9,    84,    85,   109,   110,   111,   881,   112,  1555,
-    1050,    44,    45,  1009,   109,   110,   111,   110,   881,    10,
-      11,    12,    13,    14,   553,   554,   108,  1012,   109,   111,
-      30,   443,   110,   110,  1401,   110,   118,   911,   809,   455,
-     110,   881,   110,   814,   555,   556,  1050,   112,    39,   111,
-    1090,   131,  1419,   116,   601,  1095,   603,    58,    59,    60,
-    1100,    69,   114,    71,   114,   881,   109,   149,   112,  1109,
-     561,   562,   672,   110,  1125,   157,    67,  1117,  1129,  1130,
-     162,  1263,  1264,  1265,    84,    85,   949,   110,   112,   117,
-     112,   507,   112,   509,  1134,  1220,   512,   112,   117,   515,
-       3,   117,   116,    94,    29,   187,   188,    10,    11,    12,
-      13,    14,   110,   110,   116,   114,   112,   112,   109,  1159,
-     111,   203,   115,   110,   132,  1492,  1493,   118,   119,   211,
-     115,   115,   903,   109,   116,   881,    39,  1377,   220,   910,
-     110,   223,   689,   132,   110,   110,   117,   110,   230,   110,
-    1401,   110,   116,   110,   110,   926,   672,  1012,   110,   110,
-     110,  1201,  1202,   245,    67,   110,   110,   249,  1419,   110,
-     110,   253,   254,   720,   721,   110,  1050,   948,   949,   950,
-    1220,  1202,   110,   110,  1224,   267,   268,  1050,   110,    72,
-      29,   115,   274,    76,   131,   795,  1012,  1248,  1238,   281,
-      83,    84,  1242,   949,   117,   805,    72,   116,    74,    75,
-    1050,    94,    72,   110,    74,    75,  1201,    83,    84,   819,
-    1224,  1242,   112,    83,    84,   112,   109,   116,   111,   964,
-     110,   110,   110,   117,  1050,   118,   119,   112,  1009,   116,
-     114,  1492,  1493,   109,   116,   245,   110,   329,   114,   109,
-    1290,  1291,   110,   988,   114,   110,   991,   110,   993,  1299,
-     112,   110,   116,  1397,  1304,   116,     3,   349,   350,   110,
-     686,   818,  1540,    10,    11,    12,    13,    14,   112,   795,
-     109,   109,   109,   830,   366,  1159,   109,  1338,   370,   805,
-     109,  1342,   117,   115,   112,   132,   110,  1337,   110,   381,
-    1304,   110,    39,   819,  1050,   115,  1530,  1530,  1043,  1530,
-     115,   114,   129,  1530,  1299,   397,  1337,   112,  1530,  1090,
-     110,  1531,   116,   112,   132,   407,   112,   110,  1530,  1530,
-      67,     4,     5,     6,     7,     8,     9,   116,  1201,  1202,
-     110,   110,    47,   425,   112,  1555,  1201,   112,  1531,   431,
-    1224,   433,   112,   110,   112,   132,   112,  1397,   112,   132,
-      33,  1224,   115,  1134,  1238,   912,    72,   914,    74,    75,
-      76,  1505,  1555,   132,   110,  1415,   115,    83,    84,  1242,
-     132,   381,   132,   117,  1224,  1201,   468,   110,   112,   115,
-     112,   473,   112,  1444,   112,    56,    69,   944,    71,   481,
-    1440,   112,   112,   485,   112,   112,   110,   489,  1224,   110,
-     492,   109,   494,   881,    72,   112,    74,    75,    76,  1440,
-     112,   109,   109,    60,  1464,    83,    84,  1027,  1028,   110,
-    1304,  1471,   514,  1473,   110,  1475,  1299,   114,    99,   132,
-     112,  1304,   117,   112,  1299,   110,   112,   529,  1530,  1220,
-     532,   109,   534,   535,  1530,   110,  1202,  1530,    96,   109,
-    1464,    96,   109,   115,  1304,  1505,   112,  1471,   132,   110,
-    1510,  1242,  1512,   116,  1337,    42,   110,   110,  1224,   110,
-     110,   117,   110,  1299,  1524,  1085,  1086,   132,  1304,    96,
-    1530,  1531,   492,   132,   494,     3,  1242,    96,  1531,   110,
-    1540,   583,    10,    11,    12,    13,    14,   132,   590,   132,
-     926,  1027,  1028,   117,    72,  1555,   110,     0,    76,   601,
-    1524,   603,  1555,   286,  1396,    83,    84,   132,  1263,  1264,
-    1265,    39,   110,   110,   195,   115,    94,   112,   112,   132,
-     622,   109,   132,   115,  1540,   308,   309,   110,  1095,    32,
-     115,   109,    72,  1100,    74,    75,   638,   218,  1304,    67,
-     118,   119,   644,    83,    84,   110,  1337,   228,   132,  1085,
-    1086,   653,   110,   655,   656,   657,   110,  1440,  1066,   565,
-     563,  1224,  1493,   346,   564,  1053,  1321,    70,   566,  1383,
-    1464,  1337,   567,  1565,   114,  1314,  1130,  1471,  1342,  1081,
-    1471,  1464,   686,   686,   919,  1100,   927,   689,  1471,   699,
-     583,   693,   980,   695,   873,   650,   724,   699,   946,   382,
-      50,   734,  1242,   485,  1464,   707,    -1,    26,    27,    28,
-      -1,  1471,   571,   571,    64,   296,  1236,    67,   720,   721,
-      70,   571,    -1,    -1,   644,    -1,    -1,    -1,  1464,    -1,
-    1524,    -1,   734,    -1,    -1,  1471,    72,    -1,    74,    75,
-      76,  1524,    -1,    58,    -1,     0,     1,    83,    84,  1440,
-      -1,  1271,  1407,  1408,  1090,   158,    -1,    -1,    -1,  1279,
-    1280,  1281,    -1,    -1,  1524,     4,     5,     6,     7,     8,
-       9,    -1,    -1,   693,  1440,   695,    -1,    32,    -1,   699,
-      -1,   100,  1473,   102,  1475,    -1,    -1,    -1,  1524,    -1,
-    1445,    -1,    -1,   108,    -1,    50,   111,    -1,  1464,   149,
-    1236,    67,    -1,    -1,    -1,  1471,   191,    -1,    -1,    -1,
-      -1,    77,   162,   198,    -1,    70,   818,    -1,    -1,  1510,
-      -1,  1512,    -1,    -1,    -1,  1345,    -1,    -1,   830,   232,
-      69,    -1,    71,    -1,    -1,  1271,  1224,    -1,   188,    -1,
-      -1,    -1,   157,  1279,  1280,  1281,    -1,    -1,    -1,  1540,
-     253,  1506,   107,   119,    -1,   258,    -1,    -1,  1524,    -1,
-    1515,   211,    -1,   444,   183,    -1,    -1,   550,   551,   552,
-      -1,   873,    -1,   223,   193,   194,    -1,    -1,   880,   198,
-      -1,   200,   201,    -1,    -1,   270,    -1,    -1,    72,   470,
-      74,    75,    76,    -1,   149,    -1,   162,    -1,    -1,    83,
-      84,   903,   157,   158,    -1,   220,    -1,    -1,    -1,  1345,
-     912,    -1,   914,    -1,    -1,    -1,    -1,    -1,    72,   921,
-      74,    75,    76,    -1,    -1,   109,   507,    -1,    -1,    83,
-      84,   512,  1320,   188,   515,    -1,    -1,    -1,    -1,   324,
-      94,    -1,   944,    -1,    -1,    -1,    -1,   332,   203,   352,
-     335,   206,   207,   873,    -1,   109,   211,   223,    -1,   274,
-     880,    -1,   964,    -1,   118,   119,   281,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   232,   980,   329,
-      -1,   236,    -1,   238,    -1,    -1,   988,  1375,    -1,   991,
-    1378,   993,   247,    -1,    -1,   261,    -1,    -1,   253,    -1,
-     266,   921,    -1,   258,    -1,    -1,    -1,    -1,   672,    -1,
-      -1,    -1,    -1,   268,   399,   281,   419,    -1,   403,    -1,
-      -1,   276,    -1,    -1,    10,    11,    12,    13,    14,    -1,
-      -1,   434,    -1,    -1,   349,  1423,   439,    -1,    -1,    -1,
-    1428,  1043,    -1,    -1,   447,    10,    11,    12,    13,    14,
-      -1,   366,    -1,    39,    -1,   370,    -1,   407,    -1,    -1,
-     980,    -1,   465,  1530,    -1,    -1,    -1,    -1,    -1,    -1,
-    1458,    -1,    -1,    -1,    39,    -1,    -1,   760,    -1,  1081,
-     483,    67,   485,    -1,    -1,   351,    -1,   342,    -1,    -1,
-     671,   346,    -1,  1095,    -1,   480,    -1,   352,  1100,   680,
-      -1,    -1,    67,   684,    -1,    -1,    -1,    -1,    94,    -1,
-     365,    -1,    -1,    -1,   369,  1117,    -1,   372,   433,    -1,
-      -1,    -1,    -1,   109,   527,   111,    -1,    -1,    -1,    94,
-      -1,   795,   118,   119,    -1,    -1,    -1,  1473,    -1,  1475,
-      -1,   805,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,   119,   819,  1544,    -1,    -1,    -1,
-      -1,  1081,  1550,    -1,   419,    -1,   432,    -1,    -1,    -1,
-      -1,    -1,    -1,  1561,  1510,    -1,  1512,  1565,    72,   434,
-      74,    75,    76,   449,   439,    -1,   571,   572,   591,    83,
-      84,    -1,   447,    -1,    72,  1197,    74,    75,    76,    -1,
-      94,    -1,    -1,     0,    -1,    83,    84,    -1,   474,    -1,
-     465,    -1,    -1,   468,    -1,   109,    94,   111,  1220,    -1,
-      -1,    -1,    -1,   117,   118,   119,    -1,    -1,   483,    -1,
-     485,   109,   635,   636,   637,    32,    -1,    -1,   493,    -1,
-     118,   119,   497,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   654,    -1,    -1,    -1,    -1,   575,   576,    -1,    -1,
-      -1,  1263,  1264,  1265,    -1,    -1,    -1,    -1,    -1,   672,
-      -1,   526,   527,    70,   659,   590,    -1,  1197,   663,    -1,
-     683,    -1,    -1,    -1,    -1,   604,    -1,    -1,   607,   608,
-      -1,   610,    -1,   612,   613,    -1,    -1,    -1,   617,   618,
-      -1,    -1,    -1,    -1,    -1,    -1,   709,   622,    -1,   712,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   572,     0,  1321,
-      -1,    -1,    -1,   638,   905,    -1,  1009,    -1,    -1,   595,
-      -1,    -1,    -1,    -1,    -1,   590,   591,    -1,   653,    -1,
-      -1,    -1,    -1,     0,     1,    -1,   749,    -1,   603,    -1,
-      32,    -1,    -1,    -1,    -1,    -1,    -1,   623,    -1,    -1,
-      -1,   158,   628,  1027,  1028,    -1,   621,  1050,    -1,    -1,
-      -1,   626,    -1,    -1,    -1,    32,    -1,   632,    -1,    -1,
-     635,   636,   637,    -1,    -1,    -1,    -1,    -1,    70,    -1,
-      -1,    -1,   795,    -1,  1396,  1397,    -1,    -1,    -1,   654,
-      -1,    -1,   805,    -1,   807,  1407,  1408,    -1,    -1,   812,
-      67,    -1,   815,    70,   799,    -1,   819,   672,    -1,   734,
-      -1,  1085,  1086,    -1,    -1,    -1,    -1,    -1,   683,    -1,
-      -1,    -1,    -1,    -1,   700,    -1,    -1,    -1,    -1,   758,
-     759,    -1,    -1,  1445,    -1,    -1,    -1,    -1,   714,    -1,
-      -1,    -1,    -1,    -1,   709,    -1,   253,   712,    -1,    -1,
-      -1,   258,    -1,    -1,    -1,    -1,   721,    -1,   734,   724,
-      72,    -1,    74,    75,    76,    -1,   158,    -1,   881,    -1,
-    1061,    83,    84,    -1,    72,    -1,    74,    75,    76,    -1,
-      -1,    -1,    94,   748,   749,    83,    84,    -1,    -1,   754,
-      -1,   158,    -1,  1505,  1506,    -1,    94,   109,   911,   111,
-      -1,    -1,    -1,  1515,    -1,    -1,   118,   119,    -1,    -1,
-      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,  1530,  1531,
-     118,   119,    -1,   918,    -1,    -1,    -1,    -1,    -1,    -1,
-     795,    -1,    -1,    -1,    -1,   811,    -1,    -1,    -1,    -1,
-     805,    -1,   807,  1555,   809,   352,    -1,   812,    -1,   814,
-     815,    -1,    -1,   966,   819,    -1,   223,    -1,    -1,    -1,
-      -1,   253,    -1,    -1,   829,    -1,   258,    97,    98,    99,
-     100,   101,   102,   103,   104,   105,   106,    -1,   903,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   253,    72,    -1,    74,
-      75,    76,    -1,    -1,   923,    -1,    -1,  1271,    83,    84,
-      -1,   131,    -1,   998,    -1,  1279,  1280,  1281,    -1,    94,
-      -1,    -1,   419,    -1,  1027,  1028,   881,  1030,  1031,    -1,
-    1015,    -1,    -1,    -1,   109,    -1,   111,   434,    -1,    -1,
-      -1,    -1,   439,   118,   119,    -1,    -1,  1050,   903,    -1,
-     447,    -1,    -1,    -1,    -1,   910,   911,    -1,    -1,   914,
-      -1,    10,    11,    12,    13,    14,    -1,    -1,   465,    -1,
-     352,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1345,  1085,  1086,    -1,   940,   483,    -1,   485,    -1,
-      39,    -1,    -1,   948,   949,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1093,    -1,
-      -1,   966,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,
-      -1,    -1,    -1,    72,    -1,    74,    75,    76,    -1,    -1,
-     527,    -1,  1313,    -1,    83,    84,    -1,   419,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    94,  1012,    -1,    -1,    -1,
-    1135,    -1,   434,    -1,  1009,    -1,  1159,   439,    -1,    -1,
-     109,    -1,   111,    -1,    -1,   447,    -1,  1022,  1087,   118,
-     119,    -1,  1027,  1028,    -1,  1030,  1031,   434,    -1,    -1,
-      -1,    -1,    -1,   465,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   591,  1050,    -1,    -1,    -1,  1202,
-      -1,   483,    -1,   485,    -1,    -1,    -1,    -1,    -1,    -1,
+       0,     1,   240,   205,   186,   186,   117,     0,    43,   534,
+      43,    43,   600,   756,   646,     1,   749,   187,   521,     0,
+     186,   186,   186,   157,   169,   170,   749,   749,   186,   106,
+     220,   602,    32,   186,   345,   349,     0,   188,   280,    32,
+     157,   513,   600,    43,   874,    43,   603,   874,   349,    49,
+     620,    32,   609,   733,     0,   983,    49,   600,   492,   571,
+       0,     1,   496,    63,   602,   187,    66,    32,    32,    69,
+      63,   692,    43,    66,    64,     0,    69,  1040,    39,   156,
+       1,   600,    57,    69,   266,   266,    32,    43,    51,  1398,
+     364,   202,    32,    63,   368,  1321,   418,   267,    82,   600,
+     266,   266,   266,  1052,  1053,  1033,   106,    32,   266,   600,
+     600,   262,   263,   266,   114,    72,   438,   117,   118,   109,
+     282,    72,  1402,    96,   446,    39,    66,   695,    39,    69,
+      28,   109,   107,    39,    39,   110,    95,    39,    82,   128,
+      39,    66,   131,  1021,    82,   267,   109,   147,   148,   122,
+     111,   186,    11,   186,   186,   148,   156,   157,     0,   295,
+    1469,   161,   132,  1020,  1021,   109,    44,    45,   161,     0,
+     129,   482,   905,   109,   488,   132,     0,     1,    72,  1128,
+      78,   132,   905,   905,   687,    49,   186,   187,   186,   109,
+      32,   257,   130,  1419,   187,   109,   109,   111,   109,   718,
+     111,    32,   202,   109,   109,   111,   111,   109,    32,   111,
+     210,   131,    43,  1040,    72,   186,  1496,   210,    49,    82,
+     410,  1501,   222,   117,   812,    83,    84,   718,   718,   222,
+     186,   266,    63,   266,   266,    66,   406,   115,    69,  1452,
+     240,  1521,    85,   986,   219,    69,   112,   110,  1528,    82,
+     114,   109,   252,   824,   812,   116,   107,   814,   114,   252,
+     260,    44,    45,     3,   341,   265,   266,   267,   490,   812,
+     113,   252,   272,  1486,   267,  1488,   257,    82,   111,   900,
+     131,   793,   222,   147,   406,   396,   824,   252,   252,    49,
+     426,   427,   924,   812,   371,   295,     3,   222,   273,   433,
+      96,   602,  1501,   116,   109,   280,   252,   307,     0,   620,
+     480,   812,   252,   424,   625,   589,   433,   148,   110,   430,
+     112,   812,   812,   323,   116,  1288,   122,   252,   328,  1528,
+     161,   114,   253,    44,    45,   328,     0,    82,   906,   131,
+     132,   341,   504,   110,   932,   345,   210,  1225,   482,   349,
+     350,   109,   418,   111,   114,   186,   187,   631,   480,   681,
+     109,   116,   933,   130,   364,   110,    90,    91,   368,  1049,
+     506,   371,   438,   348,   932,   511,   240,   132,   514,   210,
+     446,  1211,   604,   951,  1211,   130,   608,   426,   427,   932,
+     365,   222,   526,    72,   369,   112,   396,  1275,   116,   116,
+     285,   125,   126,   114,    83,    84,   406,   629,   272,   526,
+     252,   633,   130,   406,  1472,   257,   110,  1274,  1275,    55,
+    1478,   252,   307,   308,   424,   350,   426,   427,   252,   999,
+     430,   567,   111,   433,   745,   266,   130,   418,   112,   116,
+    1498,   110,   116,   307,   111,  1503,   113,   116,   525,  1501,
+     210,  1008,  1009,   130,   454,   494,   590,   438,  1386,  1387,
+     345,  1288,    98,   130,   967,   446,   635,   636,   131,  1521,
+     229,   112,   472,   590,   513,   116,  1528,   116,  1441,   110,
+     480,   345,   482,   652,   484,  1448,   116,   480,   488,   248,
+     732,   484,   110,   132,   494,  1127,   381,   328,   116,   116,
+     130,   482,   647,   484,   666,   656,   506,   941,   508,   981,
+     824,   511,   272,   513,   514,   132,  1394,   687,   349,   109,
+     484,   521,   109,   824,   116,   525,   526,   109,  1099,   803,
+     109,   111,   111,   113,   808,   295,  1499,  1394,   484,   578,
+     132,   710,   109,   654,   484,   116,   467,   307,   473,  1117,
+     130,     4,     5,     6,     7,     8,     9,   116,   194,   484,
+     110,   132,   426,   427,   116,   687,   116,   116,   116,   116,
+     570,   571,   116,   132,   736,   406,   418,   109,   578,   116,
+     132,   217,  1085,   132,   132,   132,   109,  1090,   132,   589,
+     590,   227,   117,   904,   594,   132,   438,   116,   123,   124,
+     600,   116,   602,   109,   446,   111,   110,   528,  1288,  1177,
+    1178,   745,   533,   132,  1441,   681,    69,   132,    71,   110,
+     620,  1448,   896,   937,   846,   625,    72,   627,    74,    75,
+     494,   631,   801,   110,   634,   635,   636,    83,    84,    72,
+     110,   707,   484,   112,   590,   110,   621,   116,   112,   513,
+      83,    84,   652,   484,   654,   109,   910,   488,   912,   295,
+     484,   582,   637,   109,   549,   550,   551,   744,   114,   112,
+     109,   861,  1499,   116,    72,   809,   651,   115,    72,   132,
+      74,    75,  1362,   109,   684,    83,    84,   687,   999,    83,
+      84,   881,   809,   109,   454,   111,    72,   622,    74,    75,
+     681,    85,    86,    87,   109,   943,   111,    83,    84,   132,
+     710,   711,   712,   111,   578,   109,   938,  1115,   718,   719,
+     114,  1119,   867,   905,   905,   109,   707,   111,    64,   113,
+     114,   109,   653,   111,   655,   112,   110,   907,   114,   905,
+     905,   905,   116,   109,   744,   745,   506,   905,   508,   749,
+     750,   511,   905,   109,   514,   111,   620,   732,   109,    70,
+     111,   625,   109,    74,   745,  1445,    77,  1447,    79,   600,
+     904,   602,  1505,   698,   132,    86,   556,   557,   558,   559,
+    1305,     3,  1505,  1505,   705,   907,   114,   712,    10,    11,
+      12,    13,    14,   793,     4,     5,     6,     7,     8,     9,
+     110,   801,   109,   803,   111,   805,   116,   443,   808,   809,
+    1012,   114,   812,   109,  1382,   111,    72,    39,    74,    75,
+    1500,   117,   118,    33,   824,    72,   903,    83,    84,   114,
+    1398,   132,   110,   469,   132,  1146,    83,    84,   116,   681,
+      10,    11,    12,    13,    14,    67,    72,   110,  1122,   109,
+      76,   109,   110,   116,    82,   111,   687,    83,    84,    69,
+     110,    71,    49,   809,   111,   707,   116,   110,   109,    39,
+     506,   756,   109,   116,   874,   511,    63,   112,   514,    66,
+     805,    82,    69,   109,   118,   111,  1020,   718,   719,   110,
+    1035,   117,   118,   874,   127,   116,   896,    67,    88,    89,
+    1468,  1469,   213,   903,   904,   905,    72,   907,     4,     5,
+       6,     7,     8,     9,  1225,  1085,   110,    83,    84,   919,
+    1090,   128,   116,   904,   684,   110,    94,   109,   874,   111,
+      30,   116,   932,   933,   874,   117,   118,   937,   131,   109,
+      72,   111,   942,   943,    76,   111,   111,   117,   118,   874,
+     109,    83,    84,  1115,   110,   109,   942,  1119,  1120,   112,
+     116,   148,   109,  1085,   111,     0,     1,   967,  1090,   112,
+     117,   118,   110,    69,   161,    71,   110,   109,  1481,   119,
+     120,   812,   116,    83,    84,   117,   118,   112,    10,    11,
+      12,    13,    14,   824,    29,    30,  1107,    32,   110,   999,
+     187,   110,   942,   110,   116,    92,    93,    72,    43,    74,
+      75,    76,  1146,    72,    49,    74,    75,    39,    83,    84,
+    1020,  1021,    57,   210,    83,    84,   110,  1530,    63,   115,
+     116,    66,   874,   669,    69,   222,   957,   109,   110,   111,
+    1040,   352,   678,   354,   109,    67,   682,   110,    83,    84,
+     874,   109,   117,   118,  1190,  1191,    72,  1193,   979,  1040,
+      76,   110,   983,   110,  1200,   110,  1202,    83,    84,   116,
+     112,   116,   107,  1235,   905,   110,   907,  1002,   110,   943,
+    1080,   111,   117,   114,   116,  1085,   110,   109,   116,   111,
+    1090,   131,   116,   109,  1040,   117,   118,   110,   111,  1099,
+    1040,   117,   118,   506,    66,   508,   937,  1107,   511,    58,
+      59,   514,  1033,   148,   999,  1040,   115,   116,   942,    44,
+      45,   156,  1122,   552,   553,    72,   161,    74,    75,    76,
+    1207,   442,   109,   110,   111,   999,    83,    84,   560,   561,
+    1274,   328,   554,   555,   244,   114,  1146,   114,   109,   110,
+     111,   186,   187,   109,   112,  1040,   118,   110,   110,   919,
+    1322,   112,   109,    29,  1326,  1146,   112,   202,   112,     3,
+     117,   118,   109,   110,   111,   210,    10,    11,    12,    13,
+      14,    58,    59,    60,   219,   112,   116,   222,  1188,  1189,
+    1248,  1249,  1250,   110,   229,   130,   130,   130,  1040,   161,
+     110,   112,   114,  1189,   112,    39,   115,  1207,   110,   244,
+     115,  1211,   115,   248,   109,   116,  1040,   252,   253,   406,
+       1,   110,  1358,   110,    72,  1225,    74,    75,    76,  1229,
+    1211,   266,   267,    67,   132,    83,    84,   116,   273,   110,
+     110,   110,   110,  1229,  1225,   280,   110,   110,  1188,  1189,
+     110,   116,   110,   110,  1085,   110,   110,   110,   110,  1090,
+     222,  1423,   898,  1188,   110,  1211,   110,  1378,    49,   110,
+     110,  1211,   115,   874,  1274,  1275,    29,  1515,   110,   130,
+     380,   131,   112,  1283,   112,   116,  1211,   110,  1288,  1229,
+     110,   116,   110,   328,   130,   116,   112,   114,   260,   110,
+     110,   464,   110,   265,   116,   112,   110,  1288,   110,   110,
+     116,   116,   112,   348,   349,    10,    11,    12,    13,    14,
+    1080,  1321,   109,  1505,  1505,   106,   109,  1248,  1249,  1250,
+     365,   109,   109,   114,   369,  1321,  1506,   109,   130,  1505,
+    1505,  1505,  1288,  1283,    39,   380,     3,  1505,  1288,   112,
+     132,   115,  1505,    10,    11,    12,    13,    14,  1283,   110,
+    1530,   396,   110,  1288,   110,  1189,   147,   128,   115,  1211,
+    1481,   406,    67,   115,   464,   156,   114,   695,  1378,   112,
+     132,  1321,    39,   110,  1506,   116,   112,  1211,   350,   424,
+     112,   491,   110,   493,  1394,   430,   110,   432,   110,   112,
+     110,   112,  1377,   112,   112,  1229,   112,   112,  1530,    72,
+      67,    74,    75,    76,   109,  1051,   111,    47,   115,  1419,
+      83,    84,   117,   118,    72,   206,    74,    75,    76,   210,
+     132,   132,   467,  1419,   132,    83,    84,   472,   132,   132,
+     110,  1441,  1043,   115,   130,   480,  1288,   115,  1448,   484,
+    1450,   110,  1452,   488,   112,   109,   491,   112,   493,   240,
+    1441,   109,   112,   112,  1288,  1386,  1387,  1448,   786,   431,
+    1505,   112,  1505,  1505,   112,   110,   110,    60,   109,  1419,
+     112,  1481,    66,   112,   109,   132,  1486,   110,  1488,   110,
+     114,   272,    76,   528,   275,  1441,   112,  1321,   533,  1499,
+     112,  1441,  1448,  1424,   110,  1505,  1506,   670,  1448,   112,
+     110,   473,   109,  1506,   295,  1515,  1441,    96,  1499,    96,
+      85,    86,    87,  1448,   109,   132,   307,   115,   110,    72,
+    1530,    74,    75,    76,   118,   110,   110,  1530,   110,    42,
+      83,    84,   642,   116,   109,   863,   111,   582,   113,   114,
+     130,   132,   110,  1499,   589,   110,   132,    96,    96,  1499,
+     341,  1482,   132,   110,   345,   600,   109,   602,   132,   110,
+    1491,   132,   112,   110,  1499,   110,   132,   161,   112,   115,
+     670,   109,   132,   364,   115,   115,   621,   368,   906,   110,
+     371,   691,   110,   693,   110,  1419,   110,   697,  1056,  1441,
+     132,   564,   637,   562,   977,   565,  1448,   642,   563,   566,
+    1211,  1211,  1469,  1364,  1540,  1298,   651,  1441,   653,   654,
+     655,  1120,  1326,  1448,  1448,   912,   789,    66,   684,  1071,
+     684,  1090,   594,   951,   920,   697,   799,   582,   222,   971,
+     867,   648,   722,  1229,    83,   426,   427,   939,   570,   484,
+     813,  1515,   687,   732,   570,   570,   691,  1499,   693,    -1,
+     622,  1297,   697,    -1,    -1,   627,    -1,    -1,   986,    -1,
+     705,    -1,    -1,   454,  1505,  1499,   260,    -1,    -1,   118,
+      -1,   265,    -1,   718,   719,    -1,   467,    -1,    -1,    -1,
+    1450,    -1,  1452,    -1,    -1,    -1,   280,   732,    -1,   789,
+      -1,    -1,    -1,  1304,    -1,    -1,    -1,    -1,    -1,   799,
+      -1,   492,    -1,   494,    -1,   496,    -1,    -1,    -1,  1037,
+      -1,    -1,   161,   813,    -1,   506,  1486,   508,  1488,    -1,
+     511,    -1,   513,   514,    -1,    -1,   698,    57,    -1,    10,
+      11,    12,    13,    14,   525,    -1,    -1,    -1,    -1,    72,
+     712,    74,    75,    76,    -1,  1356,    -1,    -1,  1359,    -1,
+      83,    84,    -1,    -1,    -1,    -1,   350,   867,    39,    -1,
+      -1,    -1,    -1,   873,    -1,    -1,    -1,   812,    -1,    -1,
+      -1,    -1,    -1,   222,    -1,    -1,   109,   107,   111,   824,
+     110,    -1,    -1,    -1,   117,   118,    67,   578,    -1,  1117,
+      -1,  1402,    -1,    -1,    -1,    -1,  1407,   130,   589,    -1,
+      -1,    -1,    -1,  1449,   914,  1451,    -1,    -1,    -1,    -1,
+      -1,   260,    -1,    -1,    -1,    -1,   265,    -1,    -1,    -1,
+      -1,    -1,   867,    -1,  1435,    -1,   156,   670,   873,   620,
+      -1,    -1,    -1,   805,   625,    -1,    -1,   431,    -1,  1485,
+     631,  1487,     0,     1,  1017,  1018,    -1,    -1,    -1,  1177,
+    1178,   896,    -1,    -1,   448,    -1,    -1,    -1,    -1,    -1,
+     905,   971,   907,    -1,    -1,    -1,    -1,    -1,    -1,   914,
+      -1,    -1,    -1,    -1,    32,    -1,    -1,    -1,    -1,   473,
+      -1,    -1,    -1,  1529,    -1,  1531,    -1,    -1,    -1,   219,
+      -1,    49,   937,   684,    -1,    -1,    -1,    -1,  1544,  1545,
+      -1,   350,  1075,  1076,    -1,    -1,    -1,    -1,  1519,    -1,
+      -1,    69,   957,    -1,  1525,    -1,    -1,  1017,  1018,    -1,
+      -1,    -1,    -1,    -1,    -1,  1536,   971,    -1,    -1,  1540,
+      -1,   722,    -1,    -1,   979,    -1,    -1,    -1,   983,     0,
+       1,    -1,    -1,   273,    -1,    -1,   789,    -1,   106,    -1,
+     280,    -1,    -1,   744,    -1,    -1,   799,    -1,    -1,    -1,
+      -1,  1071,    -1,    -1,    -1,     0,    -1,    -1,    -1,    -1,
+     813,    32,    -1,    -1,    -1,  1075,  1076,    -1,    -1,    -1,
+      -1,    -1,   431,    -1,    -1,    -1,    -1,    -1,  1033,    -1,
+     148,    -1,    -1,    -1,    -1,    -1,    -1,    32,   156,   157,
+     594,    -1,    -1,    -1,    -1,    66,    -1,    -1,    69,    -1,
+      -1,    -1,   803,    -1,    -1,    -1,    -1,   808,   348,    -1,
+      -1,    -1,    -1,    -1,   473,    -1,  1071,    -1,   622,   187,
+    1002,    -1,    -1,   627,    69,   365,    -1,    -1,    -1,   369,
+    1085,    -1,    -1,    -1,   202,  1090,    -1,   205,   206,    -1,
+    1223,    -1,   210,    -1,  1382,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1107,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1398,    -1,    -1,   231,  1184,    -1,    -1,   235,    -1,   237,
+      -1,    -1,  1255,    -1,    -1,    -1,    -1,    -1,   246,    -1,
+    1263,  1264,  1265,    -1,   252,    -1,   157,    -1,    -1,   257,
+      -1,    -1,   432,    -1,   698,   896,    -1,    -1,    -1,   267,
+      -1,    -1,   903,    -1,    -1,    -1,    -1,   275,   712,    -1,
+      -1,     0,   157,  1223,    -1,    -1,    -1,    -1,   919,    -1,
+      -1,    72,    -1,    74,    75,    76,    -1,    -1,   732,  1184,
+    1468,  1469,    83,    84,    -1,   594,    -1,    -1,    -1,    -1,
+     941,   942,   943,    32,  1327,  1255,    -1,    -1,    -1,    -1,
+      -1,   222,  1207,  1263,  1264,  1265,    -1,    -1,   109,    -1,
+     111,    -1,    -1,   622,  1017,  1018,   117,   118,   627,    -1,
+      -1,    -1,    -1,   341,    -1,    -1,    -1,   345,    -1,    -1,
+      69,   252,    -1,   351,    -1,    -1,   231,    -1,    -1,    -1,
+      -1,    -1,    -1,  1248,  1249,  1250,   364,    -1,   999,    -1,
+     368,   805,    -1,   371,    -1,    -1,  1188,   252,    -1,    -1,
+      -1,    -1,   257,    -1,    -1,    -1,    -1,  1327,    -1,    -1,
+      -1,    -1,  1075,  1076,    -1,    -1,    -1,    -1,    -1,    -1,
+      72,    -1,    74,    75,    76,    -1,    -1,    -1,    -1,   698,
+      -1,    83,    84,    72,    -1,    74,    75,    76,    -1,   589,
+     418,    -1,    -1,   712,    83,    84,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   433,    -1,   109,   157,   111,
+     438,    -1,    -1,    -1,    -1,   117,   118,    -1,   446,  1080,
+     109,   621,   111,    -1,    -1,    -1,    -1,    -1,   117,   118,
+      -1,    -1,    -1,    -1,    -1,    -1,   464,   637,    -1,   467,
+      -1,  1283,    -1,    -1,    -1,    -1,   351,    -1,    -1,    -1,
+      -1,   651,    -1,    -1,   482,    -1,   484,    -1,    -1,    -1,
+      -1,  1122,  1377,  1378,   492,    -1,    -1,    -1,   496,    -1,
+      -1,  1386,  1387,    97,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,    -1,    -1,    -1,   805,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   525,   526,    -1,
+      -1,    -1,   433,   252,    -1,    -1,    -1,   131,   257,  1424,
+      -1,    -1,    -1,   418,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   433,    -1,
+      -1,    -1,   732,   438,    -1,    -1,    -1,    -1,  1002,    -1,
+      -1,   446,  1255,   571,    -1,    -1,  1207,    -1,    -1,    -1,
+    1263,  1264,  1265,   484,    -1,    -1,    -1,    -1,    -1,   464,
+      -1,   589,   590,    -1,    -1,    -1,  1481,  1482,  1229,    -1,
+      -1,    -1,    -1,    -1,   602,    -1,  1491,   482,    -1,   484,
+      -1,    -1,    -1,    37,    38,    -1,    40,    -1,    -1,    -1,
+    1505,  1506,   620,    -1,    -1,   526,    -1,   625,    -1,    -1,
+      -1,    -1,   351,   631,    -1,    -1,   634,   635,   636,    -1,
+      -1,    -1,    66,    -1,  1327,  1530,    -1,    -1,    72,    -1,
+      -1,   526,    76,    -1,   652,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   670,    -1,    -1,    10,    11,    12,    13,    14,
+      -1,    -1,    -1,   681,    -1,   109,    -1,   111,    -1,   590,
+    1321,    -1,    -1,   117,   118,   119,   120,   121,   122,   418,
+      -1,    -1,    -1,    -1,    39,    -1,   130,    -1,    -1,   707,
+      -1,    -1,   710,  1002,   433,   590,    -1,    -1,    -1,   438,
+      -1,   719,    -1,    -1,   722,    -1,   896,   446,    -1,    -1,
+      -1,    -1,    67,   634,   635,   636,    -1,    72,    -1,    74,
+      75,    76,    -1,    -1,    -1,   464,   744,   745,    83,    84,
+      -1,   652,   750,    -1,  1188,    -1,    -1,    -1,    -1,   634,
+     635,   636,    -1,   482,    -1,   484,    -1,    10,    11,    12,
+      13,    14,    -1,    -1,   109,    -1,   111,   652,    -1,    -1,
+      -1,    -1,   117,   118,    -1,    -1,    -1,    -1,  1419,    -1,
+      -1,   789,    -1,    -1,    -1,   670,    39,    -1,    -1,    -1,
+      -1,   799,    -1,   801,    -1,   803,   681,   526,   806,   710,
+     808,   809,    -1,    -1,    -1,   813,    -1,    -1,    -1,  1450,
+      -1,  1452,    -1,    -1,    67,   823,    -1,    -1,    -1,    72,
+      -1,    -1,   707,    76,    -1,   710,    -1,    -1,    -1,    -1,
+      83,    84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1283,
+      -1,     0,    -1,    -1,    -1,  1486,    -1,  1488,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,    -1,    -1,
+     745,   590,    -1,    -1,   117,   118,   874,    -1,     0,    -1,
+     190,    -1,    -1,    32,  1515,    -1,    -1,   197,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   896,  1188,
+     801,    -1,    -1,    -1,    -1,   903,   904,    -1,   809,   907,
+      32,    -1,    -1,    -1,   789,   634,   635,   636,    -1,    -1,
+      69,    -1,    -1,    -1,   799,    -1,   801,    -1,    -1,    -1,
+      -1,   806,    -1,   652,   809,   933,    -1,    -1,   813,    -1,
+      -1,    -1,    -1,   941,   942,    -1,    -1,    69,    -1,    -1,
+      -1,   670,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   269,
+      -1,    -1,   681,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   874,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   707,    -1,
+      -1,   710,    -1,    -1,  1283,    -1,    -1,    -1,    -1,   874,
+      -1,   999,    -1,    -1,    -1,    -1,    -1,    -1,   157,    -1,
+      -1,    -1,    -1,   323,  1012,    -1,    -1,    -1,    -1,  1017,
+    1018,   331,  1020,  1021,   334,    -1,   745,    -1,    -1,   904,
+      -1,    -1,    -1,    -1,    -1,   157,    -1,  1207,    -1,    -1,
+      -1,   942,  1040,    -1,    -1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+     789,    -1,    30,    31,    32,    -1,    -1,  1075,  1076,    -1,
+     799,    39,   801,    -1,    -1,    -1,    -1,   806,   398,    -1,
+     809,    -1,   402,    -1,   813,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   252,    -1,    -1,    -1,    -1,   257,    67,
+      -1,    69,    -1,    71,    72,    -1,    74,    75,    76,  1020,
+    1021,    -1,    -1,    -1,  1122,    83,    84,    -1,    -1,    -1,
+     252,    -1,    -1,    -1,    -1,   257,    -1,    -1,    -1,  1040,
+      -1,    -1,  1017,  1018,    -1,  1020,  1021,    -1,  1146,    -1,
+      -1,   109,    -1,   111,    -1,   874,    -1,    -1,    -1,   117,
+     118,    -1,    -1,    -1,    -1,  1040,    -1,    -1,    -1,   479,
+      -1,    -1,    -1,    -1,    -1,    10,    11,    12,    13,    14,
+      -1,    -1,    -1,    -1,    -1,   904,    -1,    -1,    -1,    -1,
+      -1,  1189,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1075,  1076,   351,    -1,    39,    -1,    -1,  1377,    -1,  1207,
+      -1,    -1,    -1,  1211,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1223,    -1,  1225,    -1,   351,
+      -1,  1229,    67,    -1,    -1,    -1,    -1,    72,    -1,    74,
+      75,    76,    -1,    -1,    -1,    26,    27,    28,    83,    84,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1255,    -1,    -1,
+     570,   571,    -1,    -1,    -1,  1263,  1264,  1265,    -1,   418,
+      -1,  1146,    -1,    -1,   109,    -1,  1274,  1275,    -1,    -1,
+      -1,    -1,   117,   118,   433,    -1,    -1,  1188,  1189,   438,
+    1288,    -1,    -1,    -1,    -1,    -1,   418,   446,  1017,  1018,
+      -1,  1020,  1021,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1211,   433,    -1,    -1,  1189,   464,   438,    -1,    99,    -1,
+     101,  1040,    -1,  1321,   446,    -1,    -1,    -1,  1229,  1327,
+      -1,    -1,    -1,   482,    -1,   484,  1211,    -1,    -1,    -1,
+      -1,    -1,   464,    -1,    -1,   126,    -1,   657,  1223,    -1,
+    1225,   661,    -1,    -1,    -1,    -1,  1075,  1076,    -1,    -1,
+     482,    -1,   484,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1274,  1275,    -1,    -1,   526,    -1,    -1,
+    1255,    -1,  1283,    -1,    -1,    -1,    -1,  1288,  1263,  1264,
+    1265,    -1,    -1,    -1,    -1,    -1,  1394,    -1,    -1,  1274,
+    1275,   182,    -1,    -1,   526,    -1,    -1,    -1,    -1,   190,
+      -1,   192,   193,  1288,    -1,    -1,   197,    -1,   199,   200,
+    1321,  1419,    -1,    53,    -1,    55,    -1,  1146,    58,    59,
+      60,    -1,    62,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   590,    -1,  1441,    -1,    -1,    -1,    77,    -1,    -1,
+    1448,    -1,  1327,    -1,    -1,    -1,    -1,    -1,    -1,    89,
+      90,    -1,    -1,    -1,    26,    27,    28,    -1,   590,    -1,
+    1189,    -1,    -1,    -1,    -1,    -1,    10,    11,    12,    13,
+      14,    -1,    -1,   793,    -1,   634,   635,   636,   269,    -1,
+      -1,    -1,  1211,  1394,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,  1499,    -1,   652,  1223,    39,  1225,    -1,  1506,    -1,
+      -1,    -1,   634,   635,   636,    -1,    -1,    -1,  1419,  1394,
+      -1,   670,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     652,    -1,   681,    67,    -1,    -1,  1255,    99,    72,   101,
+    1441,    -1,    76,    -1,  1263,  1264,  1265,  1448,   670,    83,
+      84,    -1,    -1,    -1,    -1,  1274,  1275,    -1,   707,   681,
+      -1,   710,    -1,    -1,    -1,    -1,  1441,    -1,    -1,  1288,
+      -1,    -1,    -1,  1448,    -1,   109,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   117,   118,   707,    -1,    -1,   710,    10,
+      11,    12,    13,    14,    -1,    -1,   745,    -1,  1499,    -1,
+      -1,   911,    -1,    -1,    -1,    -1,    -1,    -1,  1327,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,
+     182,    -1,    -1,   745,  1499,    -1,    -1,    -1,    -1,    -1,
+     192,   193,    -1,    -1,    -1,   197,    -1,   199,   200,    -1,
+     789,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,
+     799,    72,   801,    74,    75,    76,    -1,   806,    -1,    -1,
+     809,    -1,    83,    84,   813,    -1,    -1,   789,    -1,    10,
+      11,    12,    13,    14,    -1,  1394,    -1,   799,   988,   801,
+      -1,    -1,    -1,    -1,   806,    -1,    -1,   809,   109,    -1,
+     111,   813,    -1,    -1,    -1,  1005,   117,   118,    39,    -1,
+      -1,    10,    11,    12,    13,    14,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   344,    -1,   346,    -1,    -1,    -1,
+      -1,    -1,  1441,    -1,    -1,   874,    67,   357,   358,  1448,
+      39,    72,    -1,    74,    75,    76,    -1,    -1,    -1,    -1,
+      -1,    -1,    83,    84,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   874,    -1,    -1,   904,    -1,    -1,    67,    -1,
+      -1,    -1,    -1,    72,    -1,    74,    75,    76,   109,    -1,
+     111,    -1,    -1,  1083,    83,    84,   117,   118,    -1,    -1,
+    1499,    -1,   904,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   574,   575,    -1,    -1,    -1,    -1,    -1,
+     109,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,   118,
+      -1,    -1,    -1,  1123,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   603,    -1,    -1,   606,   607,    -1,   609,    -1,
+     611,   612,    -1,    -1,    -1,   616,   617,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    -1,    30,    31,    32,    33,  1017,  1018,
+      36,  1020,  1021,    39,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1224,    -1,    -1,    -1,    -1,    -1,    -1,   485,    -1,
-    1085,  1086,    -1,  1236,    -1,  1238,    -1,    -1,   635,   636,
-     637,    -1,    -1,    -1,    -1,   527,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   654,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1271,    -1,
-     527,    -1,    -1,    -1,     0,   672,  1279,  1280,  1281,  1134,
-      -1,    -1,    -1,    -1,    -1,    -1,   683,  1290,  1291,    -1,
-      -1,  1472,    -1,  1474,    -1,    -1,    -1,    -1,    -1,    -1,
-    1219,  1304,    -1,    -1,  1159,  1220,    32,    -1,    -1,   591,
-      -1,    -1,   709,    -1,    -1,   712,    -1,    -1,    -1,    -1,
-      10,    11,    12,    13,    14,    -1,    -1,    -1,  1509,    -1,
-    1511,    -1,    -1,    -1,   591,  1201,    -1,    -1,    -1,    -1,
-      -1,    -1,  1345,    -1,    70,    -1,    -1,  1202,    -1,    39,
-      -1,    -1,   749,   635,   636,   637,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1220,    -1,    -1,    -1,  1224,
-      -1,    -1,   654,  1554,    -1,  1556,    -1,    67,   635,   636,
-     637,  1236,    72,  1238,    74,    75,    76,  1242,  1569,  1570,
-     672,    -1,    -1,    83,    84,    -1,    -1,   654,   795,    -1,
-      -1,   683,    -1,    -1,    94,    -1,    -1,    -1,   805,    -1,
-     807,    -1,  1415,    -1,    -1,   812,  1271,    -1,   815,   109,
-      -1,   111,   819,    -1,  1279,  1280,  1281,   709,   118,   119,
-     712,    -1,   158,  1299,    -1,  1290,  1291,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    10,    11,    12,    13,    14,  1304,
-      -1,    -1,    -1,    -1,    -1,   712,    -1,    -1,    -1,    -1,
-      -1,  1464,    -1,    -1,    -1,    -1,    -1,   749,  1471,    -1,
-      -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1396,  1337,    -1,   881,    -1,    -1,    -1,    -1,    -1,
-    1345,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    72,    -1,    74,    75,
-      76,    -1,    -1,   795,   911,    -1,    -1,    83,    84,    -1,
-      -1,  1524,    -1,   805,    -1,   807,    -1,   253,    94,    -1,
-     812,    -1,   258,   815,    -1,    -1,    -1,   819,    -1,    -1,
-      -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,
-     807,    -1,   118,   119,    -1,    -1,    -1,    -1,   815,    -1,
-    1415,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   966,
-      -1,    54,    -1,    56,    -1,    -1,    59,    60,    61,    -1,
-      63,    -1,    -1,    -1,    -1,  1440,    10,    11,    12,    13,
-      14,    -1,    -1,    -1,    -1,    78,    -1,    -1,    -1,   881,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    90,    91,  1464,
-      -1,    -1,    -1,    -1,    -1,    39,  1471,    10,    11,    12,
-      13,    14,    -1,    -1,   881,    -1,   352,    -1,    -1,   911,
-    1027,  1028,    -1,  1030,  1031,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    67,    -1,    -1,    39,    -1,    72,    -1,
-      74,    75,    76,  1050,    -1,    -1,    -1,    -1,    -1,    83,
-      84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1524,
-      94,    -1,    -1,    -1,    67,    -1,  1531,    -1,    -1,    72,
-      -1,    74,    75,    76,   966,   109,    -1,    -1,  1085,  1086,
-      83,    84,   949,   419,   118,   119,    -1,    -1,    -1,    -1,
-      -1,    94,    -1,    10,    11,    12,    13,    14,   434,   966,
-      -1,    -1,    -1,   439,    -1,    -1,   109,    -1,    -1,    -1,
-      -1,   447,    -1,    -1,    -1,   118,   119,    -1,    -1,    -1,
-      -1,    -1,    39,    -1,    10,    11,    12,    13,    14,   465,
-      -1,    -1,    -1,    -1,    -1,  1027,  1028,    -1,  1030,  1031,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   483,    -1,   485,
-      67,    -1,  1159,    39,    -1,    72,    -1,    -1,  1050,    76,
-      -1,    -1,    -1,  1030,  1031,    -1,    83,    84,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    67,    -1,  1050,    -1,    -1,    72,    -1,    -1,    -1,
-      76,   527,   109,  1085,  1086,  1202,    -1,    83,    84,    -1,
-      -1,   118,   119,    -1,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1224,    -1,    -1,
-      -1,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,  1236,
-      -1,  1238,   118,   119,    10,    11,    12,    13,    14,    15,
+      -1,  1040,    -1,    -1,    -1,  1017,  1018,    -1,  1020,  1021,
+      -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,
+      -1,    -1,    78,    -1,    -1,    -1,     7,    -1,  1040,    10,
+      11,    12,    13,    14,    -1,    -1,  1075,  1076,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   111,    37,    38,    39,    40,
+      -1,   117,   118,  1075,  1076,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   754,   755,    66,    67,    -1,    -1,    -1,
+      -1,    72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,  1146,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   574,   575,    -1,    -1,    -1,    -1,   109,    -1,
+     111,    -1,    -1,    -1,  1146,    -1,   117,   118,   119,   120,
+     121,   122,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1189,   603,    -1,    -1,   606,   607,    -1,   609,    -1,   611,
+     612,    -1,    -1,    -1,   616,   617,    -1,    -1,    -1,    -1,
+      -1,    -1,  1211,    -1,    -1,    -1,    -1,  1189,    -1,   699,
+      -1,   701,    -1,    -1,  1223,    -1,  1225,    -1,   708,   709,
+      -1,    -1,    -1,   713,    -1,    -1,    -1,    -1,    -1,  1211,
+      -1,    -1,    -1,    -1,    -1,   725,    -1,    -1,    -1,    -1,
+     730,  1223,    -1,  1225,    -1,    -1,  1255,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,  1263,  1264,  1265,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1274,  1275,    -1,   758,    -1,
+     911,    -1,    -1,  1255,    -1,   916,    -1,    -1,    -1,  1288,
+      -1,  1263,  1264,  1265,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1274,  1275,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1288,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1327,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      49,    -1,   754,   755,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1327,    -1,    66,    -1,    -1,
+       7,    -1,    -1,    10,    11,    12,    13,    14,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   857,   858,   859,
+     860,    -1,   862,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      37,    38,    39,    40,    -1,  1394,    -1,   877,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   114,    -1,    -1,    -1,   118,
+      -1,   891,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,
+      67,    -1,  1394,    -1,    -1,    72,    -1,    -1,    -1,    76,
+      -1,    -1,    79,    80,    81,    82,    83,    84,   147,    86,
+      87,    -1,  1441,    -1,    -1,    -1,  1077,    -1,   157,  1448,
+      -1,   931,   161,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,  1441,
+     117,   118,   119,   120,   121,   122,  1448,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,   976,    30,    31,    32,
+    1499,   210,   982,    -1,   916,    -1,    39,   987,    -1,    -1,
+      -1,    -1,   992,   222,   994,    -1,    -1,    -1,   998,    -1,
+    1000,  1001,    -1,    -1,  1004,    -1,    -1,  1499,    -1,    -1,
+      -1,   240,    -1,  1013,    67,    -1,    -1,    -1,    -1,    -1,
+      -1,    74,    75,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,  1031,  1032,    -1,    -1,    -1,   265,    -1,    -1,    -1,
+      -1,    -1,    -1,   272,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,  1206,    -1,    -1,  1058,    -1,
+      -1,  1061,    -1,    -1,   117,   118,   295,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   307,    -1,
+      -1,    -1,    -1,    -1,    66,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    76,    -1,    78,    -1,    80,    -1,
+      -1,    -1,    -1,    -1,  1104,    87,    -1,    -1,    -1,    -1,
+    1110,  1111,    -1,    -1,    -1,    -1,   345,    -1,    -1,    -1,
+      -1,   350,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1130,    -1,    -1,  1133,    -1,    -1,   118,  1137,   120,   121,
+     122,    -1,    -1,    -1,    -1,  1077,    -1,    -1,    -1,    -1,
+    1150,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1163,    -1,  1165,  1166,  1167,  1168,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   161,
+      -1,  1181,    -1,  1183,    -1,    -1,    -1,  1187,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   426,   427,    -1,
+      -1,    -1,    -1,    -1,   433,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1216,  1217,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   454,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     222,    -1,   224,   225,   226,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   482,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   494,  1266,  1267,    -1,    -1,
+      -1,    -1,    -1,    -1,  1206,    -1,  1276,   506,   260,   508,
+      -1,    -1,   511,   265,   513,   514,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   526,   280,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    10,    11,    12,    13,    14,    15,
       16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,   345,    -1,   347,   591,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    39,  1271,   358,   359,  1159,    -1,    -1,
-      -1,    -1,  1279,  1280,  1281,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1290,  1291,    -1,    -1,    -1,    -1,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    -1,  1304,    -1,   635,
-     636,   637,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-    1202,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   654,    -1,
-      37,    38,    -1,    40,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1224,    -1,  1201,  1202,   672,    -1,  1345,    -1,
-      -1,    -1,    -1,    -1,  1236,    -1,  1238,   683,    -1,    66,
-      -1,    -1,    -1,    -1,    -1,    72,    -1,  1224,    -1,    76,
-      -1,    -1,    79,    80,    81,    82,    83,    84,    -1,    86,
-      87,    -1,    -1,   709,    -1,  1242,   712,    94,    -1,  1271,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1279,  1280,  1281,
-      -1,    -1,   109,    -1,   111,    -1,    -1,   114,  1290,  1291,
-      -1,   118,   119,   120,   121,   122,   123,    -1,  1415,    -1,
-      -1,    -1,  1304,   749,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1290,  1291,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1299,    -1,    -1,    -1,    -1,  1304,    -1,    -1,
+      26,    27,    28,    -1,    30,    31,    32,  1337,    -1,  1339,
+    1340,  1341,    -1,    39,    -1,    -1,   328,    -1,    -1,   578,
+      -1,  1351,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1360,   590,    -1,    -1,    -1,   594,    -1,    -1,   350,    -1,
+      -1,    67,    -1,   355,   356,    -1,    72,    -1,    74,    75,
+      76,   363,    78,    -1,    -1,  1385,    -1,    83,    84,    -1,
+      -1,   620,    -1,    -1,   147,    -1,   625,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   157,   634,   635,   636,    -1,    44,
+      -1,    -1,    -1,   109,    -1,   111,   169,   170,    -1,    -1,
+      -1,   117,   118,   652,   406,    -1,    -1,    -1,  1428,  1429,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1345,    -1,    -1,    -1,  1464,    -1,   795,
-      -1,    -1,    -1,    -1,  1471,    -1,    -1,    -1,    -1,   805,
-    1337,   807,    -1,    -1,    -1,    -1,   812,    -1,    -1,   815,
-      -1,    -1,    -1,   819,    -1,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    67,    -1,    39,    -1,    -1,  1524,    -1,    -1,
-      -1,    -1,    77,  1415,    79,    -1,    81,    -1,    -1,    -1,
-      -1,    -1,    -1,    88,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    67,    -1,    -1,   881,    -1,    72,  1415,    74,
-      75,    76,    -1,    78,    -1,    -1,    -1,    -1,    83,    84,
-      -1,    -1,    -1,    -1,   119,    -1,   121,   122,   123,    94,
-      -1,    -1,  1464,  1440,    -1,   911,    -1,    -1,    -1,  1471,
-      -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    26,
-      27,    28,    -1,   118,   119,    -1,    -1,  1464,    -1,    -1,
-      -1,    -1,    37,    38,  1471,    40,    -1,   162,   701,    -1,
-     703,    -1,    -1,    -1,    -1,    -1,    -1,   710,   711,    -1,
-      -1,    -1,   715,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     966,    66,  1524,    50,   727,    -1,    -1,    72,    -1,   732,
-      -1,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      67,    86,    87,    -1,    -1,    -1,    -1,  1524,    -1,    94,
-      -1,    -1,    -1,   100,    -1,   102,    -1,    -1,   223,   762,
-     225,   226,   227,    -1,   109,    -1,   111,    -1,    -1,    -1,
-      -1,    -1,   117,   118,   119,   120,   121,   122,   123,    -1,
-     127,  1027,  1028,    -1,  1030,  1031,    -1,    -1,   115,    -1,
-      -1,    -1,   119,    -1,    -1,    -1,   261,    -1,    -1,    -1,
-      -1,   266,    -1,    -1,  1050,    -1,    -1,    -1,   284,    -1,
-     286,   287,    -1,    -1,    -1,    -1,   281,    -1,   294,   295,
-      -1,   148,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   158,   308,   309,    -1,   162,   183,    -1,    -1,  1085,
-    1086,    -1,    -1,    -1,   191,    -1,   193,   194,    -1,    -1,
-      -1,   198,    -1,   200,   201,    -1,    -1,    -1,    -1,    -1,
-     863,   864,   865,   866,   329,   868,    -1,    -1,    -1,    -1,
-     346,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   884,    -1,    -1,   211,    -1,   351,    -1,    -1,    -1,
-      -1,   356,   357,    -1,    -1,   898,   223,    -1,    -1,   364,
-      -1,    -1,    -1,    -1,    -1,    -1,   382,    -1,    -1,    -1,
-      -1,    -1,    -1,  1159,   241,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   270,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   938,    -1,    -1,    -1,   266,
-      -1,    -1,   407,    -1,    -1,    -1,   273,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1202,    -1,    -1,    -1,
-     425,    -1,    -1,    -1,    -1,   430,    -1,   432,    -1,   296,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1224,    -1,
-      -1,   308,   985,    -1,   449,    -1,    -1,   452,   453,   992,
-    1236,    -1,  1238,    -1,   997,   460,    -1,    -1,    -1,  1002,
-      -1,  1004,    -1,    -1,    -1,  1008,    -1,  1010,  1011,   474,
-      -1,  1014,    -1,    -1,    -1,    -1,   481,    -1,    -1,   346,
-    1023,    -1,    -1,    -1,   351,  1271,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1279,  1280,  1281,    -1,    -1,  1041,  1042,
-      -1,    -1,    -1,    -1,  1290,  1291,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1304,    -1,
-      -1,    -1,    -1,    -1,    -1,  1068,    -1,    -1,  1071,    -1,
-      -1,    -1,    -1,    -1,   550,   551,   552,   553,   554,   555,
-     556,   557,   558,   559,   560,   561,   562,   563,   564,   565,
-     566,   567,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1345,
-     427,   428,    -1,    -1,    -1,    -1,    -1,   434,    -1,    -1,
-      -1,  1114,    -1,    -1,    -1,    -1,    -1,  1120,  1121,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   455,  1132,
-     595,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1142,
-      -1,    -1,  1145,    -1,  1147,    -1,    -1,  1150,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   483,    -1,   623,    -1,
-    1163,    -1,    -1,   628,    -1,    -1,    -1,    -1,   495,  1415,
-      -1,    -1,    -1,  1176,    -1,  1178,  1179,  1180,  1181,    -1,
-     507,    -1,   509,    -1,    -1,   512,    -1,   514,   515,    -1,
-      -1,  1194,    -1,  1196,    -1,    -1,    -1,  1200,    -1,    -1,
-     527,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1464,    -1,
-      -1,   697,    -1,    -1,    -1,  1471,  1229,  1230,   575,   576,
-      -1,    -1,    -1,    -1,    -1,   700,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   714,
-      -1,    -1,   579,    -1,    -1,    -1,    -1,   604,    -1,    -1,
-     607,   608,    -1,   610,   591,   612,   613,    -1,   595,   734,
-     617,   618,    -1,    -1,    -1,    -1,    -1,    -1,  1524,  1282,
-    1283,    -1,    -1,    -1,   760,    -1,    -1,    -1,    -1,  1292,
-      -1,    -1,    -1,    -1,   621,    -1,    -1,    -1,    -1,   626,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   635,   636,
-     637,    -1,    -1,    -1,    -1,    -1,   792,    -1,    -1,     7,
-      -1,    -1,    10,    11,    12,    13,    14,   654,    -1,    -1,
-      -1,    -1,    -1,    -1,   799,    -1,    -1,    -1,    -1,    -1,
-    1343,    -1,    45,    -1,    -1,    -1,   811,    -1,    -1,    37,
-      38,    39,    40,  1356,    -1,  1358,  1359,  1360,    -1,   686,
-      -1,    -1,    -1,    -1,    -1,   830,    -1,  1370,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1379,    -1,    66,    67,
-      -1,    -1,    -1,    -1,    72,   712,    -1,   714,    76,    -1,
-      93,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
-     103,    -1,    -1,  1406,    -1,    -1,    94,    -1,    -1,    -1,
-      -1,   758,   759,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   109,   749,   111,    -1,    -1,    -1,    -1,    -1,    -1,
-     118,   119,   120,   121,   122,   123,    -1,   913,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1451,  1452,
-      -1,    -1,    -1,    -1,    -1,    -1,   159,    -1,    -1,    -1,
-      -1,  1464,    -1,    -1,    -1,    -1,    -1,    -1,  1471,    -1,
-     173,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   944,
-     807,    -1,   958,    -1,   811,    -1,    -1,    -1,   815,    -1,
-      -1,    -1,    -1,   196,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1504,    -1,    -1,    -1,  1508,    -1,   210,    -1,    -1,
-      -1,   976,    -1,    -1,    -1,    -1,   219,    -1,    -1,    -1,
-     996,    -1,    -1,    -1,    -1,    -1,   229,    -1,    -1,    -1,
-      -1,    -1,    -1,  1009,  1537,    -1,  1539,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1012,    -1,    -1,
-      -1,   254,    -1,    -1,    -1,    -1,   259,    -1,  1023,    -1,
-      -1,    -1,    -1,    -1,  1567,  1568,    -1,    -1,    -1,   272,
-      -1,   918,  1575,  1576,  1050,   278,   923,   280,    -1,    -1,
-      -1,    -1,    -1,    -1,   911,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   297,    -1,    -1,    -1,    -1,   926,
+      -1,  1441,   424,    -1,    -1,    -1,    -1,   429,  1448,   431,
+      37,    38,    -1,    40,    -1,   684,    -1,    92,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   448,   102,    -1,   451,
+     452,    -1,    -1,    -1,    -1,    -1,    -1,   459,    -1,    66,
+    1480,   710,    -1,   712,  1484,    72,    -1,   240,    -1,    76,
+      -1,   473,    79,    80,    81,    82,    83,    84,   480,    86,
+      87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   264,  1512,    -1,  1514,    -1,   745,    -1,    -1,    -1,
+      -1,    -1,   109,   158,   111,    -1,    -1,   114,    -1,    -1,
+     117,   118,   119,   120,   121,   122,    -1,   172,    -1,    -1,
+      -1,    -1,  1542,  1543,    -1,    -1,    -1,    -1,    -1,    -1,
+    1550,  1551,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     195,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   801,    -1,   209,    -1,   805,    -1,    -1,    -1,
+     809,    -1,    -1,   218,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   228,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    37,    38,    -1,    40,    -1,    -1,
+      -1,    -1,   594,    -1,    -1,    -1,    -1,    -1,   253,    -1,
+      -1,    -1,    -1,   258,    -1,    -1,    -1,   380,    -1,    -1,
+      -1,    -1,    -1,    66,    -1,    -1,   271,    -1,    -1,    72,
+     622,    -1,   277,    76,   279,   627,    79,    80,    81,    82,
+      83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,
+      -1,   296,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   904,   109,    -1,   111,    -1,
+      -1,    -1,    -1,   116,   117,   118,   119,   120,   121,   122,
+     919,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   338,    -1,    -1,    -1,    -1,   343,    -1,
+      -1,    -1,    -1,    -1,   943,    -1,   698,    -1,    -1,    -1,
+      -1,   474,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     712,    -1,    -1,    -1,    -1,    -1,    -1,   372,    -1,    -1,
+      -1,   376,   377,    -1,   379,    -1,    -1,    -1,    -1,    -1,
+     732,   386,   387,    -1,   389,   390,    -1,   392,    -1,   394,
+     513,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     999,    -1,    -1,   526,    -1,    -1,   411,    -1,   531,    -1,
+      -1,   534,    -1,    -1,   419,    -1,    -1,    -1,    -1,    -1,
+      -1,  1020,  1021,   546,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   444,
+      -1,   793,    -1,    -1,    -1,   568,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   805,    -1,   578,    -1,    -1,    -1,    -1,
+      -1,    -1,   585,    -1,    -1,   470,    -1,   590,    -1,    -1,
+      -1,   476,   824,    -1,    -1,    -1,   481,    -1,    -1,    -1,
+      -1,  1080,    -1,    -1,    -1,    -1,     3,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,   517,    30,    31,    32,   639,    -1,    -1,    -1,
+      -1,    -1,    39,    -1,   647,    -1,    -1,   532,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    37,    38,    -1,    40,    -1,    -1,
-      -1,    -1,    -1,   950,    -1,    -1,    -1,    -1,    -1,    -1,
-    1095,    -1,    -1,    -1,    -1,    -1,   339,    -1,    -1,   966,
-      -1,   344,    -1,    66,  1109,    -1,    -1,    -1,    -1,    72,
-      -1,  1127,    -1,    76,    -1,    -1,    79,    80,    81,    82,
-      83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,
-     373,    94,    -1,    -1,   377,   378,    -1,   380,    -1,    -1,
-      -1,    -1,  1009,    -1,   387,   388,   109,   390,   391,    -1,
-     393,    -1,   395,    -1,    -1,   118,   119,   120,   121,   122,
-     123,    -1,    -1,  1030,  1031,    -1,    -1,    -1,    -1,   412,
-      -1,    -1,    -1,    -1,  1190,  1191,    -1,   420,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1146,    -1,    -1,
+      67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,    -1,
+      -1,    -1,    -1,    37,    38,   570,    40,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   579,    -1,    -1,    -1,    -1,    -1,
+      -1,   586,    -1,    -1,    -1,   937,    -1,   592,    -1,  1188,
+      -1,    -1,    66,    -1,   111,    -1,   601,    -1,    72,    -1,
+     117,   118,    76,    -1,    -1,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,   967,    -1,    -1,    -1,    -1,
+      -1,    -1,   745,    -1,   747,    -1,  1225,    -1,    -1,   156,
+     157,    -1,    -1,    -1,   757,   109,   641,   111,    -1,    -1,
+     763,    -1,    -1,   117,   118,   119,   120,   121,   122,    -1,
+    1002,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,  1013,    -1,   190,    -1,    -1,    -1,    -1,    -1,    -1,
+     197,    -1,   677,    -1,    -1,  1274,  1275,    -1,    -1,    -1,
+     685,    -1,   805,   806,  1283,    -1,   809,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   283,
+     823,   285,   286,    -1,    -1,    -1,    -1,    -1,    -1,   293,
+     294,   716,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   726,   727,   307,   308,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1085,    -1,    -1,    -1,    -1,    -1,    -1,
+     863,    -1,   269,    -1,   867,    -1,    -1,  1099,    -1,    -1,
+      -1,    -1,    -1,    -1,   759,    -1,    -1,    -1,    -1,   764,
+      -1,   345,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,   904,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,
+      -1,    39,    40,    -1,    -1,  1394,   323,   381,    -1,    -1,
+      -1,    -1,    -1,    -1,   331,   332,    -1,   334,   335,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   345,    67,
+     943,    -1,   349,   828,    -1,    -1,    74,    75,    -1,    -1,
+     835,    -1,    -1,    -1,    -1,    -1,  1188,    -1,    -1,    -1,
+      -1,   368,    -1,   848,   371,   850,    -1,    -1,   971,    -1,
+      -1,  1450,    -1,  1452,   977,    -1,    -1,    -1,   981,   864,
+      -1,    -1,    -1,   111,    -1,   870,    -1,   115,    -1,   117,
+     118,   398,    -1,    -1,    -1,   402,    -1,   882,    -1,  1002,
+     885,    -1,    -1,    -1,    -1,    -1,    -1,  1486,    -1,  1488,
+    1013,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   433,    -1,    -1,    -1,
+      -1,    -1,  1035,    -1,  1037,    -1,  1515,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1052,
+    1053,  1283,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+    1073,    -1,   479,    -1,    -1,   482,    -1,   962,    -1,    -1,
+      -1,    39,    -1,    -1,    -1,   549,   550,   551,   552,   553,
+     554,   555,   556,   557,   558,   559,   560,   561,   562,   563,
+     564,   565,   566,    -1,    -1,    -1,    -1,    37,    38,    67,
+      40,    -1,   997,    -1,   521,    -1,    -1,    -1,   525,   526,
+      -1,    -1,    -1,    -1,    -1,  1128,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    66,    -1,    -1,    -1,
+      -1,    -1,    72,  1146,    -1,    -1,    76,    -1,    -1,    79,
+      80,    81,    82,    83,    84,    -1,    86,    87,  1161,  1162,
+      -1,    -1,    -1,   570,   571,    -1,    -1,    -1,    -1,    -1,
+    1055,    -1,    -1,    -1,    -1,    -1,  1061,    -1,    -1,   109,
+      -1,   111,   589,   590,   114,    -1,    -1,   117,   118,   119,
+     120,   121,   122,   600,    -1,   602,   603,    -1,    -1,    -1,
+      -1,    -1,   609,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    1095,    -1,   619,   620,    -1,  1100,    -1,    -1,   625,    -1,
+      -1,    -1,    -1,  1108,    -1,    -1,    -1,   634,   635,   636,
+      -1,   695,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   652,    -1,    -1,    -1,    -1,
+     657,   658,    -1,    -1,   661,   662,  1141,    -1,    -1,    -1,
+      -1,   668,    -1,    -1,    -1,    -1,    -1,    -1,  1153,    -1,
+      -1,  1156,    -1,  1158,    -1,    -1,    -1,    -1,    -1,    -1,
+     687,    -1,    -1,    -1,    -1,    -1,    -1,  1172,  1173,    -1,
+      -1,    -1,   756,    -1,    -1,    -1,    -1,    -1,  1530,  1302,
+      -1,    -1,  1305,   710,   711,    -1,    -1,    -1,    -1,  1194,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1201,    -1,    -1,    -1,
-    1087,    -1,   445,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   786,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   744,   745,    -1,
+      -1,    -1,   749,   750,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1241,    -1,    -1,    -1,
+      -1,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      -1,    30,    31,    32,    -1,    -1,   793,    -1,    -1,    -1,
+      39,    -1,    -1,    -1,   801,    -1,    -1,    -1,    -1,    -1,
+      -1,   808,   809,    -1,    -1,   812,    -1,   814,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   824,    67,    -1,
+      -1,    -1,    -1,    72,    -1,    74,    75,    76,    -1,    78,
+      -1,  1316,    -1,  1318,    83,    84,    -1,    -1,    -1,    -1,
+      -1,    -1,   906,    -1,    -1,  1330,    -1,  1332,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1090,    -1,    -1,    -1,    -1,   471,    -1,
-      -1,    -1,    -1,    -1,   477,    -1,    -1,     0,    -1,   482,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
-      33,    -1,    -1,    36,    -1,   518,    39,    40,    -1,    -1,
+      -1,    -1,   111,    -1,  1349,    -1,    -1,    -1,   117,   118,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     533,    -1,  1159,    -1,  1299,    -1,    -1,    -1,    -1,    -1,
-      -1,    64,    -1,    -1,    67,    -1,    69,    -1,    71,    72,
-      -1,    74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,
-      83,    84,    -1,    -1,    -1,    -1,    -1,    -1,   571,    -1,
-      -1,    94,  1219,    -1,  1201,    -1,    -1,   580,    -1,   157,
-     158,    -1,    -1,    -1,   587,    -1,   109,    -1,   111,    -1,
-     593,    -1,    -1,    -1,    -1,   118,   119,    -1,    -1,   602,
+    1365,  1366,    -1,    -1,    -1,    -1,    -1,   951,    -1,   896,
+      -1,  1376,    -1,    -1,  1379,    -1,   903,   904,   905,    -1,
+     907,    -1,    -1,    -1,   911,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,  1515,    -1,    -1,  1400,    -1,    -1,    -1,    -1,
+      -1,    -1,   986,    -1,  1409,   932,   933,  1412,    -1,  1414,
+    1415,  1416,    -1,    -1,    -1,   999,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    -1,    -1,    -1,    -1,    -1,
+     967,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,  1454,
+      -1,  1456,    -1,  1458,    -1,    -1,  1040,    -1,    -1,    -1,
+      -1,   988,   989,    -1,    -1,    -1,    -1,    -1,  1473,    -1,
+      -1,    -1,   999,    67,    -1,    -1,    -1,    -1,  1005,  1006,
+      -1,  1008,  1009,  1010,    78,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,  1020,  1021,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,  1117,    30,    31,    32,    33,    -1,    -1,
+      36,    37,    38,    39,    40,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,  1083,    -1,  1085,    -1,
+      -1,    -1,    -1,  1090,    -1,    -1,    -1,    -1,    -1,    -1,
+      66,    67,  1099,    69,    -1,    71,    72,    -1,    74,    75,
+      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
+      86,    87,    -1,  1177,  1178,  1122,  1123,  1124,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1238,    -1,   191,    -1,    -1,    -1,    -1,    -1,    -1,
-     198,    -1,    -1,    -1,    -1,  1401,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     643,    -1,    -1,  1419,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1290,  1291,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1299,    -1,    -1,    -1,   679,    -1,    -1,    -1,
-      66,    -1,    -1,    -1,   687,    -1,    72,    -1,    -1,    -1,
-      76,    -1,   270,    79,    80,    81,    82,    83,    84,    -1,
-      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    -1,    -1,    -1,   718,  1492,  1493,    -1,    -1,
-      -1,    -1,    -1,   109,    -1,   728,   729,    -1,    -1,    -1,
-      -1,    -1,   118,   119,   120,   121,   122,   123,    -1,   742,
-      -1,    -1,    -1,    -1,    -1,    -1,   324,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   332,   333,    -1,   335,   336,    -1,
-     763,    -1,   765,    -1,    -1,    -1,   769,    -1,   346,    -1,
-      -1,    -1,   350,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1415,    -1,
-    1555,   369,    -1,    -1,   372,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    -1,    30,    31,    32,    -1,    -1,
-      -1,   399,    -1,    -1,    39,   403,    -1,    -1,    -1,    -1,
-      -1,   834,    -1,    -1,    -1,    -1,    -1,    -1,   841,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1473,    -1,  1475,    -1,
-      -1,   854,    67,   856,    -1,    -1,   434,    72,    -1,    74,
-      75,    76,    -1,    78,    -1,    -1,    -1,   870,    83,    84,
-      -1,    -1,    -1,    -1,   877,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,  1510,   148,  1512,   889,    -1,    -1,   892,
-      -1,    -1,    -1,    -1,   158,    -1,   111,    -1,    -1,    -1,
-      -1,    -1,   480,   118,   119,   483,   170,   171,    -1,    -1,
-      -1,    -1,    -1,  1540,     3,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
-      -1,    30,    31,    32,   522,    -1,    -1,    -1,   526,   527,
-      39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   971,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   241,    67,    -1,
-      69,    -1,    71,    -1,    -1,    74,    75,    -1,    -1,    -1,
-      -1,    -1,    -1,   571,   572,    -1,    -1,    -1,    -1,    -1,
-      -1,   265,    -1,    -1,  1007,    94,    -1,    -1,    -1,    -1,
-      -1,    -1,   590,   591,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   111,   601,    -1,   603,   604,    -1,    -1,   118,
-     119,    -1,   610,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   620,   621,    -1,    -1,    -1,    -1,   626,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   635,   636,   637,
-      -1,    -1,  1065,    -1,    -1,    -1,    -1,    -1,  1071,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   654,    -1,    -1,    -1,
-      -1,   659,   660,    -1,    -1,   663,   664,    -1,    -1,    -1,
-      -1,    -1,   670,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1105,    -1,    -1,    -1,    -1,  1110,    -1,    -1,
-      -1,   689,    -1,    -1,    -1,  1118,    -1,   381,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   712,   713,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1154,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,  1166,    -1,    -1,  1169,    -1,  1171,    -1,
-     748,   749,    -1,    -1,    -1,   753,   754,    -1,    -1,    -1,
-      -1,    -1,  1185,  1186,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,  1207,    -1,    -1,    -1,    -1,    -1,
-      -1,   475,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,
-      -1,   799,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   807,
-      -1,    -1,    -1,    -1,    -1,    -1,   814,   815,    -1,    -1,
-     818,    66,   820,    -1,    -1,    -1,    -1,    72,    -1,    -1,
-     514,    76,   830,  1256,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,   527,    -1,    -1,    -1,    -1,   532,    94,
-      -1,   535,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   546,   547,   109,    -1,   111,    -1,    -1,    -1,
-      -1,   116,    -1,   118,   119,   120,   121,   122,   123,    -1,
-      -1,    -1,    -1,    -1,    -1,   569,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   579,    -1,    -1,    -1,    -1,
-      -1,    -1,   586,    -1,    -1,   903,    -1,   591,    -1,  1332,
-      -1,  1334,   910,   911,   912,    -1,   914,    -1,    -1,    -1,
-     918,    -1,    -1,    -1,    -1,  1348,    -1,  1350,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   939,   940,    -1,    -1,  1368,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   640,    -1,    -1,    -1,
-      -1,  1384,  1385,    -1,    -1,   649,    -1,    -1,   966,    -1,
-      -1,    -1,  1395,    -1,    -1,  1398,    -1,    -1,   976,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,  1421,    -1,
-     998,   999,    -1,    -1,    -1,    -1,    -1,  1430,    39,    -1,
-    1433,  1009,  1435,  1436,  1437,    -1,    -1,  1015,  1016,    -1,
-    1018,  1019,  1020,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1030,  1031,    -1,    -1,    67,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    78,    -1,    -1,
-      -1,    -1,    -1,    -1,  1477,    -1,  1479,    -1,  1481,    -1,
-      -1,    -1,    -1,    -1,    -1,   749,    -1,   751,    -1,    -1,
-      -1,    -1,    -1,    -1,  1497,    -1,    -1,   761,    -1,    -1,
-      -1,    -1,    -1,    -1,   768,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,  1093,    -1,  1095,    -1,    -1,
-      -1,    -1,  1100,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1109,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     7,
-      -1,    -1,    10,    11,    12,    13,    14,   811,   812,    -1,
-      -1,   815,    -1,    -1,    -1,    -1,  1134,  1135,  1136,    -1,
-      -1,    -1,    -1,    -1,    -1,   829,    -1,    -1,    -1,    37,
-      38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1159,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,
-      -1,    -1,    -1,    -1,    72,   869,    -1,    -1,    76,   873,
-      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
-      -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   109,  1220,   111,    -1,    -1,    -1,   911,    -1,    -1,
-     118,   119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,
-    1238,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,   950,    30,    31,    32,
-      -1,    -1,    -1,    -1,    37,    38,    39,    40,    -1,    -1,
-      -1,    -1,   966,   967,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,  1290,  1291,    -1,    -1,   980,    -1,    -1,    -1,
-      -1,    -1,   986,    66,    67,   989,    69,   991,    71,    72,
-      -1,    74,    75,    76,    -1,    -1,    79,    80,    81,    82,
-      83,    84,    -1,    86,    87,    -1,    -1,    -1,  1012,    -1,
-      -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,  1023,
-      -1,    37,    38,    -1,    40,    -1,   109,    -1,   111,    -1,
-      -1,    -1,    -1,   116,    -1,   118,   119,   120,   121,   122,
-     123,  1045,    -1,  1047,    -1,    -1,    -1,    -1,    -1,    -1,
-      66,    -1,    -1,    -1,    -1,    -1,    72,    -1,  1062,  1063,
-      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
-      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,  1083,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   109,    -1,   111,    -1,  1415,   114,    -1,
-      -1,    -1,   118,   119,   120,   121,   122,   123,    -1,    -1,
-      -1,     3,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,  1140,    -1,    30,    31,
-      32,    33,    -1,    -1,    36,    -1,    -1,    39,    40,    -1,
-      -1,    -1,    -1,    -1,    -1,  1159,    -1,    -1,    -1,    -1,
-      -1,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,    -1,
-    1174,  1175,    64,    -1,    -1,    67,    -1,    69,    -1,    71,
-      72,    -1,    74,    75,    76,    -1,    -1,  1505,    -1,    -1,
-      66,    83,    84,    -1,    -1,    -1,    72,    -1,    -1,    -1,
-      76,    -1,    94,    79,    80,    81,    82,    83,    84,    -1,
-      86,    87,  1530,  1531,    -1,    -1,    -1,   109,    94,   111,
-      -1,    -1,    -1,   115,    -1,    -1,   118,   119,    -1,    -1,
-      -1,    -1,    -1,   109,    -1,   111,    -1,  1555,    -1,    -1,
-      -1,    -1,   118,   119,   120,   121,   122,   123,    -1,    -1,
-    1254,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
-      31,    32,    33,    -1,    -1,    36,    37,    38,    39,    40,
-      41,    -1,    43,    -1,    -1,    46,    47,    48,    49,    50,
-      51,    52,    53,    -1,    -1,    -1,    57,    -1,    -1,    -1,
-      61,    62,    -1,    64,  1318,    66,    67,  1321,    69,    -1,
-      71,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,
-     111,    -1,    -1,   114,    -1,    -1,    -1,   118,   119,   120,
-     121,   122,   123,    -1,    -1,    -1,    -1,   128,    -1,    -1,
-      -1,   132,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,  1405,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,
+      -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,  1146,
+      -1,   117,   118,   119,   120,   121,   122,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   132,    -1,     3,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    -1,    -1,    30,    31,    32,    33,    -1,
-      -1,    36,    37,    38,    39,    40,    10,    11,    12,    13,
+      -1,    36,    37,    38,    39,    40,    41,    -1,    43,    -1,
+    1207,    46,    47,    48,    49,    50,    51,    52,    53,    -1,
+      -1,    -1,    57,    -1,    -1,    -1,    61,    62,  1225,    64,
+      -1,    66,    67,    -1,    69,    -1,    71,    72,    -1,    74,
+      75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
+      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   109,    -1,   111,  1274,  1275,   114,
+      -1,    -1,   117,   118,   119,   120,   121,   122,    -1,    -1,
+      -1,    -1,   127,    -1,    -1,    -1,    -1,   132,    -1,    -1,
+      -1,    -1,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    -1,  1382,    30,
+      31,    32,    33,    -1,    -1,    36,    37,    38,    39,    40,
+      -1,    -1,    -1,    -1,  1398,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    66,    67,    -1,    69,    -1,
+      71,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,  1394,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,
+     111,    -1,    -1,    -1,  1468,  1469,   117,   118,   119,   120,
+     121,   122,    -1,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
+      31,    32,    -1,    -1,    -1,    -1,    37,    38,    39,    40,
+      -1,    -1,    -1,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    28,    -1,    -1,  1481,    66,    67,    -1,    69,    -1,
+      71,    72,    39,    74,    75,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,    -1,  1505,  1506,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,
+     111,    78,    -1,  1530,    -1,   116,   117,   118,   119,   120,
+     121,   122,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,    -1,    -1,    -1,    -1,    37,    38,    39,    40,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
+      31,    32,    -1,    -1,    66,    67,    -1,    69,    39,    71,
+      72,    -1,    74,    75,    76,    -1,    -1,    79,    80,    81,
+      82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,
+      -1,    72,    -1,    74,    75,    -1,    -1,   109,    -1,   111,
+      -1,    -1,    83,    84,   116,   117,   118,   119,   120,   121,
+     122,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
+      -1,    -1,    -1,    -1,    37,    38,    39,    40,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,    -1,    -1,    66,    67,    -1,    69,    39,    71,    72,
+      -1,    74,    75,    76,    -1,    -1,    79,    80,    81,    82,
+      83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
+      -1,    -1,    74,    75,    -1,    -1,   109,    -1,   111,    -1,
+      -1,    -1,    -1,   116,   117,   118,   119,   120,   121,   122,
+       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
       24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
-      -1,    66,    67,    -1,    69,    39,    71,    72,    -1,    74,
-      75,    76,    -1,  1487,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    72,    -1,
-      74,    75,    -1,    -1,   109,    -1,   111,    -1,    -1,    83,
-      84,    -1,    -1,   118,   119,   120,   121,   122,   123,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,  1540,   132,     3,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    33,    -1,
-      -1,    36,    37,    38,    39,    40,    -1,    -1,    -1,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    28,    -1,    -1,
-      -1,    66,    67,    -1,    69,    -1,    71,    72,    39,    74,
-      75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   109,    -1,   111,    78,    -1,    -1,
-      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    37,    38,    39,    40,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
-      -1,    66,    67,    -1,    69,    39,    71,    72,    -1,    74,
-      75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,
-      74,    75,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,
-      -1,   116,    -1,   118,   119,   120,   121,   122,   123,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    37,    38,    39,    40,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
-      -1,    66,    67,    -1,    69,    39,    71,    72,    -1,    74,
-      75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,
-      74,    75,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,
-      -1,   116,    -1,   118,   119,   120,   121,   122,   123,     4,
+      -1,    -1,    -1,    37,    38,    39,    40,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
+      -1,    -1,    66,    67,    -1,    69,    39,    71,    72,    -1,
+      74,    75,    76,    -1,    -1,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,
+      -1,    74,    75,    -1,    -1,   109,    -1,   111,    -1,    -1,
+      -1,    -1,    -1,   117,   118,   119,   120,   121,   122,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
@@ -3717,44 +3584,32 @@
       -1,    66,    67,    -1,    69,    -1,    71,    72,    -1,    74,
       75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
+      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    37,    38,    39,    40,    -1,    -1,    -1,    -1,
+      -1,    -1,   117,   118,   119,   120,   121,   122,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
+      -1,    37,    38,    39,    40,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    66,    67,    -1,    69,    -1,    71,    72,    -1,    74,
-      75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
+      66,    67,    -1,    69,    -1,    71,    72,    -1,    74,    75,
+      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
+      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    37,    38,    39,    40,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,
+      -1,   117,   118,   119,   120,   121,   122,     4,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
+      37,    38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,
+      67,    -1,    69,    -1,    71,    72,    -1,    74,    75,    76,
+      -1,    -1,    79,    80,    81,    82,    83,    84,    -1,    86,
+      87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    66,    67,    -1,    69,    -1,    71,    72,    -1,    74,
-      75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    37,    38,    39,    40,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    66,    67,    -1,    69,    -1,    71,    72,    -1,    74,
-      75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,     3,
+      -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,
+     117,   118,   119,   120,   121,   122,     0,    -1,    -1,     3,
        4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
       14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
@@ -3766,65 +3621,320 @@
       74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    83,
       84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,
-      -1,    -1,    -1,    -1,   118,   119,     3,     4,     5,     6,
+      -1,    -1,    -1,   117,   118,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    33,    -1,    -1,    36,    -1,
+      -1,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    64,    -1,    -1,    67,
+      -1,    69,    -1,    71,    72,    -1,    74,    75,    76,    -1,
+      -1,    -1,    -1,    -1,    -1,    83,    84,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    -1,   115,    -1,   117,
+     118,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,    33,    -1,    -1,    36,    -1,    -1,    39,    40,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    64,    -1,    -1,    67,    -1,    69,    -1,    71,
+      72,    -1,    74,    75,    76,    -1,    -1,    -1,    -1,    -1,
+      -1,    83,    84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,
+      -1,    -1,    -1,    -1,    -1,   117,   118,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,    -1,    30,    31,    32,    33,    -1,    -1,
+      36,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,
+      -1,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
+      -1,    -1,    -1,    -1,    -1,   111,    39,    -1,    -1,    -1,
+      -1,   117,   118,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,    72,
+      -1,    74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,
+      83,    84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,
+      -1,    -1,    -1,    -1,   117,   118,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,
+      -1,    39,    -1,    -1,    -1,    -1,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    67,
+      -1,    69,    -1,    71,    -1,    39,    74,    75,    -1,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    67,    -1,    30,    31,    32,    -1,    -1,
+      74,    75,   110,   111,    39,    -1,    -1,    -1,    -1,   117,
+     118,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    69,   109,    71,   111,    -1,    74,
+      75,    -1,    -1,   117,   118,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,
+      -1,    -1,   117,   118,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,    39,
+      -1,    -1,    -1,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    67,    -1,    69,
+      -1,    71,    39,    40,    74,    75,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    96,    -1,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    -1,
+      -1,   111,    -1,    -1,    -1,    -1,    -1,   117,   118,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,   111,    30,    31,    32,   115,    -1,
+     117,   118,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,
+      75,    -1,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,    -1,    -1,    -1,    -1,    -1,   111,    39,    -1,    -1,
+      -1,    -1,   117,   118,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,
+      -1,    -1,    74,    75,    -1,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
+      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,   111,
+      39,    -1,    -1,    -1,    -1,   117,   118,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,
+      69,    -1,    71,    -1,    -1,    74,    75,    -1,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
+      -1,    -1,   111,    39,    -1,    -1,    -1,    -1,   117,   118,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    -1,    -1,    -1,    37,    38,    39,
+      40,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,
+      -1,   117,   118,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    66,    67,    -1,    -1,
+      -1,    -1,    72,    -1,    74,    75,    76,    -1,    -1,    79,
+      80,    81,    82,    83,    84,    -1,    86,    87,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,
+      -1,   111,    -1,    -1,   114,    -1,    -1,   117,   118,   119,
+     120,   121,   122,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
+      37,    38,    39,    40,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    66,
+      67,    -1,    -1,    39,    -1,    72,    -1,    74,    75,    76,
+      -1,    -1,    79,    80,    81,    82,    83,    84,    -1,    86,
+      87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    67,    -1,    -1,    -1,    -1,    72,    -1,    74,    75,
+      76,    -1,   109,   110,   111,    -1,    -1,    83,    84,    -1,
+     117,   118,   119,   120,   121,   122,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,   111,    30,    31,    32,    -1,
+      -1,   117,   118,    37,    38,    39,    40,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
+      -1,    -1,    66,    67,    -1,    -1,    39,    -1,    72,    -1,
+      74,    75,    76,    -1,    -1,    79,    80,    81,    82,    83,
+      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,    72,
+      -1,    74,    75,    -1,    -1,   109,    -1,   111,    -1,    -1,
+      83,    84,    -1,   117,   118,   119,   120,   121,   122,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    -1,   111,    30,
+      31,    32,    -1,    -1,   117,   118,    37,    38,    39,    40,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    -1,    66,    67,    -1,    -1,    39,
+      40,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
+      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,
+      -1,    -1,    -1,    -1,    74,    75,    -1,    -1,   109,    -1,
+     111,    -1,    -1,    -1,    -1,    -1,   117,   118,   119,   120,
+     121,   122,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,   111,    30,    31,    32,   115,    -1,   117,   118,    37,
+      38,    39,    40,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    -1,    -1,    30,    31,    32,    -1,    -1,    66,    67,
+      -1,    -1,    39,    -1,    72,    -1,    74,    75,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    -1,
+      -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,   117,
+     118,   119,   120,   121,   122,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,   111,    30,    31,    32,    -1,    -1,
+     117,   118,    37,    38,    39,    40,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    10,    11,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    66,    67,    30,    31,    32,    -1,    72,    -1,    74,
+      75,    76,    39,    -1,    79,    80,    81,    82,    83,    84,
+      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      67,    -1,    -1,    -1,   109,    -1,   111,    74,    75,    -1,
+      -1,    -1,   117,   118,   119,   120,   121,   122,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,   111,    30,    31,    32,    -1,    -1,
+     117,   118,    -1,    -1,    39,    -1,    -1,    -1,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,    -1,    67,    -1,    69,    -1,    71,    39,    -1,    74,
+      75,    -1,    -1,    -1,    -1,    -1,    10,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    -1,    67,    30,    31,    32,    -1,
+      72,    -1,    74,    75,    76,    39,    -1,    -1,    -1,   114,
+      -1,    83,    84,    -1,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    -1,    67,    30,    31,    32,   109,    72,   111,
+      74,    75,    76,    39,    -1,   117,   118,    -1,    -1,    83,
+      84,    -1,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      -1,    67,    30,    31,    32,   109,    72,   111,    74,    75,
+      76,    39,    -1,   117,   118,    -1,    -1,    83,    84,    -1,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    67,
+      30,    31,    32,   109,    72,   111,    74,    75,    76,    39,
+      -1,   117,   118,    -1,    -1,    83,    84,    -1,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    67,    30,    31,
+      32,   109,    -1,   111,    74,    75,    -1,    39,    78,   117,
+     118,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
+      -1,    30,    31,    32,    -1,    67,    -1,    -1,    -1,   109,
+      39,   111,    74,    75,    -1,    -1,    78,   117,   118,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    -1,    67,    30,
+      31,    32,    -1,    -1,    -1,    74,    75,    -1,    39,   111,
+      -1,    -1,    -1,    -1,    -1,   117,   118,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    -1,    67,    30,    31,    32,
+      -1,    -1,   111,    74,    75,    -1,    39,    -1,   117,   118,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
+      30,    31,    32,    -1,    67,    -1,    -1,    -1,    -1,    39,
+     111,    74,    75,    -1,    -1,    -1,   117,   118,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    67,    30,    31,
+      32,    -1,    -1,    -1,    74,    75,    -1,    39,   111,    -1,
+      -1,    -1,    -1,    -1,   117,   118,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    -1,    -1,    -1,
+      -1,   111,    74,    75,    -1,    -1,    -1,   117,   118,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,   111,
+      -1,    -1,    -1,    -1,    39,   117,   118,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,
+      75,    37,    38,    -1,    40,    41,    -1,    43,    -1,    -1,
+      46,    47,    48,    49,    50,    51,    52,    53,    -1,    -1,
+      56,    57,    -1,    -1,    -1,    61,    62,    -1,    64,    -1,
+      66,    -1,    -1,    -1,    -1,   110,    72,    -1,    -1,    -1,
+      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
+      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   109,    -1,   111,    -1,    -1,   114,    -1,
+      -1,   117,   118,   119,   120,   121,   122,    -1,    -1,    37,
+      38,   127,    40,    41,    -1,    43,   132,    -1,    46,    47,
+      48,    49,    50,    51,    52,    53,    -1,    -1,    -1,    57,
+      -1,    -1,    -1,    61,    62,    -1,    64,    -1,    66,    -1,
+      -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    -1,    86,    87,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   109,    -1,   111,    -1,    -1,   114,    -1,    -1,   117,
+     118,   119,   120,   121,   122,    -1,    -1,    -1,    -1,   127,
+      -1,    -1,    -1,    -1,   132,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
+      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,
+      39,    -1,    37,    38,    -1,    40,    41,    -1,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    -1,
+      -1,    56,    57,    -1,    -1,    -1,    61,    62,    67,    64,
+      69,    66,    71,    -1,    -1,    74,    75,    72,    -1,    -1,
+      -1,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
+      -1,    86,    87,    -1,    -1,    -1,    -1,    96,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    -1,   114,
+      -1,    -1,   117,   118,   119,   120,   121,   122,    -1,    -1,
+      37,    38,   127,    40,    41,    -1,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,    -1,    -1,    -1,
+      57,    -1,    -1,    -1,    61,    62,    -1,    64,    -1,    66,
+      -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    76,
+      -1,    -1,    79,    80,    81,    82,    83,    84,    -1,    86,
+      87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   109,    -1,   111,    -1,    -1,   114,    -1,    -1,
+     117,   118,   119,   120,   121,   122,    -1,    -1,    37,    38,
+     127,    40,    41,    -1,    43,    -1,    -1,    46,    47,    48,
+      49,    50,    51,    52,    53,    -1,    -1,    -1,    57,    -1,
+      -1,    -1,    61,    62,    -1,    64,    -1,    66,    -1,    -1,
+      -1,    -1,    -1,    72,    -1,    -1,    -1,    76,    -1,    -1,
+      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
+      -1,    -1,    -1,    -1,    -1,    37,    38,    -1,    40,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     109,    -1,   111,    -1,    -1,   114,    -1,    -1,   117,   118,
+     119,   120,   121,   122,    66,    -1,    -1,    -1,   127,    -1,
+      72,    -1,    74,    75,    76,    -1,    -1,    79,    80,    81,
+      82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,
+      -1,    -1,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,
+      -1,   113,   114,    -1,    -1,   117,   118,   119,   120,   121,
+     122,    66,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,
+      -1,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
+      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    37,
+      38,    -1,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   109,    -1,   111,    -1,    37,    38,
+      -1,    40,   117,   118,   119,   120,   121,   122,    66,    -1,
+      -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    76,    -1,
+      -1,    79,    80,    81,    82,    83,    84,    66,    86,    87,
+      -1,    -1,    -1,    72,    -1,    -1,    -1,    76,    -1,    -1,
+      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
+      -1,   109,    -1,   111,    -1,    37,    38,    -1,    40,   117,
+     118,   119,   120,   121,   122,    -1,    -1,    -1,    -1,    -1,
+     109,    -1,    -1,    -1,    37,    38,    -1,    40,   117,   118,
+     119,   120,   121,   122,    66,    -1,    -1,    -1,    -1,    -1,
+      72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,    81,
+      82,    83,    84,    66,    86,    87,    -1,    -1,    -1,    72,
+      -1,    -1,    -1,    76,    -1,    -1,    79,    80,    81,    82,
+      83,    84,    -1,    86,    87,    -1,    -1,   109,    -1,    -1,
+      -1,    37,    38,    -1,    40,   117,   118,   119,   120,   121,
+     122,    -1,    -1,    -1,    -1,    -1,   109,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   117,   118,   119,   120,   121,   122,
+      66,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,
+      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
+      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   109,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   117,   118,   119,   120,   121,   122,     4,     5,     6,
        7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      -1,    -1,    39,    -1,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    33,    34,    35,
-      67,    -1,    69,    39,    71,    72,    -1,    74,    75,    76,
-      -1,    -1,    -1,    -1,    -1,    -1,    83,    84,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,
-      -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,
-      -1,   118,   119,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    -1,
-      30,    31,    32,    33,    -1,    -1,    36,    -1,    -1,    39,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    69,
-      -1,    71,    -1,    -1,    74,    75,    -1,    -1,    78,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,
-       3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
-      33,    -1,    -1,    36,    -1,    -1,    39,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,    -1,
-      -1,    74,    75,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   111,    -1,
-      -1,    -1,    -1,    -1,    -1,   118,   119,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
+      27,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       67,    -1,    69,    -1,    71,    72,    -1,    74,    75,    76,
-      -1,    -1,    -1,    -1,    -1,    -1,    83,    84,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,
-      -1,   118,   119,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
-      31,    32,    -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    69,    -1,
-      71,    -1,    -1,    74,    75,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   110,
-     111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,     4,
+      -1,    -1,    -1,    -1,    -1,    -1,    83,    84,     3,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
@@ -3834,386 +3944,22 @@
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,
-      75,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    96,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,   119,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
-      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,
-      39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,
-      69,    -1,    71,    -1,    -1,    74,    75,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    94,    -1,    96,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,   118,
-     119,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
-      -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,
+      75,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    -1,    -1,    30,    31,
+      32,    -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,    -1,
-      -1,    74,    75,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   111,    -1,
-      -1,    -1,    -1,    -1,    -1,   118,   119,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,    -1,
-      -1,   118,   119,     4,     5,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
-      31,    32,    -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    69,    -1,
-      71,    -1,    -1,    74,    75,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,
-      75,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    94,
-      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,    38,
-      39,    40,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,   119,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,    -1,
-      -1,    -1,    -1,    72,    -1,    74,    75,    76,    -1,    -1,
-      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
-      -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     109,    -1,   111,    -1,    -1,   114,    -1,    -1,    -1,   118,
-     119,   120,   121,   122,   123,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    37,    38,    39,    40,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    66,    67,    -1,    -1,    -1,    -1,    72,    -1,    74,
-      75,    76,    -1,    -1,    79,    80,    81,    82,    83,    84,
-      -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   109,   110,   111,    -1,    -1,    -1,
-      -1,    -1,    -1,   118,   119,   120,   121,   122,   123,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,    25,    26,    27,    -1,    -1,    30,
-      31,    32,    -1,    -1,    -1,    -1,    37,    38,    39,    40,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    66,    67,    -1,    -1,    -1,
-      -1,    72,    -1,    74,    75,    76,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,
-     111,    -1,    -1,    -1,    -1,    -1,    -1,   118,   119,   120,
-     121,   122,   123,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      37,    38,    39,    40,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,
-      67,    -1,    -1,    -1,    -1,    72,    -1,    74,    75,    76,
-      -1,    -1,    79,    80,    81,    82,    83,    84,    -1,    86,
-      87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,
-      -1,   118,   119,   120,   121,   122,   123,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    -1,    -1,    30,    31,    32,
-      -1,    -1,    -1,    -1,    37,    38,    39,    40,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    66,    67,    -1,    -1,    -1,    -1,    72,
-      -1,    74,    75,    76,    -1,    -1,    79,    80,    81,    82,
-      83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,
-      -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,
-      -1,    -1,    -1,    -1,    -1,   118,   119,   120,   121,   122,
-     123,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
-      -1,    30,    31,    32,    -1,    -1,    -1,    -1,    37,    38,
-      39,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,    -1,
-      -1,    -1,    -1,    72,    -1,    74,    75,    76,    -1,    -1,
-      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
-      -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     109,    -1,   111,    -1,    -1,    -1,    -1,    -1,    -1,   118,
-     119,   120,   121,   122,   123,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-      -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,    -1,
-      -1,    39,    -1,    -1,    -1,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    67,
-      -1,    69,    -1,    71,    39,    -1,    74,    75,    -1,    -1,
-      -1,    -1,    -1,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    67,    30,    31,    32,    -1,    72,    -1,    74,
-      75,    76,    39,    -1,    -1,    -1,   114,    -1,    83,    84,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      67,    -1,    -1,    -1,   109,    72,   111,    74,    75,    76,
-      -1,    -1,    -1,   118,   119,    -1,    83,    84,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,
-      -1,   118,   119,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      -1,    -1,    39,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      67,    -1,    39,    -1,    -1,    72,    -1,    74,    75,    76,
-      -1,    -1,    -1,    -1,    -1,    -1,    83,    84,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      67,    -1,    -1,    -1,    -1,    72,    -1,    74,    75,    76,
-      -1,    -1,   109,    -1,   111,    -1,    83,    84,    -1,    -1,
-      -1,   118,   119,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,
-      -1,   118,   119,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      -1,    -1,    39,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      67,    -1,    39,    -1,    -1,    72,    -1,    74,    75,    76,
-      -1,    -1,    -1,    -1,    -1,    -1,    83,    84,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      67,    -1,    -1,    -1,    -1,    72,    -1,    74,    75,    -1,
-      -1,    -1,    -1,    -1,   111,    -1,    83,    84,    -1,    -1,
-      -1,   118,   119,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,    -1,
-      -1,   118,   119,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      -1,    -1,    39,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      67,    -1,    39,    40,    -1,    -1,    -1,    74,    75,    -1,
-      -1,    78,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    -1,
-      -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,    -1,
-      -1,   118,   119,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,   115,    -1,
-      -1,   118,   119,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      -1,    -1,    39,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      67,    -1,    39,    40,    -1,    -1,    -1,    74,    75,    -1,
-      -1,    78,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,    -1,
-      -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,    -1,
-      -1,   118,   119,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,   115,    -1,
-      -1,   118,   119,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      -1,    -1,    39,    40,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      67,    -1,    -1,    39,    -1,    -1,    -1,    74,    75,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,
-      -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,   115,    -1,
-      -1,   118,   119,    -1,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,   119,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    -1,    -1,    39,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    67,    -1,    39,    -1,    -1,    -1,    -1,    74,    75,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,
-      -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,   119,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,   119,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    -1,    -1,    39,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    67,    -1,    39,    -1,    -1,    -1,    -1,    74,    75,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,
-      -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,   119,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,   119,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    -1,    -1,    39,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    67,    -1,    39,    -1,    -1,    -1,    -1,    74,    75,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,
-      -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,   119,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,   119,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    -1,    -1,    39,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,
-      -1,    67,    -1,    39,    -1,    -1,    -1,    -1,    74,    75,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    74,    75,
-      -1,    -1,    -1,    -1,    -1,   111,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,   119,    -1,    -1,    -1,    -1,    94,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   118,   119,     4,     5,     6,     7,     8,     9,
+      -1,    -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,
+      -1,    -1,    74,    75,     4,     5,     6,     7,     8,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
       30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,    39,
-      -1,    37,    38,    -1,    40,    41,    -1,    43,    -1,    -1,
-      46,    47,    48,    49,    50,    51,    52,    53,    -1,    -1,
-      56,    57,    -1,    -1,    -1,    61,    62,    67,    64,    69,
-      66,    71,    -1,    -1,    74,    75,    72,    -1,    -1,    -1,
-      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
-      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    -1,
+      -1,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    -1,
+      -1,    30,    31,    32,    33,    34,    35,    67,    -1,    69,
+      39,    71,    -1,    -1,    74,    75,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     110,    -1,    -1,   109,    -1,   111,    -1,    -1,   114,    -1,
-      -1,    -1,   118,   119,   120,   121,   122,   123,    -1,    -1,
-      -1,    -1,   128,    -1,    37,    38,   132,    40,    41,    -1,
-      43,    -1,    -1,    46,    47,    48,    49,    50,    51,    52,
-      53,    -1,    -1,    -1,    57,    -1,    -1,    -1,    61,    62,
-      -1,    64,    -1,    66,    -1,    -1,    -1,    -1,    -1,    72,
-      -1,    -1,    -1,    76,    -1,    -1,    79,    80,    81,    82,
-      83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,
-      -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,
-      -1,   114,    -1,    -1,    -1,   118,   119,   120,   121,   122,
-     123,    -1,    -1,    -1,    -1,   128,    -1,    -1,    -1,   132,
-       4,     5,     6,     7,     8,     9,    10,    11,    12,    13,
-      14,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    -1,    -1,    30,    31,    32,    -1,
-      -1,    -1,    -1,    -1,    -1,    39,    -1,    37,    38,    -1,
-      40,    41,    -1,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,    -1,    -1,    56,    57,    -1,    -1,
-      -1,    61,    62,    67,    64,    69,    66,    71,    -1,    -1,
-      74,    75,    72,    -1,    -1,    -1,    76,    -1,    -1,    79,
-      80,    81,    82,    83,    84,    -1,    86,    87,    -1,    -1,
-      -1,    -1,    96,    -1,    94,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,
-      -1,   111,    -1,    -1,   114,    -1,    -1,    -1,   118,   119,
-     120,   121,   122,   123,    -1,    -1,    37,    38,   128,    40,
-      41,    -1,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    -1,    -1,    -1,    57,    -1,    -1,    -1,
-      61,    62,    -1,    64,    -1,    66,    -1,    -1,    -1,    -1,
-      -1,    72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,
-     111,    -1,    -1,   114,    -1,    -1,    -1,   118,   119,   120,
-     121,   122,   123,    -1,    -1,    37,    38,   128,    40,    41,
-      -1,    43,    -1,    -1,    46,    47,    48,    49,    50,    51,
-      52,    53,    -1,    -1,    -1,    57,    -1,    -1,    -1,    61,
-      62,    -1,    64,    -1,    66,    -1,    -1,    -1,    -1,    -1,
-      72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,    81,
-      82,    83,    84,    -1,    86,    87,    -1,    -1,    -1,    -1,
-      -1,    -1,    94,    37,    38,    -1,    40,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   109,    -1,   111,
-      -1,    -1,   114,    -1,    -1,    -1,   118,   119,   120,   121,
-     122,   123,    66,    -1,    -1,    -1,   128,    -1,    72,    -1,
-      74,    75,    76,    -1,    -1,    79,    80,    81,    82,    83,
-      84,    -1,    86,    87,    -1,    -1,    -1,    -1,    -1,    -1,
-      94,    37,    38,    -1,    40,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   109,    -1,   111,    -1,   113,
-     114,    -1,    -1,    -1,   118,   119,   120,   121,   122,   123,
-      66,    -1,    -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,
-      76,    -1,    -1,    79,    80,    81,    82,    83,    84,    -1,
-      86,    87,    -1,    -1,    -1,    -1,    -1,    -1,    94,    37,
-      38,    -1,    40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,   109,    -1,   111,    -1,    -1,    37,    38,
-      -1,    40,   118,   119,   120,   121,   122,   123,    66,    -1,
-      -1,    -1,    -1,    -1,    72,    -1,    -1,    -1,    76,    -1,
-      -1,    79,    80,    81,    82,    83,    84,    66,    86,    87,
-      -1,    -1,    -1,    72,    -1,    -1,    94,    76,    -1,    -1,
-      79,    80,    81,    82,    83,    84,    -1,    86,    87,    -1,
-      -1,   109,    -1,   111,    -1,    94,    37,    38,    -1,    40,
-     118,   119,   120,   121,   122,   123,    -1,    -1,    -1,    -1,
-     109,    -1,   111,    -1,    -1,    37,    38,    -1,    40,   118,
-     119,   120,   121,   122,   123,    66,    -1,    -1,    -1,    -1,
-      -1,    72,    -1,    -1,    -1,    76,    -1,    -1,    79,    80,
-      81,    82,    83,    84,    66,    86,    87,    -1,    -1,    -1,
-      72,    -1,    -1,    94,    76,    -1,    -1,    79,    80,    81,
-      82,    83,    84,    -1,    86,    87,    -1,    -1,   109,    -1,
-      -1,    -1,    94,    -1,    -1,    -1,    -1,   118,   119,   120,
-     121,   122,   123,    -1,    -1,    -1,    -1,   109,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   118,   119,   120,   121,
-     122,   123,     4,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    67,    -1,    69,    -1,    71,
-      72,    -1,    74,    75,    76,    -1,    -1,    -1,    -1,    -1,
-      -1,    83,    84,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    -1,    -1,
-      30,    31,    32,    -1,    -1,    -1,    -1,    -1,    -1,    39,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,    69,
-      -1,    71,    -1,    -1,    74,    75,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    -1,    -1,    30,    31,    32,    -1,    -1,    -1,    -1,
-      -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      67,    -1,    69,    -1,    71,    -1,    -1,    74,    75,     4,
-       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    -1,    -1,    30,    31,    32,    -1,    -1,
-      -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    67,    -1,    69,    -1,    71,    -1,    -1,    74,
-      75
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    67,    -1,
+      -1,    -1,    -1,    -1,    -1,    74,    75
 };
 
@@ -4226,101 +3972,100 @@
       22,    23,    24,    25,    26,    27,    30,    31,    32,    33,
       36,    39,    40,    64,    67,    69,    71,    72,    74,    75,
-      76,    83,    84,    94,   109,   111,   118,   119,   137,   140,
-     149,   198,   212,   213,   214,   215,   216,   217,   218,   219,
-     220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
-     231,   232,   233,   234,   235,   236,   237,   238,   240,   241,
-     242,   243,   244,   245,   247,   255,   256,   283,   284,   285,
-     293,   296,   302,   303,   305,   307,   308,   314,   319,   323,
-     324,   325,   326,   327,   328,   329,   330,   350,   367,   368,
-     369,   370,    72,   139,   140,   149,   215,   217,   225,   227,
-     237,   241,   243,   284,    82,   109,   312,   313,   314,   312,
-     312,    72,    74,    75,    76,   138,   139,   273,   274,   294,
-     295,    74,    75,   274,   109,   305,    11,   199,   109,   149,
-     319,   324,   325,   326,   328,   329,   330,   112,   134,   111,
-     218,   225,   227,   323,   327,   366,   367,   370,   371,   135,
-     107,   131,   277,   114,   135,   173,    74,    75,   137,   272,
-     135,   135,   135,   116,   135,    74,    75,   109,   149,   309,
-     318,   319,   320,   321,   322,   323,   327,   331,   332,   333,
-     334,   335,   341,     3,    28,    78,   239,     3,     5,    74,
-     111,   149,   217,   228,   232,   235,   244,   285,   323,   327,
-     370,   215,   217,   227,   237,   241,   243,   284,   323,   327,
-      33,   233,   233,   228,   235,   135,   233,   228,   233,   228,
-      75,   109,   114,   274,   285,   114,   274,   233,   228,   116,
-     135,   135,     0,   134,   109,   173,   312,   312,   134,   111,
-     225,   227,   368,   272,   272,   131,   227,   109,   149,   309,
-     319,   323,   111,   149,   370,   306,   230,   314,   109,   290,
-     109,   109,    51,   109,    37,    38,    40,    66,    72,    76,
-      79,    80,    81,    82,    86,    87,   109,   111,   120,   121,
-     122,   123,   136,   140,   141,   142,   143,   148,   149,   150,
-     151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
-     161,   162,   164,   166,   225,   276,   292,   366,   371,   227,
-     110,   110,   110,   110,   110,   110,   110,    74,    75,   111,
-     225,   272,   350,   368,   111,   118,   149,   164,   217,   218,
-     224,   227,   231,   232,   237,   240,   241,   243,   262,   263,
-     267,   268,   269,   270,   284,   350,   362,   363,   364,   365,
-     370,   371,   112,   109,   323,   327,   370,   109,   116,   132,
-     111,   114,   149,   164,   278,   278,   115,   134,   116,   132,
-     109,   116,   132,   116,   132,   116,   132,   312,   132,   319,
-     320,   321,   322,   332,   333,   334,   335,   227,   318,   331,
-      64,   311,   111,   312,   349,   350,   312,   312,   173,   134,
-     109,   312,   349,   312,   312,   227,   309,   109,   109,   226,
-     227,   225,   227,   112,   134,   225,   366,   371,   173,   134,
-     272,   277,   217,   232,   323,   327,   173,   134,   294,   227,
-     237,   132,   227,   227,   292,   248,   246,   258,   274,   257,
-     227,   294,   132,   132,   305,   134,   139,   271,     3,   135,
-     207,   208,   222,   224,   227,   134,   311,   109,   311,   164,
-     319,   227,   109,   134,   272,   114,    33,    34,    35,   225,
-     286,   287,   289,   134,   129,   131,   291,   134,   228,   234,
-     235,   272,   315,   316,   317,   109,   141,   109,   148,   109,
-     148,   151,   109,   148,   109,   109,   148,   148,   111,   164,
-     169,   173,   225,   275,   366,   370,   112,   134,    82,    85,
-      86,    87,   109,   111,   113,   114,    97,    98,    99,   100,
-     101,   102,   103,   104,   105,   106,   131,   168,   151,   151,
-     118,   124,   125,   120,   121,    88,    89,    90,    91,   126,
-     127,    92,    93,   119,   128,   129,    94,    95,   130,   131,
-     373,   109,   149,   345,   346,   347,   348,   349,   110,   116,
-     109,   349,   350,   109,   349,   350,   134,   109,   225,   368,
-     112,   134,   135,   111,   225,   227,   361,   362,   370,   371,
-     135,   109,   111,   149,   319,   336,   337,   338,   339,   340,
-     341,   342,   343,   344,   350,   351,   352,   353,   354,   355,
-     356,   149,   370,   227,   135,   135,   149,   225,   227,   363,
-     272,   225,   350,   363,   272,   109,   134,   134,   134,   112,
-     134,    72,    80,   111,   113,   140,   274,   278,   279,   280,
-     281,   282,   134,   134,   134,   134,   134,   134,   309,   110,
-     110,   110,   110,   110,   110,   110,   318,   331,   109,   277,
-     112,   207,   134,   309,   169,   276,   169,   276,   309,   111,
-     207,   311,   173,   134,   207,   110,    40,   111,   115,   225,
-     249,   250,   251,   366,   114,   116,   372,   131,   259,   114,
-     227,   264,   265,   266,   269,   270,   110,   116,   173,   134,
-     118,   164,   134,   224,   227,   263,   362,   370,   303,   304,
-     109,   149,   336,   110,   116,   373,   274,   286,   109,   114,
-     274,   276,   286,   110,   116,   109,   141,   110,   117,   275,
-     275,   275,   111,   139,   145,   164,   276,   275,   112,   134,
-     110,   116,   110,   109,   149,   349,   357,   358,   359,   360,
-     110,   116,   164,   111,   139,   111,   144,   145,   134,   111,
-     139,   144,   164,   164,   151,   151,   151,   152,   152,   153,
-     153,   154,   154,   154,   154,   155,   155,   156,   157,   158,
-     159,   160,   117,   169,   164,   134,   346,   347,   348,   227,
-     345,   312,   312,   164,   276,   134,   271,   134,   225,   350,
-     363,   227,   231,   112,   112,   134,   370,   112,   109,   134,
-     319,   337,   338,   339,   342,   352,   353,   354,   112,   134,
-     227,   336,   340,   351,   109,   312,   355,   373,   312,   312,
-     373,   109,   312,   355,   312,   312,   312,   312,   350,   225,
-     361,   371,   272,   112,   116,   112,   116,   373,   225,   363,
-     373,   260,   261,   262,   263,   260,   260,   272,   164,   134,
-     111,   274,   117,   116,   372,   278,    80,   111,   117,   282,
-      29,   209,   210,   272,   260,   139,   309,   139,   311,   109,
-     349,   350,   109,   349,   350,   141,   350,   173,   264,   110,
-     110,   110,   110,   112,   173,   207,   173,   114,   250,   251,
-     112,   134,   109,   117,   149,   252,   254,   318,   319,   331,
-     357,   116,   132,   116,   132,   274,   248,   274,   115,   162,
-     163,   258,   135,   135,   139,   222,   135,   135,   260,   109,
-     149,   370,   135,   115,   227,   287,   288,   135,   134,   134,
-     109,   135,   110,   316,   169,   170,   117,   132,   111,   141,
-     200,   201,   202,   110,   116,   110,   134,   117,   110,   110,
-     110,   111,   164,   358,   359,   360,   227,   357,   312,   312,
-     114,   151,   166,   164,   165,   167,   116,   135,   134,   134,
-     110,   116,   164,   134,   115,   162,   117,   264,   110,   110,
-     110,   345,   264,   110,   260,   225,   363,   111,   118,   149,
+      76,    83,    84,   109,   111,   117,   118,   137,   140,   149,
+     198,   212,   213,   214,   215,   216,   217,   218,   219,   220,
+     221,   222,   223,   224,   225,   226,   227,   228,   229,   231,
+     232,   233,   234,   235,   236,   237,   238,   240,   241,   242,
+     243,   244,   245,   247,   255,   256,   283,   284,   285,   293,
+     296,   302,   303,   305,   307,   308,   314,   319,   323,   324,
+     325,   326,   327,   328,   329,   330,   350,   367,   368,   369,
+     370,    72,   139,   140,   149,   215,   217,   225,   227,   237,
+     241,   243,   284,    82,   109,   312,   313,   314,   312,   312,
+      72,    74,    75,    76,   138,   139,   273,   274,   294,   295,
+      74,    75,   274,   109,   305,    11,   199,   109,   149,   319,
+     324,   325,   326,   328,   329,   330,   112,   134,   111,   218,
+     225,   227,   323,   327,   366,   367,   370,   371,   135,   107,
+     131,   277,   114,   135,   173,    74,    75,   137,   272,   135,
+     135,   135,   116,   135,    74,    75,   109,   149,   309,   318,
+     319,   320,   321,   322,   323,   327,   331,   332,   333,   334,
+     335,   341,     3,    28,    78,   239,     3,     5,    74,   111,
+     149,   217,   228,   232,   235,   244,   285,   323,   327,   370,
+     215,   217,   227,   237,   241,   243,   284,   323,   327,    33,
+     233,   233,   228,   235,   135,   233,   228,   233,   228,    75,
+     109,   114,   274,   285,   114,   274,   233,   228,   116,   135,
+     135,     0,   134,   109,   173,   312,   312,   134,   111,   225,
+     227,   368,   272,   272,   131,   227,   109,   149,   309,   319,
+     323,   111,   149,   370,   306,   230,   314,   109,   290,   109,
+     109,    51,   109,    37,    38,    40,    66,    72,    76,    79,
+      80,    81,    82,    86,    87,   109,   111,   119,   120,   121,
+     122,   136,   140,   141,   142,   143,   148,   149,   150,   151,
+     152,   153,   154,   155,   156,   157,   158,   159,   160,   161,
+     162,   164,   167,   225,   276,   292,   366,   371,   227,   110,
+     110,   110,   110,   110,   110,   110,    74,    75,   111,   225,
+     272,   350,   368,   111,   117,   149,   164,   217,   218,   224,
+     227,   231,   232,   237,   240,   241,   243,   262,   263,   267,
+     268,   269,   270,   284,   350,   362,   363,   364,   365,   370,
+     371,   112,   109,   323,   327,   370,   109,   116,   132,   111,
+     114,   149,   164,   278,   278,   115,   134,   116,   132,   109,
+     116,   132,   116,   132,   116,   132,   312,   132,   319,   320,
+     321,   322,   332,   333,   334,   335,   227,   318,   331,    64,
+     311,   111,   312,   349,   350,   312,   312,   173,   134,   109,
+     312,   349,   312,   312,   227,   309,   109,   109,   226,   227,
+     225,   227,   112,   134,   225,   366,   371,   173,   134,   272,
+     277,   217,   232,   323,   327,   173,   134,   294,   227,   237,
+     132,   227,   227,   292,   248,   246,   258,   274,   257,   227,
+     294,   132,   132,   305,   134,   139,   271,     3,   135,   207,
+     208,   222,   224,   227,   134,   311,   109,   311,   164,   319,
+     227,   109,   134,   272,   114,    33,    34,    35,   225,   286,
+     287,   289,   134,   128,   131,   291,   134,   228,   234,   235,
+     272,   315,   316,   317,   109,   141,   109,   148,   109,   148,
+     151,   109,   148,   109,   109,   148,   148,   111,   164,   169,
+     173,   225,   275,   366,   370,   112,   134,    82,    85,    86,
+      87,   109,   111,   113,   114,    97,    98,    99,   100,   101,
+     102,   103,   104,   105,   106,   131,   166,   151,   151,   117,
+     123,   124,   119,   120,    88,    89,    90,    91,   125,   126,
+      92,    93,   118,   127,   128,    94,    95,   129,   131,   373,
+     109,   149,   345,   346,   347,   348,   349,   110,   116,   109,
+     349,   350,   109,   349,   350,   134,   109,   225,   368,   112,
+     134,   135,   111,   225,   227,   361,   362,   370,   371,   135,
+     109,   111,   149,   319,   336,   337,   338,   339,   340,   341,
+     342,   343,   344,   350,   351,   352,   353,   354,   355,   356,
+     149,   370,   227,   135,   135,   149,   225,   227,   363,   272,
+     225,   350,   363,   272,   109,   134,   134,   134,   112,   134,
+      72,   111,   113,   140,   274,   278,   279,   280,   281,   282,
+     134,   134,   134,   134,   134,   134,   309,   110,   110,   110,
+     110,   110,   110,   110,   318,   331,   109,   277,   112,   207,
+     134,   309,   169,   276,   169,   276,   309,   111,   207,   311,
+     173,   134,   207,   110,    40,   111,   115,   225,   249,   250,
+     251,   366,   114,   116,   372,   131,   259,   114,   227,   264,
+     265,   266,   269,   270,   110,   116,   173,   134,   117,   164,
+     134,   224,   227,   263,   362,   370,   303,   304,   109,   149,
+     336,   110,   116,   373,   274,   286,   109,   114,   274,   276,
+     286,   110,   116,   109,   141,   110,   130,   275,   275,   275,
+     145,   164,   276,   275,   112,   134,   110,   116,   110,   109,
+     149,   349,   357,   358,   359,   360,   110,   116,   164,   111,
+     139,   144,   145,   134,   111,   139,   144,   164,   151,   151,
+     151,   152,   152,   153,   153,   154,   154,   154,   154,   155,
+     155,   156,   157,   158,   159,   160,   130,   169,   164,   134,
+     346,   347,   348,   227,   345,   312,   312,   164,   276,   134,
+     271,   134,   225,   350,   363,   227,   231,   112,   112,   134,
+     370,   112,   109,   134,   319,   337,   338,   339,   342,   352,
+     353,   354,   112,   134,   227,   336,   340,   351,   109,   312,
+     355,   373,   312,   312,   373,   109,   312,   355,   312,   312,
+     312,   312,   350,   225,   361,   371,   272,   112,   116,   112,
+     116,   373,   225,   363,   373,   260,   261,   262,   263,   260,
+     260,   272,   164,   134,   111,   274,   130,   116,   372,   278,
+     111,   130,   282,    29,   209,   210,   272,   260,   139,   309,
+     139,   311,   109,   349,   350,   109,   349,   350,   141,   350,
+     173,   264,   110,   110,   110,   110,   112,   173,   207,   173,
+     114,   250,   251,   112,   134,   109,   130,   149,   252,   254,
+     318,   319,   331,   357,   116,   132,   116,   132,   274,   248,
+     274,   115,   162,   163,   258,   135,   135,   139,   222,   135,
+     135,   260,   109,   149,   370,   135,   115,   227,   287,   288,
+     135,   134,   134,   109,   135,   110,   316,   169,   170,   130,
+     132,   111,   141,   200,   201,   202,   110,   116,   110,   110,
+     110,   110,   111,   164,   358,   359,   360,   227,   357,   312,
+     312,   114,   151,   167,   164,   165,   168,   116,   135,   134,
+     110,   116,   164,   134,   115,   162,   130,   264,   110,   110,
+     110,   345,   264,   110,   260,   225,   363,   111,   117,   149,
      164,   164,   227,   342,   264,   110,   110,   110,   110,   110,
      110,   110,     7,   227,   336,   340,   351,   134,   134,   373,
@@ -4328,5 +4073,5 @@
      163,   164,   310,   134,   278,   280,   115,   134,   211,   274,
       40,    41,    43,    46,    47,    48,    49,    50,    51,    52,
-      53,    57,    61,    62,    72,   111,   128,   170,   171,   172,
+      53,    57,    61,    62,    72,   111,   127,   170,   171,   172,
      173,   174,   175,   177,   178,   190,   192,   193,   198,   212,
      308,    29,   135,   131,   277,   134,   134,   110,   135,   173,
@@ -4334,50 +4079,49 @@
      312,   115,   259,   372,   110,   116,   112,   112,   135,   227,
      116,   373,   290,   110,   286,   215,   217,   225,   298,   299,
-     300,   301,   292,   110,   110,   117,   163,   109,   110,   117,
-     116,   139,   164,   164,   112,   110,   110,   110,   357,   279,
-     116,   135,   167,   112,   139,   146,   147,   164,   145,   135,
-     146,   162,   166,   135,   109,   349,   350,   135,   135,   134,
-     135,   135,   135,   164,   110,   135,   109,   349,   350,   109,
-     355,   109,   355,   350,   226,     7,   118,   135,   164,   264,
-     264,   263,   267,   267,   268,   116,   116,   110,   110,   112,
-      96,   123,   135,   135,   146,   278,   164,   116,   132,   212,
-     216,   227,   231,   109,   109,   171,   109,   109,    72,   132,
-      72,   132,    72,   118,   170,   109,   173,   165,   165,   117,
-     112,   143,   132,   135,   134,   135,   211,   110,   164,   264,
-     264,   312,   110,   115,   252,   115,   134,   110,   134,   135,
-     309,   115,   134,   135,   135,   110,   114,   200,   112,   163,
-     132,   200,   202,   110,   116,   135,   109,   349,   350,   372,
-     165,   112,   135,    85,   113,   116,   135,   135,   112,   135,
-     110,   134,   110,   110,   112,   112,   112,   135,   110,   134,
-     134,   134,   164,   164,   135,   112,   135,   135,   135,   135,
-     134,   134,   163,   163,   112,   112,   135,   135,   274,   227,
-     169,   169,    47,   169,   134,   132,   132,   132,   169,   132,
-     169,    58,    59,    60,   194,   195,   196,   132,    63,   132,
-     312,   114,   175,   115,   132,   135,   135,    96,   269,   270,
-     110,   299,   116,   132,   116,   132,   115,   297,   117,   141,
-     110,   110,   117,   167,   112,   134,   115,   112,   111,   147,
-     111,   147,   147,   112,   112,   112,   264,   112,   264,   264,
-     264,   135,   135,   112,   112,   110,   110,   112,   116,    96,
-     263,    96,   135,   112,   112,   110,   110,   109,   110,   170,
-     191,   212,   132,   110,   109,   109,   173,   196,    58,    59,
-     164,   171,   144,   110,   110,   114,   134,   134,   298,   141,
-     203,   109,   132,   203,   135,   117,   264,   134,   134,   135,
-     135,   135,   135,   112,   112,   134,   135,   112,   171,    44,
-      45,   114,   181,   182,   183,   169,   171,   135,   110,   170,
-     114,   183,    96,   134,    96,   134,   109,   109,   132,   115,
-     134,   272,   309,   115,   116,   117,   163,   110,   112,   164,
-     135,   146,   146,   110,   110,   110,   110,   267,    42,   163,
-     179,   180,   310,   117,   134,   171,   181,   110,   132,   171,
-     132,   134,   110,   134,   110,   134,    96,   134,    96,   134,
-     132,   298,   141,   139,   204,   110,   132,   117,   110,   135,
-     135,   171,    96,   116,   117,   135,   205,   206,   212,   132,
-     170,   170,   205,   173,   197,   225,   366,   173,   197,   110,
-     134,   110,   134,   115,   110,   116,   164,   112,   112,   163,
-     179,   182,   184,   185,   134,   132,   182,   186,   187,   135,
-     109,   149,   309,   357,   139,   135,   173,   197,   173,   197,
-     109,   132,   139,   171,   176,   115,   182,   212,   170,    56,
-     176,   189,   115,   182,   110,   227,   110,   135,   135,   292,
-     171,   176,   132,   188,   189,   176,   189,   173,   173,   110,
-     110,   110,   188,   135,   135,   173,   173,   135,   135
+     300,   301,   292,   110,   110,   130,   163,   109,   110,   130,
+     116,   139,   112,   110,   110,   110,   357,   279,   116,   135,
+     168,   112,   139,   146,   147,   145,   135,   146,   162,   167,
+     135,   109,   349,   350,   135,   135,   134,   135,   135,   135,
+     164,   110,   135,   109,   349,   350,   109,   355,   109,   355,
+     350,   226,     7,   117,   135,   164,   264,   264,   263,   267,
+     267,   268,   116,   116,   110,   110,   112,    96,   122,   135,
+     135,   146,   278,   164,   116,   132,   212,   216,   227,   231,
+     109,   109,   171,   109,   109,    72,   132,    72,   132,    72,
+     117,   170,   109,   173,   165,   165,   130,   112,   143,   132,
+     135,   134,   135,   211,   110,   164,   264,   264,   312,   110,
+     115,   252,   115,   134,   110,   134,   135,   309,   115,   134,
+     135,   135,   110,   114,   200,   112,   163,   132,   200,   202,
+     110,   109,   349,   350,   372,   165,   112,   135,    85,   113,
+     116,   135,   112,   135,   110,   134,   110,   110,   112,   112,
+     112,   135,   110,   134,   134,   134,   164,   164,   135,   112,
+     135,   135,   135,   135,   134,   134,   163,   163,   112,   112,
+     135,   135,   274,   227,   169,   169,    47,   169,   134,   132,
+     132,   132,   169,   132,   169,    58,    59,    60,   194,   195,
+     196,   132,    63,   132,   312,   114,   175,   115,   132,   135,
+     135,    96,   269,   270,   110,   299,   116,   132,   116,   132,
+     115,   297,   130,   141,   110,   110,   130,   134,   115,   112,
+     111,   147,   111,   147,   147,   112,   112,   264,   112,   264,
+     264,   264,   135,   135,   112,   112,   110,   110,   112,   116,
+      96,   263,    96,   135,   112,   112,   110,   110,   109,   110,
+     170,   191,   212,   132,   110,   109,   109,   173,   196,    58,
+      59,   164,   171,   144,   110,   110,   114,   134,   134,   298,
+     141,   203,   109,   132,   203,   264,   134,   134,   135,   135,
+     135,   135,   112,   112,   134,   135,   112,   171,    44,    45,
+     114,   181,   182,   183,   169,   171,   135,   110,   170,   114,
+     183,    96,   134,    96,   134,   109,   109,   132,   115,   134,
+     272,   309,   115,   116,   130,   163,   110,   135,   146,   146,
+     110,   110,   110,   110,   267,    42,   163,   179,   180,   310,
+     130,   134,   171,   181,   110,   132,   171,   132,   134,   110,
+     134,   110,   134,    96,   134,    96,   134,   132,   298,   141,
+     139,   204,   110,   132,   110,   135,   135,   171,    96,   116,
+     130,   135,   205,   206,   212,   132,   170,   170,   205,   173,
+     197,   225,   366,   173,   197,   110,   134,   110,   134,   115,
+     110,   116,   112,   112,   163,   179,   182,   184,   185,   134,
+     132,   182,   186,   187,   135,   109,   149,   309,   357,   139,
+     135,   173,   197,   173,   197,   109,   132,   139,   171,   176,
+     115,   182,   212,   170,    56,   176,   189,   115,   182,   110,
+     227,   110,   135,   135,   292,   171,   176,   132,   188,   189,
+     176,   189,   173,   173,   110,   110,   110,   188,   135,   135,
+     173,   173,   135,   135
 };
 
@@ -5216,5 +4960,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 290 "parser.yy"
+#line 298 "parser.yy"
     {
 			typedefTable.enterScope();
@@ -5225,5 +4969,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 296 "parser.yy"
+#line 304 "parser.yy"
     {
 			typedefTable.leaveScope();
@@ -5234,6 +4978,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 305 "parser.yy"
-    { (yyval.constant) = makeConstant( ConstantNode::Integer, (yyvsp[(1) - (1)].tok) ); }
+#line 313 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_constantInteger( *(yyvsp[(1) - (1)].tok) ) ); }
     break;
 
@@ -5241,6 +4985,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 306 "parser.yy"
-    { (yyval.constant) = makeConstant( ConstantNode::Float, (yyvsp[(1) - (1)].tok) ); }
+#line 314 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_constantFloat( *(yyvsp[(1) - (1)].tok) ) ); }
     break;
 
@@ -5248,6 +4992,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 307 "parser.yy"
-    { (yyval.constant) = makeConstant( ConstantNode::Character, (yyvsp[(1) - (1)].tok) ); }
+#line 315 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_constantChar( *(yyvsp[(1) - (1)].tok) ) ); }
     break;
 
@@ -5255,6 +4999,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 332 "parser.yy"
-    { (yyval.constant) = makeConstantStr( ConstantNode::String, (yyvsp[(1) - (1)].tok) ); }
+#line 340 "parser.yy"
+    { (yyval.constant) = build_constantStr( *(yyvsp[(1) - (1)].tok) ); }
     break;
 
@@ -5262,6 +5006,10 @@
 
 /* Line 1806 of yacc.c  */
-#line 333 "parser.yy"
-    { (yyval.constant) = (yyvsp[(1) - (2)].constant)->appendstr( (yyvsp[(2) - (2)].tok) ); }
+#line 342 "parser.yy"
+    {
+			appendStr( (yyvsp[(1) - (2)].constant)->get_constant()->get_value(), (yyvsp[(2) - (2)].tok) );
+			delete (yyvsp[(2) - (2)].tok);									// allocated by lexer
+			(yyval.constant) = (yyvsp[(1) - (2)].constant);
+		}
     break;
 
@@ -5269,6 +5017,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 340 "parser.yy"
-    { (yyval.en) = new VarRefNode( (yyvsp[(1) - (1)].tok) ); }
+#line 353 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); }
     break;
 
@@ -5276,6 +5024,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 342 "parser.yy"
-    { (yyval.en) = new VarRefNode( (yyvsp[(1) - (1)].tok) ); }
+#line 355 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); }
     break;
 
@@ -5283,5 +5031,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 344 "parser.yy"
+#line 357 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (3)].en); }
     break;
@@ -5290,6 +5038,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 346 "parser.yy"
-    { (yyval.en) = new ValofExprNode( (yyvsp[(2) - (3)].sn) ); }
+#line 359 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_valexpr( (yyvsp[(2) - (3)].sn) ) ); }
     break;
 
@@ -5297,6 +5045,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 356 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Index ), (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ); }
+#line 369 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Index, (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ) ); }
     break;
 
@@ -5304,6 +5052,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 358 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( (yyvsp[(1) - (4)].en), (yyvsp[(3) - (4)].en) ); }
+#line 371 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_func( (yyvsp[(1) - (4)].en), (yyvsp[(3) - (4)].en) ) ); }
     break;
 
@@ -5311,6 +5059,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 362 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), (yyvsp[(1) - (3)].en), new VarRefNode( (yyvsp[(3) - (3)].tok) )); }
+#line 375 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); }
     break;
 
@@ -5318,6 +5066,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 365 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), (yyvsp[(1) - (3)].en), new VarRefNode( (yyvsp[(3) - (3)].tok) )); }
+#line 378 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(1) - (3)].en), build_varref( (yyvsp[(3) - (3)].tok) ) ) ); }
     break;
 
@@ -5325,6 +5073,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 368 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::IncrPost ), (yyvsp[(1) - (2)].en) ); }
+#line 381 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, (yyvsp[(1) - (2)].en) ) ); }
     break;
 
@@ -5332,6 +5080,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 370 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), (yyvsp[(1) - (2)].en) ); }
+#line 383 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, (yyvsp[(1) - (2)].en) ) ); }
     break;
 
@@ -5339,6 +5087,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 372 "parser.yy"
-    { (yyval.en) = new CompoundLiteralNode( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ); }
+#line 385 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_compoundLiteral( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ) ); }
     break;
 
@@ -5346,8 +5094,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 374 "parser.yy"
+#line 387 "parser.yy"
     {
-			Token fn; fn.str = new std::string( "?{}" ); // location undefined
-			(yyval.en) = new CompositeExprNode( new VarRefNode( fn ), (ExpressionNode *)( (yyvsp[(1) - (4)].en) )->set_link( (yyvsp[(3) - (4)].en) ) );
+			Token fn;
+			fn.str = new std::string( "?{}" ); // location undefined
+			(yyval.en) = new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( (yyvsp[(1) - (4)].en) )->set_last( (yyvsp[(3) - (4)].en) ) ) );
 		}
     break;
@@ -5356,6 +5105,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 383 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) )); }
+#line 397 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); }
     break;
 
@@ -5363,20 +5112,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 388 "parser.yy"
+#line 402 "parser.yy"
     { (yyval.en) = 0; }
     break;
 
-  case 37:
-
-/* Line 1806 of yacc.c  */
-#line 391 "parser.yy"
-    { (yyval.en) = (yyvsp[(3) - (3)].en)->set_argName( (yyvsp[(1) - (3)].tok) ); }
-    break;
-
   case 38:
 
 /* Line 1806 of yacc.c  */
-#line 396 "parser.yy"
-    { (yyval.en) = (yyvsp[(7) - (7)].en)->set_argName( (yyvsp[(3) - (7)].en) ); }
+#line 408 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); }
     break;
 
@@ -5384,6 +5126,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 398 "parser.yy"
-    { (yyval.en) = (yyvsp[(9) - (9)].en)->set_argName( new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(yyvsp[(3) - (9)].en)->set_link( flattenCommas( (yyvsp[(5) - (9)].en) )))); }
+#line 413 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (1)].tok) ) ); }
+    break;
+
+  case 40:
+
+/* Line 1806 of yacc.c  */
+#line 417 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); }
     break;
 
@@ -5391,6 +5140,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 403 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
+#line 419 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_fieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); }
     break;
 
@@ -5398,6 +5147,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 408 "parser.yy"
-    { (yyval.en) = new VarRefNode( (yyvsp[(1) - (1)].tok) ); }
+#line 421 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(3) - (3)].en), build_varref( (yyvsp[(1) - (3)].tok) ) ) ); }
     break;
 
@@ -5405,13 +5154,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 412 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), new VarRefNode( (yyvsp[(1) - (3)].tok) ), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 44:
-
-/* Line 1806 of yacc.c  */
-#line 414 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), new VarRefNode( (yyvsp[(1) - (7)].tok) ), (yyvsp[(5) - (7)].en) ); }
+#line 423 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_pfieldSel( (yyvsp[(5) - (7)].en), build_varref( (yyvsp[(1) - (7)].tok) ) ) ); }
     break;
 
@@ -5419,6 +5161,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 416 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), new VarRefNode( (yyvsp[(1) - (3)].tok) ), (yyvsp[(3) - (3)].en) ); }
+#line 431 "parser.yy"
+    { (yyval.en) = (yyvsp[(1) - (1)].en); }
     break;
 
@@ -5426,6 +5168,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 418 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), new VarRefNode( (yyvsp[(1) - (7)].tok) ), (yyvsp[(5) - (7)].en) ); }
+#line 433 "parser.yy"
+    { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); }
+    break;
+
+  case 47:
+
+/* Line 1806 of yacc.c  */
+#line 435 "parser.yy"
+    { (yyval.en) = (yyvsp[(2) - (2)].en)->set_extension( true ); }
     break;
 
@@ -5433,6 +5182,17 @@
 
 /* Line 1806 of yacc.c  */
-#line 426 "parser.yy"
-    { (yyval.en) = (yyvsp[(1) - (1)].constant); }
+#line 440 "parser.yy"
+    {
+			switch ( (yyvsp[(1) - (2)].op) ) {
+			  case OperKinds::AddressOf:
+				(yyval.en) = new ExpressionNode( build_addressOf( (yyvsp[(2) - (2)].en) ) );
+				break;
+			  case OperKinds::PointTo:
+				(yyval.en) = new ExpressionNode( build_unary_val( (yyvsp[(1) - (2)].op), (yyvsp[(2) - (2)].en) ) );
+				break;
+			  default:
+				assert( false );
+			}
+		}
     break;
 
@@ -5440,6 +5200,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 428 "parser.yy"
-    { (yyval.en) = (yyvsp[(1) - (1)].constant); }
+#line 453 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_unary_val( (yyvsp[(1) - (2)].op), (yyvsp[(2) - (2)].en) ) ); }
     break;
 
@@ -5447,6 +5207,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 430 "parser.yy"
-    { (yyval.en) = (yyvsp[(2) - (2)].en)->set_extension( true ); }
+#line 455 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Incr, (yyvsp[(2) - (2)].en) ) ); }
     break;
 
@@ -5454,6 +5214,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 432 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
+#line 457 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_unary_ptr( OperKinds::Decr, (yyvsp[(2) - (2)].en) ) ); }
     break;
 
@@ -5461,6 +5221,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 437 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
+#line 459 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_sizeOfexpr( (yyvsp[(2) - (2)].en) ) ); }
     break;
 
@@ -5468,6 +5228,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 439 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Incr ), (yyvsp[(2) - (2)].en) ); }
+#line 461 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_sizeOftype( (yyvsp[(3) - (4)].decl) ) ); }
     break;
 
@@ -5475,6 +5235,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 441 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Decr ), (yyvsp[(2) - (2)].en) ); }
+#line 463 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_alignOfexpr( (yyvsp[(2) - (2)].en) ) ); }
     break;
 
@@ -5482,6 +5242,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 443 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), (yyvsp[(2) - (2)].en) ); }
+#line 465 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_alignOftype( (yyvsp[(3) - (4)].decl) ) ); }
     break;
 
@@ -5489,6 +5249,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 445 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), new TypeValueNode( (yyvsp[(3) - (4)].decl) )); }
+#line 467 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_offsetOf( (yyvsp[(3) - (6)].decl), build_varref( (yyvsp[(5) - (6)].tok) ) ) ); }
     break;
 
@@ -5496,6 +5256,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 447 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::OffsetOf ), new TypeValueNode( (yyvsp[(3) - (6)].decl) ), new VarRefNode( (yyvsp[(5) - (6)].tok) )); }
+#line 469 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (1)].tok) ), nullptr ) ); }
     break;
 
@@ -5503,6 +5263,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 449 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (1)].tok) )); }
+#line 471 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_attrexpr( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ) ); }
     break;
 
@@ -5510,6 +5270,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 451 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), new TypeValueNode( (yyvsp[(3) - (4)].decl) )); }
+#line 473 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_attrtype( build_varref( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].decl) ) ); }
     break;
 
@@ -5517,6 +5277,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 453 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ); }
+#line 479 "parser.yy"
+    { (yyval.op) = OperKinds::PointTo; }
     break;
 
@@ -5524,6 +5284,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 455 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), (yyvsp[(2) - (2)].en) ); }
+#line 480 "parser.yy"
+    { (yyval.op) = OperKinds::AddressOf; }
     break;
 
@@ -5531,6 +5291,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 457 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), new TypeValueNode( (yyvsp[(3) - (4)].decl) ) ); }
+#line 486 "parser.yy"
+    { (yyval.op) = OperKinds::UnPlus; }
     break;
 
@@ -5538,6 +5298,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 463 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::PointTo ); }
+#line 487 "parser.yy"
+    { (yyval.op) = OperKinds::UnMinus; }
     break;
 
@@ -5545,6 +5305,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 464 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::AddressOf ); }
+#line 488 "parser.yy"
+    { (yyval.op) = OperKinds::Neg; }
     break;
 
@@ -5552,13 +5312,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 466 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::And ); }
-    break;
-
-  case 66:
-
-/* Line 1806 of yacc.c  */
-#line 470 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::UnPlus ); }
+#line 489 "parser.yy"
+    { (yyval.op) = OperKinds::BitNeg; }
     break;
 
@@ -5566,6 +5319,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 471 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::UnMinus ); }
+#line 495 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); }
     break;
 
@@ -5573,13 +5326,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 472 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::Neg ); }
-    break;
-
-  case 69:
-
-/* Line 1806 of yacc.c  */
-#line 473 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::BitNeg ); }
+#line 497 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_cast( (yyvsp[(2) - (4)].decl), (yyvsp[(4) - (4)].en) ) ); }
+    break;
+
+  case 70:
+
+/* Line 1806 of yacc.c  */
+#line 503 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mul, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5587,6 +5340,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 479 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cast ), new TypeValueNode( (yyvsp[(2) - (4)].decl) ), (yyvsp[(4) - (4)].en) ); }
+#line 505 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Div, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5594,6 +5347,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 481 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cast ), new TypeValueNode( (yyvsp[(2) - (4)].decl) ), (yyvsp[(4) - (4)].en) ); }
+#line 507 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Mod, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5601,6 +5354,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 487 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Mul ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 513 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Plus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5608,13 +5361,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 489 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Div ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 76:
-
-/* Line 1806 of yacc.c  */
-#line 491 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Mod ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 515 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Minus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
+    break;
+
+  case 77:
+
+/* Line 1806 of yacc.c  */
+#line 521 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5622,13 +5375,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 497 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Plus ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 79:
-
-/* Line 1806 of yacc.c  */
-#line 499 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Minus ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 523 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::RShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
+    break;
+
+  case 80:
+
+/* Line 1806 of yacc.c  */
+#line 529 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5636,6 +5389,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 505 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LShift ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 531 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5643,13 +5396,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 507 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::RShift ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 84:
-
-/* Line 1806 of yacc.c  */
-#line 513 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 533 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::LEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
+    break;
+
+  case 83:
+
+/* Line 1806 of yacc.c  */
+#line 535 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::GEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5657,6 +5410,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 515 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::GThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 541 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Eq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5664,20 +5417,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 517 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LEThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 87:
-
-/* Line 1806 of yacc.c  */
-#line 519 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::GEThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 89:
-
-/* Line 1806 of yacc.c  */
-#line 525 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Eq ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 543 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Neq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
+    break;
+
+  case 88:
+
+/* Line 1806 of yacc.c  */
+#line 549 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitAnd, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5685,6 +5431,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 527 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Neq ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 555 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::Xor, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5692,6 +5438,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 533 "parser.yy"
-    { (yyval.en) =new CompositeExprNode( new OperatorNode( OperatorNode::BitAnd ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 561 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_val( OperKinds::BitOr, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5699,6 +5445,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 539 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Xor ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 567 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), true ) ); }
     break;
 
@@ -5706,6 +5452,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 545 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::BitOr ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 573 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), false ) ); }
     break;
 
@@ -5713,6 +5459,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 551 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::And ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 579 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); }
+    break;
+
+  case 99:
+
+/* Line 1806 of yacc.c  */
+#line 582 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (4)].en), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ) ); }
     break;
 
@@ -5720,13 +5473,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 557 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Or ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 102:
-
-/* Line 1806 of yacc.c  */
-#line 563 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*(yyvsp[(1) - (5)].en), *(yyvsp[(3) - (5)].en), *(yyvsp[(5) - (5)].en) ) ) ); }
+#line 584 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); }
     break;
 
@@ -5734,6 +5480,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 565 "parser.yy"
-    { (yyval.en)=new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ); }
+#line 595 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_binary_ptr( (yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5741,6 +5487,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 567 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*(yyvsp[(1) - (5)].en), *(yyvsp[(3) - (5)].en), *(yyvsp[(5) - (5)].en) ) ) ); }
+#line 597 "parser.yy"
+    { (yyval.en) = ( (yyvsp[(2) - (2)].en) == 0 ) ? (yyvsp[(1) - (2)].en) : new ExpressionNode( build_binary_ptr( OperKinds::Assign, (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ) ); }
+    break;
+
+  case 105:
+
+/* Line 1806 of yacc.c  */
+#line 602 "parser.yy"
+    { (yyval.en) = nullptr; }
     break;
 
@@ -5748,6 +5501,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 578 "parser.yy"
-    { (yyval.en) =new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 607 "parser.yy"
+    { (yyval.op) = OperKinds::Assign; }
     break;
 
@@ -5755,6 +5508,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 580 "parser.yy"
-    { (yyval.en) =new CompositeExprNode( (yyvsp[(2) - (3)].en), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 608 "parser.yy"
+    { (yyval.op) = OperKinds::MulAssn; }
     break;
 
@@ -5762,6 +5515,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 582 "parser.yy"
-    { (yyval.en) = ( (yyvsp[(2) - (2)].en) == 0 ) ? (yyvsp[(1) - (2)].en) : new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
+#line 609 "parser.yy"
+    { (yyval.op) = OperKinds::DivAssn; }
     break;
 
@@ -5769,6 +5522,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 587 "parser.yy"
-    { (yyval.en) = new NullExprNode; }
+#line 610 "parser.yy"
+    { (yyval.op) = OperKinds::ModAssn; }
+    break;
+
+  case 111:
+
+/* Line 1806 of yacc.c  */
+#line 611 "parser.yy"
+    { (yyval.op) = OperKinds::PlusAssn; }
     break;
 
@@ -5776,6 +5536,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 595 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ) ); }
+#line 612 "parser.yy"
+    { (yyval.op) = OperKinds::MinusAssn; }
     break;
 
@@ -5783,6 +5543,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 597 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (yyvsp[(3) - (5)].en) ); }
+#line 613 "parser.yy"
+    { (yyval.op) = OperKinds::LSAssn; }
     break;
 
@@ -5790,6 +5550,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 599 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(new NullExprNode)->set_link( (yyvsp[(4) - (6)].en) ) ); }
+#line 614 "parser.yy"
+    { (yyval.op) = OperKinds::RSAssn; }
     break;
 
@@ -5797,6 +5557,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 601 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(yyvsp[(3) - (7)].en)->set_link( flattenCommas( (yyvsp[(5) - (7)].en) ) ) ); }
+#line 615 "parser.yy"
+    { (yyval.op) = OperKinds::AndAssn; }
+    break;
+
+  case 116:
+
+/* Line 1806 of yacc.c  */
+#line 616 "parser.yy"
+    { (yyval.op) = OperKinds::ERAssn; }
     break;
 
@@ -5804,6 +5571,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 607 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
+#line 617 "parser.yy"
+    { (yyval.op) = OperKinds::OrAssn; }
     break;
 
@@ -5811,6 +5578,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 611 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::MulAssn ); }
+#line 624 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_tuple() ); }
     break;
 
@@ -5818,6 +5585,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 612 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::DivAssn ); }
+#line 626 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_tuple( (yyvsp[(3) - (5)].en) ) ); }
     break;
 
@@ -5825,6 +5592,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 613 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::ModAssn ); }
+#line 628 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( (yyvsp[(4) - (6)].en) ) ) ); }
     break;
 
@@ -5832,13 +5599,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 614 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::PlusAssn ); }
-    break;
-
-  case 122:
-
-/* Line 1806 of yacc.c  */
-#line 615 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::MinusAssn ); }
+#line 630 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_tuple( (ExpressionNode *)(yyvsp[(3) - (7)].en)->set_last( (yyvsp[(5) - (7)].en) ) ) ); }
     break;
 
@@ -5846,13 +5606,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 616 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::LSAssn ); }
-    break;
-
-  case 124:
-
-/* Line 1806 of yacc.c  */
-#line 617 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::RSAssn ); }
+#line 636 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); }
     break;
 
@@ -5860,6 +5613,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 618 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::AndAssn ); }
+#line 642 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_comma( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5867,20 +5620,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 619 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::ERAssn ); }
-    break;
-
-  case 127:
-
-/* Line 1806 of yacc.c  */
-#line 620 "parser.yy"
-    { (yyval.en) = new OperatorNode( OperatorNode::OrAssn ); }
-    break;
-
-  case 129:
-
-/* Line 1806 of yacc.c  */
-#line 626 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Comma ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 647 "parser.yy"
+    { (yyval.en) = 0; }
     break;
 
@@ -5888,30 +5627,23 @@
 
 /* Line 1806 of yacc.c  */
-#line 631 "parser.yy"
-    { (yyval.en) = 0; }
-    break;
-
-  case 134:
-
-/* Line 1806 of yacc.c  */
-#line 640 "parser.yy"
+#line 656 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (1)].sn); }
     break;
 
-  case 140:
-
-/* Line 1806 of yacc.c  */
-#line 647 "parser.yy"
+  case 136:
+
+/* Line 1806 of yacc.c  */
+#line 663 "parser.yy"
     {
-			Token fn; fn.str = new std::string( "^?{}" ); // location undefined
-			(yyval.sn) = new StatementNode( StatementNode::Exp, new CompositeExprNode( new VarRefNode( fn ),
-				(ExpressionNode *)( (yyvsp[(2) - (6)].en) )->set_link( (yyvsp[(4) - (6)].en) ) ), 0 );
+			Token fn;
+			fn.str = new std::string( "^?{}" ); // location undefined
+			(yyval.sn) = new StatementNode( build_expr( new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( (yyvsp[(2) - (6)].en) )->set_last( (yyvsp[(4) - (6)].en) ) ) ) ) );
 		}
     break;
 
-  case 141:
-
-/* Line 1806 of yacc.c  */
-#line 657 "parser.yy"
+  case 137:
+
+/* Line 1806 of yacc.c  */
+#line 673 "parser.yy"
     {
 			(yyval.sn) = (yyvsp[(4) - (4)].sn)->add_label( (yyvsp[(1) - (4)].tok) );
@@ -5919,9 +5651,30 @@
     break;
 
+  case 138:
+
+/* Line 1806 of yacc.c  */
+#line 680 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_compound( (StatementNode *)0 ) ); }
+    break;
+
+  case 139:
+
+/* Line 1806 of yacc.c  */
+#line 687 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_compound( (yyvsp[(5) - (7)].sn) ) ); }
+    break;
+
+  case 141:
+
+/* Line 1806 of yacc.c  */
+#line 693 "parser.yy"
+    { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } }
+    break;
+
   case 142:
 
 /* Line 1806 of yacc.c  */
-#line 664 "parser.yy"
-    { (yyval.sn) = new CompoundStmtNode( (StatementNode *)0 ); }
+#line 698 "parser.yy"
+    { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
     break;
 
@@ -5929,28 +5682,7 @@
 
 /* Line 1806 of yacc.c  */
-#line 671 "parser.yy"
-    { (yyval.sn) = new CompoundStmtNode( (yyvsp[(5) - (7)].sn) ); }
-    break;
-
-  case 145:
-
-/* Line 1806 of yacc.c  */
-#line 677 "parser.yy"
-    { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } }
-    break;
-
-  case 146:
-
-/* Line 1806 of yacc.c  */
-#line 682 "parser.yy"
-    { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
-    break;
-
-  case 147:
-
-/* Line 1806 of yacc.c  */
-#line 684 "parser.yy"
+#line 700 "parser.yy"
     {	// mark all fields in list
-			for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != NULL; iter = (DeclarationNode *)iter->get_link() )
+			for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != NULL; iter = (DeclarationNode *)iter->get_next() )
 				iter->set_extension( true );
 			(yyval.sn) = new StatementNode( (yyvsp[(2) - (2)].decl) );
@@ -5958,9 +5690,37 @@
     break;
 
+  case 144:
+
+/* Line 1806 of yacc.c  */
+#line 706 "parser.yy"
+    { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
+    break;
+
+  case 147:
+
+/* Line 1806 of yacc.c  */
+#line 713 "parser.yy"
+    { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } }
+    break;
+
   case 148:
 
 /* Line 1806 of yacc.c  */
-#line 690 "parser.yy"
-    { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
+#line 718 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_expr( (yyvsp[(1) - (2)].en) ) ); }
+    break;
+
+  case 149:
+
+/* Line 1806 of yacc.c  */
+#line 724 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn), nullptr ) ); }
+    break;
+
+  case 150:
+
+/* Line 1806 of yacc.c  */
+#line 726 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].sn), (yyvsp[(7) - (7)].sn) ) ); }
     break;
 
@@ -5968,6 +5728,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 697 "parser.yy"
-    { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_link( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } }
+#line 728 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
     break;
 
@@ -5975,48 +5735,45 @@
 
 /* Line 1806 of yacc.c  */
-#line 702 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Exp, (yyvsp[(1) - (2)].en), 0 ); }
-    break;
-
-  case 153:
-
-/* Line 1806 of yacc.c  */
-#line 708 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::If, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
-    break;
-
-  case 154:
-
-/* Line 1806 of yacc.c  */
-#line 710 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::If, (yyvsp[(3) - (7)].en), (StatementNode *)mkList((*(yyvsp[(5) - (7)].sn), *(yyvsp[(7) - (7)].sn) )) ); }
-    break;
-
-  case 155:
-
-/* Line 1806 of yacc.c  */
-#line 712 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
-    break;
-
-  case 156:
-
-/* Line 1806 of yacc.c  */
-#line 714 "parser.yy"
+#line 730 "parser.yy"
     {
-			StatementNode *sw = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) );
+			StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) );
 			// The semantics of the declaration list is changed to include associated initialization, which is performed
 			// *before* the transfer to the appropriate case clause by hoisting the declarations into a compound
 			// statement around the switch.  Statements after the initial declaration list can never be executed, and
-			// therefore, are removed from the grammar even though C allows it. Change also applies to choose statement.
-			(yyval.sn) = (yyvsp[(7) - (9)].decl) != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode( (yyvsp[(7) - (9)].decl) ))->set_link( sw )) ) : sw;
+			// therefore, are removed from the grammar even though C allows it. The change also applies to choose
+			// statement.
+			(yyval.sn) = (yyvsp[(7) - (9)].decl) != 0 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( (yyvsp[(7) - (9)].decl) ))->set_last( sw )) ) ) : sw;
 		}
     break;
 
-  case 157:
-
-/* Line 1806 of yacc.c  */
-#line 723 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
+  case 153:
+
+/* Line 1806 of yacc.c  */
+#line 740 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
+    break;
+
+  case 154:
+
+/* Line 1806 of yacc.c  */
+#line 742 "parser.yy"
+    {
+			StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) );
+			(yyval.sn) = (yyvsp[(7) - (9)].decl) != 0 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( (yyvsp[(7) - (9)].decl) ))->set_last( sw )) ) ) : sw;
+		}
+    break;
+
+  case 155:
+
+/* Line 1806 of yacc.c  */
+#line 752 "parser.yy"
+    { (yyval.en) = (yyvsp[(1) - (1)].en); }
+    break;
+
+  case 156:
+
+/* Line 1806 of yacc.c  */
+#line 754 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -6024,336 +5781,315 @@
 
 /* Line 1806 of yacc.c  */
-#line 725 "parser.yy"
+#line 759 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_case( (yyvsp[(1) - (1)].en) ) ); }
+    break;
+
+  case 159:
+
+/* Line 1806 of yacc.c  */
+#line 761 "parser.yy"
+    { (yyval.sn) = (StatementNode *)((yyvsp[(1) - (3)].sn)->set_last( new StatementNode( build_case( (yyvsp[(3) - (3)].en) ) ) ) ); }
+    break;
+
+  case 160:
+
+/* Line 1806 of yacc.c  */
+#line 765 "parser.yy"
+    { (yyval.sn) = (yyvsp[(2) - (3)].sn); }
+    break;
+
+  case 161:
+
+/* Line 1806 of yacc.c  */
+#line 766 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_default() ); }
+    break;
+
+  case 163:
+
+/* Line 1806 of yacc.c  */
+#line 772 "parser.yy"
+    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_last( (yyvsp[(2) - (2)].sn) )); }
+    break;
+
+  case 164:
+
+/* Line 1806 of yacc.c  */
+#line 776 "parser.yy"
+    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); }
+    break;
+
+  case 165:
+
+/* Line 1806 of yacc.c  */
+#line 781 "parser.yy"
+    { (yyval.sn) = 0; }
+    break;
+
+  case 167:
+
+/* Line 1806 of yacc.c  */
+#line 787 "parser.yy"
+    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); }
+    break;
+
+  case 168:
+
+/* Line 1806 of yacc.c  */
+#line 789 "parser.yy"
+    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(3) - (3)].sn) ) ) ) ) ); }
+    break;
+
+  case 169:
+
+/* Line 1806 of yacc.c  */
+#line 794 "parser.yy"
+    { (yyval.sn) = 0; }
+    break;
+
+  case 171:
+
+/* Line 1806 of yacc.c  */
+#line 800 "parser.yy"
+    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
+    break;
+
+  case 172:
+
+/* Line 1806 of yacc.c  */
+#line 802 "parser.yy"
+    { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(2) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ) ) ) ); }
+    break;
+
+  case 173:
+
+/* Line 1806 of yacc.c  */
+#line 804 "parser.yy"
+    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); }
+    break;
+
+  case 174:
+
+/* Line 1806 of yacc.c  */
+#line 806 "parser.yy"
+    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (4)].sn)->set_last( (yyvsp[(2) - (4)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(3) - (4)].sn)->set_last( (yyvsp[(4) - (4)].sn) ) ) ) ) ) ); }
+    break;
+
+  case 175:
+
+/* Line 1806 of yacc.c  */
+#line 811 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_branch( "", BranchStmt::Break ) ); }
+    break;
+
+  case 177:
+
+/* Line 1806 of yacc.c  */
+#line 817 "parser.yy"
+    { (yyval.sn) = 0; }
+    break;
+
+  case 178:
+
+/* Line 1806 of yacc.c  */
+#line 819 "parser.yy"
+    { (yyval.sn) = 0; }
+    break;
+
+  case 179:
+
+/* Line 1806 of yacc.c  */
+#line 824 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_while( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
+    break;
+
+  case 180:
+
+/* Line 1806 of yacc.c  */
+#line 826 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn) ) ); }
+    break;
+
+  case 181:
+
+/* Line 1806 of yacc.c  */
+#line 828 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_for( (yyvsp[(4) - (6)].fctl), (yyvsp[(6) - (6)].sn) ) ); }
+    break;
+
+  case 182:
+
+/* Line 1806 of yacc.c  */
+#line 833 "parser.yy"
+    { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); }
+    break;
+
+  case 183:
+
+/* Line 1806 of yacc.c  */
+#line 835 "parser.yy"
+    { (yyval.fctl) = new ForCtl( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); }
+    break;
+
+  case 184:
+
+/* Line 1806 of yacc.c  */
+#line 840 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_branch( *(yyvsp[(2) - (3)].tok), BranchStmt::Goto ) ); }
+    break;
+
+  case 185:
+
+/* Line 1806 of yacc.c  */
+#line 844 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_computedgoto( (yyvsp[(3) - (4)].en) ) ); }
+    break;
+
+  case 186:
+
+/* Line 1806 of yacc.c  */
+#line 847 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_branch( "", BranchStmt::Continue ) ); }
+    break;
+
+  case 187:
+
+/* Line 1806 of yacc.c  */
+#line 851 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_branch( *(yyvsp[(2) - (3)].tok), BranchStmt::Continue ) ); delete (yyvsp[(2) - (3)].tok); }
+    break;
+
+  case 188:
+
+/* Line 1806 of yacc.c  */
+#line 854 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_branch( "", BranchStmt::Break ) ); }
+    break;
+
+  case 189:
+
+/* Line 1806 of yacc.c  */
+#line 858 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_branch( *(yyvsp[(2) - (3)].tok), BranchStmt::Break ) ); delete (yyvsp[(2) - (3)].tok); }
+    break;
+
+  case 190:
+
+/* Line 1806 of yacc.c  */
+#line 860 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_return( (yyvsp[(2) - (3)].en) ) ); }
+    break;
+
+  case 191:
+
+/* Line 1806 of yacc.c  */
+#line 862 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); }
+    break;
+
+  case 192:
+
+/* Line 1806 of yacc.c  */
+#line 864 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); }
+    break;
+
+  case 193:
+
+/* Line 1806 of yacc.c  */
+#line 866 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (5)].en) ) ); }
+    break;
+
+  case 194:
+
+/* Line 1806 of yacc.c  */
+#line 871 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), (yyvsp[(3) - (3)].sn), 0 ) ); }
+    break;
+
+  case 195:
+
+/* Line 1806 of yacc.c  */
+#line 873 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), 0, (yyvsp[(3) - (3)].sn) ) ); }
+    break;
+
+  case 196:
+
+/* Line 1806 of yacc.c  */
+#line 875 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (4)].sn), (yyvsp[(3) - (4)].sn), (yyvsp[(4) - (4)].sn) ) ); }
+    break;
+
+  case 198:
+
+/* Line 1806 of yacc.c  */
+#line 882 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); }
+    break;
+
+  case 199:
+
+/* Line 1806 of yacc.c  */
+#line 884 "parser.yy"
+    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); }
+    break;
+
+  case 200:
+
+/* Line 1806 of yacc.c  */
+#line 886 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); }
+    break;
+
+  case 201:
+
+/* Line 1806 of yacc.c  */
+#line 888 "parser.yy"
+    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); }
+    break;
+
+  case 202:
+
+/* Line 1806 of yacc.c  */
+#line 893 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); }
+    break;
+
+  case 203:
+
+/* Line 1806 of yacc.c  */
+#line 895 "parser.yy"
+    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); }
+    break;
+
+  case 204:
+
+/* Line 1806 of yacc.c  */
+#line 897 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); }
+    break;
+
+  case 205:
+
+/* Line 1806 of yacc.c  */
+#line 899 "parser.yy"
+    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); }
+    break;
+
+  case 206:
+
+/* Line 1806 of yacc.c  */
+#line 904 "parser.yy"
     {
-			StatementNode *sw = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) );
-			(yyval.sn) = (yyvsp[(7) - (9)].decl) != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode( (yyvsp[(7) - (9)].decl) ))->set_link( sw )) ) : sw;
+			(yyval.sn) = new StatementNode( build_finally( (yyvsp[(2) - (2)].sn) ) );
 		}
     break;
 
-  case 159:
-
-/* Line 1806 of yacc.c  */
-#line 735 "parser.yy"
-    { (yyval.en) = (yyvsp[(1) - (1)].en); }
-    break;
-
-  case 160:
-
-/* Line 1806 of yacc.c  */
-#line 737 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 163:
-
-/* Line 1806 of yacc.c  */
-#line 744 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(tupleContents( (yyvsp[(1) - (3)].en) ))->set_link( (yyvsp[(3) - (3)].en) ) ); }
-    break;
-
-  case 164:
-
-/* Line 1806 of yacc.c  */
-#line 748 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Case, (yyvsp[(2) - (3)].en), 0 ); }
-    break;
-
-  case 165:
-
-/* Line 1806 of yacc.c  */
-#line 749 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Default ); }
-    break;
-
-  case 167:
-
-/* Line 1806 of yacc.c  */
-#line 755 "parser.yy"
-    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_link( (yyvsp[(2) - (2)].sn) )); }
-    break;
-
-  case 168:
-
-/* Line 1806 of yacc.c  */
-#line 759 "parser.yy"
-    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new CompoundStmtNode( (yyvsp[(2) - (2)].sn) ) ); }
-    break;
-
-  case 169:
-
-/* Line 1806 of yacc.c  */
-#line 764 "parser.yy"
-    { (yyval.sn) = 0; }
-    break;
-
-  case 171:
-
-/* Line 1806 of yacc.c  */
-#line 770 "parser.yy"
-    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new CompoundStmtNode( (yyvsp[(2) - (2)].sn) ) ); }
-    break;
-
-  case 172:
-
-/* Line 1806 of yacc.c  */
-#line 772 "parser.yy"
-    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(2) - (3)].sn)->append_last_case( new CompoundStmtNode( (yyvsp[(3) - (3)].sn) ) ) ) ); }
-    break;
-
-  case 173:
-
-/* Line 1806 of yacc.c  */
-#line 777 "parser.yy"
-    { (yyval.sn) = 0; }
-    break;
-
-  case 175:
-
-/* Line 1806 of yacc.c  */
-#line 783 "parser.yy"
-    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
-    break;
-
-  case 176:
-
-/* Line 1806 of yacc.c  */
-#line 785 "parser.yy"
-    { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*(yyvsp[(2) - (3)].sn), *(yyvsp[(3) - (3)].sn) ) ) ) ); }
-    break;
-
-  case 177:
-
-/* Line 1806 of yacc.c  */
-#line 787 "parser.yy"
-    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); }
-    break;
-
-  case 178:
-
-/* Line 1806 of yacc.c  */
-#line 789 "parser.yy"
-    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (4)].sn)->set_link( (yyvsp[(2) - (4)].sn)->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*(yyvsp[(3) - (4)].sn), *(yyvsp[(4) - (4)].sn) ) ) ) ) ) ); }
-    break;
-
-  case 179:
-
-/* Line 1806 of yacc.c  */
-#line 794 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Break ); }
-    break;
-
-  case 181:
-
-/* Line 1806 of yacc.c  */
-#line 800 "parser.yy"
-    { (yyval.sn) = 0; }
-    break;
-
-  case 182:
-
-/* Line 1806 of yacc.c  */
-#line 802 "parser.yy"
-    { (yyval.sn) = 0; }
-    break;
-
-  case 183:
-
-/* Line 1806 of yacc.c  */
-#line 807 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::While, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
-    break;
-
-  case 184:
-
-/* Line 1806 of yacc.c  */
-#line 809 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Do, (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn) ); }
-    break;
-
-  case 185:
-
-/* Line 1806 of yacc.c  */
-#line 811 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::For, (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].sn) ); }
-    break;
-
-  case 186:
-
-/* Line 1806 of yacc.c  */
-#line 816 "parser.yy"
-    { (yyval.en) = new ForCtlExprNode( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); }
-    break;
-
-  case 187:
-
-/* Line 1806 of yacc.c  */
-#line 818 "parser.yy"
-    { (yyval.en) = new ForCtlExprNode( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); }
-    break;
-
-  case 188:
-
-/* Line 1806 of yacc.c  */
-#line 823 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Goto, (yyvsp[(2) - (3)].tok) ); }
-    break;
-
-  case 189:
-
-/* Line 1806 of yacc.c  */
-#line 827 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Goto, (yyvsp[(3) - (4)].en) ); }
-    break;
-
-  case 190:
-
-/* Line 1806 of yacc.c  */
-#line 830 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Continue ); }
-    break;
-
-  case 191:
-
-/* Line 1806 of yacc.c  */
-#line 834 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Continue, (yyvsp[(2) - (3)].tok) ); }
-    break;
-
-  case 192:
-
-/* Line 1806 of yacc.c  */
-#line 837 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Break ); }
-    break;
-
-  case 193:
-
-/* Line 1806 of yacc.c  */
-#line 841 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Break, (yyvsp[(2) - (3)].tok) ); }
-    break;
-
-  case 194:
-
-/* Line 1806 of yacc.c  */
-#line 843 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Return, (yyvsp[(2) - (3)].en), 0 ); }
-    break;
-
-  case 195:
-
-/* Line 1806 of yacc.c  */
-#line 845 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (3)].en), 0 ); }
-    break;
-
-  case 196:
-
-/* Line 1806 of yacc.c  */
-#line 849 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (3)].en), 0 ); }
-    break;
-
-  case 197:
-
-/* Line 1806 of yacc.c  */
-#line 851 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (5)].en), 0 ); }
-    break;
-
-  case 198:
-
-/* Line 1806 of yacc.c  */
-#line 858 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].pn) )))); }
-    break;
-
-  case 199:
-
-/* Line 1806 of yacc.c  */
-#line 860 "parser.yy"
-    { (yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].pn) )))); }
-    break;
-
-  case 200:
-
-/* Line 1806 of yacc.c  */
-#line 862 "parser.yy"
-    {
-			(yyvsp[(3) - (4)].pn)->set_link( (yyvsp[(4) - (4)].pn) );
-			(yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (4)].sn),*(yyvsp[(3) - (4)].pn) ))));
-		}
-    break;
-
-  case 202:
-
-/* Line 1806 of yacc.c  */
-#line 873 "parser.yy"
-    { (yyval.pn) = StatementNode::newCatchStmt( 0, (yyvsp[(5) - (5)].sn), true ); }
-    break;
-
-  case 203:
-
-/* Line 1806 of yacc.c  */
-#line 875 "parser.yy"
-    { (yyval.pn) = (yyvsp[(1) - (6)].pn)->set_link( StatementNode::newCatchStmt( 0, (yyvsp[(6) - (6)].sn), true ) ); }
-    break;
-
-  case 204:
-
-/* Line 1806 of yacc.c  */
-#line 877 "parser.yy"
-    { (yyval.pn) = StatementNode::newCatchStmt( 0, (yyvsp[(5) - (5)].sn), true ); }
-    break;
-
-  case 205:
-
-/* Line 1806 of yacc.c  */
-#line 879 "parser.yy"
-    { (yyval.pn) = (yyvsp[(1) - (6)].pn)->set_link( StatementNode::newCatchStmt( 0, (yyvsp[(6) - (6)].sn), true ) ); }
-    break;
-
-  case 206:
-
-/* Line 1806 of yacc.c  */
-#line 884 "parser.yy"
-    { (yyval.pn) = StatementNode::newCatchStmt( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ); }
-    break;
-
-  case 207:
-
-/* Line 1806 of yacc.c  */
-#line 886 "parser.yy"
-    { (yyval.pn) = (yyvsp[(1) - (10)].pn)->set_link( StatementNode::newCatchStmt( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ); }
-    break;
-
   case 208:
 
 /* Line 1806 of yacc.c  */
-#line 888 "parser.yy"
-    { (yyval.pn) = StatementNode::newCatchStmt( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ); }
-    break;
-
-  case 209:
-
-/* Line 1806 of yacc.c  */
-#line 890 "parser.yy"
-    { (yyval.pn) = (yyvsp[(1) - (10)].pn)->set_link( StatementNode::newCatchStmt( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ); }
-    break;
-
-  case 210:
-
-/* Line 1806 of yacc.c  */
-#line 895 "parser.yy"
-    {
-			(yyval.pn) = new StatementNode( StatementNode::Finally, 0, (yyvsp[(2) - (2)].sn) );
-			std::cout << "Just created a finally node" << std::endl;
-		}
-    break;
-
-  case 212:
-
-/* Line 1806 of yacc.c  */
-#line 909 "parser.yy"
+#line 917 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6362,15 +6098,15 @@
     break;
 
-  case 213:
-
-/* Line 1806 of yacc.c  */
-#line 914 "parser.yy"
+  case 209:
+
+/* Line 1806 of yacc.c  */
+#line 922 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 214:
-
-/* Line 1806 of yacc.c  */
-#line 916 "parser.yy"
+  case 210:
+
+/* Line 1806 of yacc.c  */
+#line 924 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6379,9 +6115,37 @@
     break;
 
+  case 212:
+
+/* Line 1806 of yacc.c  */
+#line 933 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ) ); }
+    break;
+
+  case 213:
+
+/* Line 1806 of yacc.c  */
+#line 935 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ) ); }
+    break;
+
+  case 214:
+
+/* Line 1806 of yacc.c  */
+#line 937 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ) ); }
+    break;
+
+  case 215:
+
+/* Line 1806 of yacc.c  */
+#line 939 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (12)].flag), (yyvsp[(4) - (12)].constant), (yyvsp[(6) - (12)].en), (yyvsp[(8) - (12)].en), (yyvsp[(10) - (12)].en) ) ); }
+    break;
+
   case 216:
 
 /* Line 1806 of yacc.c  */
-#line 925 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ); }
+#line 941 "parser.yy"
+    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (14)].flag), (yyvsp[(5) - (14)].constant), 0, (yyvsp[(8) - (14)].en), (yyvsp[(10) - (14)].en), (yyvsp[(12) - (14)].label) ) ); }
     break;
 
@@ -6389,6 +6153,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 927 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ); }
+#line 946 "parser.yy"
+    { (yyval.flag) = false; }
     break;
 
@@ -6396,6 +6160,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 929 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ); }
+#line 948 "parser.yy"
+    { (yyval.flag) = true; }
     break;
 
@@ -6403,20 +6167,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 931 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (12)].flag), (yyvsp[(4) - (12)].constant), (yyvsp[(6) - (12)].en), (yyvsp[(8) - (12)].en), (yyvsp[(10) - (12)].constant) ); }
-    break;
-
-  case 220:
-
-/* Line 1806 of yacc.c  */
-#line 933 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (14)].flag), (yyvsp[(5) - (14)].constant), 0, (yyvsp[(8) - (14)].en), (yyvsp[(10) - (14)].constant), (yyvsp[(12) - (14)].label) ); }
-    break;
-
-  case 221:
-
-/* Line 1806 of yacc.c  */
-#line 938 "parser.yy"
-    { (yyval.flag) = false; }
+#line 953 "parser.yy"
+    { (yyval.en) = 0; }
     break;
 
@@ -6424,6 +6174,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 940 "parser.yy"
-    { (yyval.flag) = true; }
+#line 960 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) ); }
     break;
 
@@ -6431,5 +6181,19 @@
 
 /* Line 1806 of yacc.c  */
-#line 945 "parser.yy"
+#line 965 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_asmexpr( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ) ); }
+    break;
+
+  case 224:
+
+/* Line 1806 of yacc.c  */
+#line 967 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_asmexpr( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ) ); }
+    break;
+
+  case 225:
+
+/* Line 1806 of yacc.c  */
+#line 972 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -6438,6 +6202,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 952 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
+#line 974 "parser.yy"
+    { (yyval.en) = new ExpressionNode( (yyvsp[(1) - (1)].constant) ); }
     break;
 
@@ -6445,6 +6209,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 957 "parser.yy"
-    { (yyval.en) = new AsmExprNode( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ); }
+#line 976 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( (yyvsp[(3) - (3)].constant) ) ); }
     break;
 
@@ -6452,6 +6216,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 959 "parser.yy"
-    { (yyval.en) = new AsmExprNode( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ); }
+#line 981 "parser.yy"
+    { (yyval.label) = new LabelNode(); (yyval.label)->labels.push_back( *(yyvsp[(1) - (1)].tok) ); }
     break;
 
@@ -6459,6 +6223,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 964 "parser.yy"
-    { (yyval.constant) = 0; }
+#line 983 "parser.yy"
+    { (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->labels.push_back( *(yyvsp[(3) - (3)].tok) ); }
     break;
 
@@ -6466,20 +6230,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 966 "parser.yy"
-    { (yyval.constant) = (yyvsp[(1) - (1)].constant); }
-    break;
-
-  case 231:
-
-/* Line 1806 of yacc.c  */
-#line 968 "parser.yy"
-    { (yyval.constant) = (ConstantNode *)(yyvsp[(1) - (3)].constant)->set_link( (yyvsp[(3) - (3)].constant) ); }
-    break;
-
-  case 232:
-
-/* Line 1806 of yacc.c  */
-#line 973 "parser.yy"
-    { (yyval.label) = new LabelNode(); (yyval.label)->append_label( (yyvsp[(1) - (1)].tok) ); }
+#line 990 "parser.yy"
+    { (yyval.decl) = 0; }
     break;
 
@@ -6487,6 +6237,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 975 "parser.yy"
-    { (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->append_label( (yyvsp[(3) - (3)].tok) ); }
+#line 997 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
 
@@ -6494,5 +6244,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 982 "parser.yy"
+#line 1002 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -6501,40 +6251,26 @@
 
 /* Line 1806 of yacc.c  */
-#line 989 "parser.yy"
+#line 1009 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 238:
-
-/* Line 1806 of yacc.c  */
-#line 994 "parser.yy"
-    { (yyval.decl) = 0; }
-    break;
-
-  case 241:
-
-/* Line 1806 of yacc.c  */
-#line 1001 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
-    break;
-
-  case 246:
-
-/* Line 1806 of yacc.c  */
-#line 1015 "parser.yy"
+  case 242:
+
+/* Line 1806 of yacc.c  */
+#line 1023 "parser.yy"
     {}
     break;
 
-  case 247:
-
-/* Line 1806 of yacc.c  */
-#line 1016 "parser.yy"
+  case 243:
+
+/* Line 1806 of yacc.c  */
+#line 1024 "parser.yy"
     {}
     break;
 
-  case 255:
-
-/* Line 1806 of yacc.c  */
-#line 1045 "parser.yy"
+  case 251:
+
+/* Line 1806 of yacc.c  */
+#line 1053 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6543,8 +6279,8 @@
     break;
 
-  case 256:
-
-/* Line 1806 of yacc.c  */
-#line 1052 "parser.yy"
+  case 252:
+
+/* Line 1806 of yacc.c  */
+#line 1060 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6553,8 +6289,8 @@
     break;
 
-  case 257:
-
-/* Line 1806 of yacc.c  */
-#line 1057 "parser.yy"
+  case 253:
+
+/* Line 1806 of yacc.c  */
+#line 1065 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (6)].tok), TypedefTable::ID );
@@ -6563,8 +6299,8 @@
     break;
 
-  case 258:
-
-/* Line 1806 of yacc.c  */
-#line 1067 "parser.yy"
+  case 254:
+
+/* Line 1806 of yacc.c  */
+#line 1075 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) );
@@ -6573,8 +6309,8 @@
     break;
 
-  case 259:
-
-/* Line 1806 of yacc.c  */
-#line 1072 "parser.yy"
+  case 255:
+
+/* Line 1806 of yacc.c  */
+#line 1080 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) );
@@ -6583,8 +6319,8 @@
     break;
 
-  case 260:
-
-/* Line 1806 of yacc.c  */
-#line 1077 "parser.yy"
+  case 256:
+
+/* Line 1806 of yacc.c  */
+#line 1085 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(3) - (4)].tok) );
@@ -6593,8 +6329,8 @@
     break;
 
-  case 261:
-
-/* Line 1806 of yacc.c  */
-#line 1085 "parser.yy"
+  case 257:
+
+/* Line 1806 of yacc.c  */
+#line 1093 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6603,8 +6339,8 @@
     break;
 
-  case 262:
-
-/* Line 1806 of yacc.c  */
-#line 1090 "parser.yy"
+  case 258:
+
+/* Line 1806 of yacc.c  */
+#line 1098 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6613,8 +6349,8 @@
     break;
 
-  case 263:
-
-/* Line 1806 of yacc.c  */
-#line 1095 "parser.yy"
+  case 259:
+
+/* Line 1806 of yacc.c  */
+#line 1103 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6623,8 +6359,8 @@
     break;
 
-  case 264:
-
-/* Line 1806 of yacc.c  */
-#line 1100 "parser.yy"
+  case 260:
+
+/* Line 1806 of yacc.c  */
+#line 1108 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6633,8 +6369,8 @@
     break;
 
-  case 265:
-
-/* Line 1806 of yacc.c  */
-#line 1105 "parser.yy"
+  case 261:
+
+/* Line 1806 of yacc.c  */
+#line 1113 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::ID );
@@ -6643,8 +6379,8 @@
     break;
 
-  case 266:
-
-/* Line 1806 of yacc.c  */
-#line 1113 "parser.yy"
+  case 262:
+
+/* Line 1806 of yacc.c  */
+#line 1121 "parser.yy"
     {
 			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(3) - (8)].tok), DeclarationNode::newTuple( 0 ), (yyvsp[(6) - (8)].decl), 0, true );
@@ -6652,8 +6388,8 @@
     break;
 
-  case 267:
-
-/* Line 1806 of yacc.c  */
-#line 1136 "parser.yy"
+  case 263:
+
+/* Line 1806 of yacc.c  */
+#line 1144 "parser.yy"
     {
 			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true );
@@ -6661,8 +6397,8 @@
     break;
 
-  case 268:
-
-/* Line 1806 of yacc.c  */
-#line 1140 "parser.yy"
+  case 264:
+
+/* Line 1806 of yacc.c  */
+#line 1148 "parser.yy"
     {
 			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true );
@@ -6670,22 +6406,22 @@
     break;
 
-  case 269:
-
-/* Line 1806 of yacc.c  */
-#line 1147 "parser.yy"
+  case 265:
+
+/* Line 1806 of yacc.c  */
+#line 1155 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
     break;
 
-  case 270:
-
-/* Line 1806 of yacc.c  */
-#line 1151 "parser.yy"
+  case 266:
+
+/* Line 1806 of yacc.c  */
+#line 1159 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (9)].decl)->appendList( (yyvsp[(7) - (9)].decl) ) ); }
     break;
 
-  case 271:
-
-/* Line 1806 of yacc.c  */
-#line 1156 "parser.yy"
+  case 267:
+
+/* Line 1806 of yacc.c  */
+#line 1164 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6694,8 +6430,8 @@
     break;
 
-  case 272:
-
-/* Line 1806 of yacc.c  */
-#line 1161 "parser.yy"
+  case 268:
+
+/* Line 1806 of yacc.c  */
+#line 1169 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6704,8 +6440,8 @@
     break;
 
-  case 273:
-
-/* Line 1806 of yacc.c  */
-#line 1166 "parser.yy"
+  case 269:
+
+/* Line 1806 of yacc.c  */
+#line 1174 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::TD );
@@ -6714,8 +6450,8 @@
     break;
 
-  case 274:
-
-/* Line 1806 of yacc.c  */
-#line 1177 "parser.yy"
+  case 270:
+
+/* Line 1806 of yacc.c  */
+#line 1185 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6724,8 +6460,8 @@
     break;
 
-  case 275:
-
-/* Line 1806 of yacc.c  */
-#line 1182 "parser.yy"
+  case 271:
+
+/* Line 1806 of yacc.c  */
+#line 1190 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6734,8 +6470,8 @@
     break;
 
-  case 276:
-
-/* Line 1806 of yacc.c  */
-#line 1187 "parser.yy"
+  case 272:
+
+/* Line 1806 of yacc.c  */
+#line 1195 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6744,8 +6480,8 @@
     break;
 
-  case 277:
-
-/* Line 1806 of yacc.c  */
-#line 1192 "parser.yy"
+  case 273:
+
+/* Line 1806 of yacc.c  */
+#line 1200 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6754,8 +6490,8 @@
     break;
 
-  case 278:
-
-/* Line 1806 of yacc.c  */
-#line 1197 "parser.yy"
+  case 274:
+
+/* Line 1806 of yacc.c  */
+#line 1205 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6764,8 +6500,8 @@
     break;
 
-  case 279:
-
-/* Line 1806 of yacc.c  */
-#line 1206 "parser.yy"
+  case 275:
+
+/* Line 1806 of yacc.c  */
+#line 1214 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(2) - (4)].tok), TypedefTable::TD );
@@ -6774,8 +6510,8 @@
     break;
 
-  case 280:
-
-/* Line 1806 of yacc.c  */
-#line 1211 "parser.yy"
+  case 276:
+
+/* Line 1806 of yacc.c  */
+#line 1219 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (7)].tok), TypedefTable::TD );
@@ -6784,8 +6520,8 @@
     break;
 
-  case 285:
-
-/* Line 1806 of yacc.c  */
-#line 1228 "parser.yy"
+  case 281:
+
+/* Line 1806 of yacc.c  */
+#line 1236 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6794,8 +6530,8 @@
     break;
 
-  case 286:
-
-/* Line 1806 of yacc.c  */
-#line 1233 "parser.yy"
+  case 282:
+
+/* Line 1806 of yacc.c  */
+#line 1241 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6804,16 +6540,44 @@
     break;
 
-  case 295:
-
-/* Line 1806 of yacc.c  */
-#line 1255 "parser.yy"
+  case 291:
+
+/* Line 1806 of yacc.c  */
+#line 1263 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
+  case 294:
+
+/* Line 1806 of yacc.c  */
+#line 1275 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 297:
+
+/* Line 1806 of yacc.c  */
+#line 1286 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); }
+    break;
+
   case 298:
 
 /* Line 1806 of yacc.c  */
-#line 1267 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+#line 1288 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); }
+    break;
+
+  case 299:
+
+/* Line 1806 of yacc.c  */
+#line 1290 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); }
+    break;
+
+  case 300:
+
+/* Line 1806 of yacc.c  */
+#line 1292 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); }
     break;
 
@@ -6821,6 +6585,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1278 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); }
+#line 1294 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); }
     break;
 
@@ -6828,33 +6592,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1280 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); }
-    break;
-
-  case 303:
-
-/* Line 1806 of yacc.c  */
-#line 1282 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); }
-    break;
-
-  case 304:
-
-/* Line 1806 of yacc.c  */
-#line 1284 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); }
-    break;
-
-  case 305:
-
-/* Line 1806 of yacc.c  */
-#line 1286 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); }
-    break;
-
-  case 306:
-
-/* Line 1806 of yacc.c  */
-#line 1288 "parser.yy"
+#line 1296 "parser.yy"
     {
 			typedefTable.enterScope();
@@ -6862,8 +6598,8 @@
     break;
 
-  case 307:
-
-/* Line 1806 of yacc.c  */
-#line 1292 "parser.yy"
+  case 303:
+
+/* Line 1806 of yacc.c  */
+#line 1300 "parser.yy"
     {
 			typedefTable.leaveScope();
@@ -6872,292 +6608,278 @@
     break;
 
-  case 309:
-
-/* Line 1806 of yacc.c  */
-#line 1301 "parser.yy"
+  case 305:
+
+/* Line 1806 of yacc.c  */
+#line 1309 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
+  case 306:
+
+/* Line 1806 of yacc.c  */
+#line 1311 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
+    break;
+
+  case 308:
+
+/* Line 1806 of yacc.c  */
+#line 1322 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 310:
 
 /* Line 1806 of yacc.c  */
-#line 1303 "parser.yy"
+#line 1331 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); }
+    break;
+
+  case 311:
+
+/* Line 1806 of yacc.c  */
+#line 1333 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); }
+    break;
+
+  case 312:
+
+/* Line 1806 of yacc.c  */
+#line 1335 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); }
+    break;
+
+  case 313:
+
+/* Line 1806 of yacc.c  */
+#line 1337 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); }
+    break;
+
+  case 314:
+
+/* Line 1806 of yacc.c  */
+#line 1339 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Inline ); }
+    break;
+
+  case 315:
+
+/* Line 1806 of yacc.c  */
+#line 1341 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); }
+    break;
+
+  case 316:
+
+/* Line 1806 of yacc.c  */
+#line 1343 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Noreturn ); }
+    break;
+
+  case 317:
+
+/* Line 1806 of yacc.c  */
+#line 1345 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); }
+    break;
+
+  case 318:
+
+/* Line 1806 of yacc.c  */
+#line 1350 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); }
+    break;
+
+  case 319:
+
+/* Line 1806 of yacc.c  */
+#line 1352 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); }
+    break;
+
+  case 320:
+
+/* Line 1806 of yacc.c  */
+#line 1354 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); }
+    break;
+
+  case 321:
+
+/* Line 1806 of yacc.c  */
+#line 1356 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); }
+    break;
+
+  case 322:
+
+/* Line 1806 of yacc.c  */
+#line 1358 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Long ); }
+    break;
+
+  case 323:
+
+/* Line 1806 of yacc.c  */
+#line 1360 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Short ); }
+    break;
+
+  case 324:
+
+/* Line 1806 of yacc.c  */
+#line 1362 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Signed ); }
+    break;
+
+  case 325:
+
+/* Line 1806 of yacc.c  */
+#line 1364 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Unsigned ); }
+    break;
+
+  case 326:
+
+/* Line 1806 of yacc.c  */
+#line 1366 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); }
+    break;
+
+  case 327:
+
+/* Line 1806 of yacc.c  */
+#line 1368 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); }
+    break;
+
+  case 328:
+
+/* Line 1806 of yacc.c  */
+#line 1370 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Complex ); }
+    break;
+
+  case 329:
+
+/* Line 1806 of yacc.c  */
+#line 1372 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Imaginary ); }
+    break;
+
+  case 330:
+
+/* Line 1806 of yacc.c  */
+#line 1374 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
+    break;
+
+  case 332:
+
+/* Line 1806 of yacc.c  */
+#line 1381 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 333:
+
+/* Line 1806 of yacc.c  */
+#line 1383 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 334:
+
+/* Line 1806 of yacc.c  */
+#line 1385 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 312:
-
-/* Line 1806 of yacc.c  */
-#line 1314 "parser.yy"
+  case 335:
+
+/* Line 1806 of yacc.c  */
+#line 1387 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); }
+    break;
+
+  case 337:
+
+/* Line 1806 of yacc.c  */
+#line 1393 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
+    break;
+
+  case 339:
+
+/* Line 1806 of yacc.c  */
+#line 1400 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 340:
+
+/* Line 1806 of yacc.c  */
+#line 1402 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 314:
-
-/* Line 1806 of yacc.c  */
-#line 1323 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); }
-    break;
-
-  case 315:
-
-/* Line 1806 of yacc.c  */
-#line 1325 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); }
-    break;
-
-  case 316:
-
-/* Line 1806 of yacc.c  */
-#line 1327 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); }
-    break;
-
-  case 317:
-
-/* Line 1806 of yacc.c  */
-#line 1329 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); }
-    break;
-
-  case 318:
-
-/* Line 1806 of yacc.c  */
-#line 1331 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Inline ); }
-    break;
-
-  case 319:
-
-/* Line 1806 of yacc.c  */
-#line 1333 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); }
-    break;
-
-  case 320:
-
-/* Line 1806 of yacc.c  */
-#line 1335 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Noreturn ); }
-    break;
-
-  case 321:
-
-/* Line 1806 of yacc.c  */
-#line 1337 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); }
-    break;
-
-  case 322:
-
-/* Line 1806 of yacc.c  */
-#line 1342 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); }
-    break;
-
-  case 323:
-
-/* Line 1806 of yacc.c  */
-#line 1344 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); }
-    break;
-
-  case 324:
-
-/* Line 1806 of yacc.c  */
-#line 1346 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); }
-    break;
-
-  case 325:
-
-/* Line 1806 of yacc.c  */
-#line 1348 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); }
-    break;
-
-  case 326:
-
-/* Line 1806 of yacc.c  */
-#line 1350 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Long ); }
-    break;
-
-  case 327:
-
-/* Line 1806 of yacc.c  */
-#line 1352 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Short ); }
-    break;
-
-  case 328:
-
-/* Line 1806 of yacc.c  */
-#line 1354 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Signed ); }
-    break;
-
-  case 329:
-
-/* Line 1806 of yacc.c  */
-#line 1356 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Unsigned ); }
-    break;
-
-  case 330:
-
-/* Line 1806 of yacc.c  */
-#line 1358 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); }
-    break;
-
-  case 331:
-
-/* Line 1806 of yacc.c  */
-#line 1360 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); }
-    break;
-
-  case 332:
-
-/* Line 1806 of yacc.c  */
-#line 1362 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Complex ); }
-    break;
-
-  case 333:
-
-/* Line 1806 of yacc.c  */
-#line 1364 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Imaginary ); }
-    break;
-
-  case 334:
-
-/* Line 1806 of yacc.c  */
-#line 1366 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
-    break;
-
-  case 336:
-
-/* Line 1806 of yacc.c  */
-#line 1373 "parser.yy"
+  case 341:
+
+/* Line 1806 of yacc.c  */
+#line 1404 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 342:
+
+/* Line 1806 of yacc.c  */
+#line 1409 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (4)].decl); }
+    break;
+
+  case 343:
+
+/* Line 1806 of yacc.c  */
+#line 1411 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); }
+    break;
+
+  case 344:
+
+/* Line 1806 of yacc.c  */
+#line 1413 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); }
+    break;
+
+  case 345:
+
+/* Line 1806 of yacc.c  */
+#line 1415 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
+    break;
+
+  case 347:
+
+/* Line 1806 of yacc.c  */
+#line 1421 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 337:
-
-/* Line 1806 of yacc.c  */
-#line 1375 "parser.yy"
+  case 348:
+
+/* Line 1806 of yacc.c  */
+#line 1423 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 338:
-
-/* Line 1806 of yacc.c  */
-#line 1377 "parser.yy"
+  case 349:
+
+/* Line 1806 of yacc.c  */
+#line 1425 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 339:
-
-/* Line 1806 of yacc.c  */
-#line 1379 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); }
-    break;
-
-  case 341:
-
-/* Line 1806 of yacc.c  */
-#line 1385 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
-    break;
-
-  case 343:
-
-/* Line 1806 of yacc.c  */
-#line 1392 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 344:
-
-/* Line 1806 of yacc.c  */
-#line 1394 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 345:
-
-/* Line 1806 of yacc.c  */
-#line 1396 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 346:
-
-/* Line 1806 of yacc.c  */
-#line 1401 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (4)].decl); }
-    break;
-
-  case 347:
-
-/* Line 1806 of yacc.c  */
-#line 1403 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); }
-    break;
-
-  case 348:
-
-/* Line 1806 of yacc.c  */
-#line 1405 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); }
-    break;
-
-  case 349:
-
-/* Line 1806 of yacc.c  */
-#line 1407 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
-    break;
-
   case 351:
-
-/* Line 1806 of yacc.c  */
-#line 1413 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 352:
-
-/* Line 1806 of yacc.c  */
-#line 1415 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 353:
-
-/* Line 1806 of yacc.c  */
-#line 1417 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
-    break;
-
-  case 355:
-
-/* Line 1806 of yacc.c  */
-#line 1423 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 356:
-
-/* Line 1806 of yacc.c  */
-#line 1425 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 358:
 
 /* Line 1806 of yacc.c  */
@@ -7166,5 +6888,5 @@
     break;
 
-  case 359:
+  case 352:
 
 /* Line 1806 of yacc.c  */
@@ -7173,23 +6895,51 @@
     break;
 
-  case 360:
-
-/* Line 1806 of yacc.c  */
-#line 1435 "parser.yy"
+  case 354:
+
+/* Line 1806 of yacc.c  */
+#line 1439 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 355:
+
+/* Line 1806 of yacc.c  */
+#line 1441 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 356:
+
+/* Line 1806 of yacc.c  */
+#line 1443 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 361:
-
-/* Line 1806 of yacc.c  */
-#line 1440 "parser.yy"
+  case 357:
+
+/* Line 1806 of yacc.c  */
+#line 1448 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(1) - (1)].tok) ); }
     break;
 
+  case 358:
+
+/* Line 1806 of yacc.c  */
+#line 1450 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 359:
+
+/* Line 1806 of yacc.c  */
+#line 1452 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 362:
 
 /* Line 1806 of yacc.c  */
-#line 1442 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+#line 1462 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), 0, 0, (yyvsp[(3) - (4)].decl), true ); }
     break;
 
@@ -7197,19 +6947,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1444 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 366:
-
-/* Line 1806 of yacc.c  */
-#line 1454 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), 0, 0, (yyvsp[(3) - (4)].decl), true ); }
-    break;
-
-  case 367:
-
-/* Line 1806 of yacc.c  */
-#line 1456 "parser.yy"
+#line 1464 "parser.yy"
     {
 			typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) );
@@ -7218,9 +6954,37 @@
     break;
 
+  case 364:
+
+/* Line 1806 of yacc.c  */
+#line 1469 "parser.yy"
+    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
+    break;
+
+  case 365:
+
+/* Line 1806 of yacc.c  */
+#line 1471 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), 0, (yyvsp[(5) - (6)].decl), true ); }
+    break;
+
+  case 366:
+
+/* Line 1806 of yacc.c  */
+#line 1473 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), 0, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl), false ); }
+    break;
+
+  case 367:
+
+/* Line 1806 of yacc.c  */
+#line 1475 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
+    break;
+
   case 368:
 
 /* Line 1806 of yacc.c  */
-#line 1461 "parser.yy"
-    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
+#line 1480 "parser.yy"
+    { (yyval.aggKey) = DeclarationNode::Struct; }
     break;
 
@@ -7228,6 +6992,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1463 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), 0, (yyvsp[(5) - (6)].decl), true ); }
+#line 1482 "parser.yy"
+    { (yyval.aggKey) = DeclarationNode::Union; }
     break;
 
@@ -7235,6 +6999,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1465 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), 0, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl), false ); }
+#line 1487 "parser.yy"
+    { (yyval.decl) = 0; }
     break;
 
@@ -7242,13 +7006,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1467 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
-    break;
-
-  case 372:
-
-/* Line 1806 of yacc.c  */
-#line 1472 "parser.yy"
-    { (yyval.aggKey) = DeclarationNode::Struct; }
+#line 1489 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); }
     break;
 
@@ -7256,13 +7013,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1474 "parser.yy"
-    { (yyval.aggKey) = DeclarationNode::Union; }
-    break;
-
-  case 374:
-
-/* Line 1806 of yacc.c  */
-#line 1479 "parser.yy"
-    { (yyval.decl) = 0; }
+#line 1495 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl)->set_extension( true ); }
     break;
 
@@ -7270,21 +7020,7 @@
 
 /* Line 1806 of yacc.c  */
-#line 1481 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); }
-    break;
-
-  case 377:
-
-/* Line 1806 of yacc.c  */
-#line 1487 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl)->set_extension( true ); }
-    break;
-
-  case 379:
-
-/* Line 1806 of yacc.c  */
-#line 1490 "parser.yy"
+#line 1498 "parser.yy"
     {	// mark all fields in list
-			for ( DeclarationNode *iter = (yyvsp[(2) - (3)].decl); iter != NULL; iter = (DeclarationNode *)iter->get_link() )
+			for ( DeclarationNode *iter = (yyvsp[(2) - (3)].decl); iter != NULL; iter = (DeclarationNode *)iter->get_next() )
 				iter->set_extension( true );
 			(yyval.decl) = (yyvsp[(2) - (3)].decl);
@@ -7292,9 +7028,37 @@
     break;
 
+  case 377:
+
+/* Line 1806 of yacc.c  */
+#line 1508 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); }
+    break;
+
+  case 378:
+
+/* Line 1806 of yacc.c  */
+#line 1510 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); }
+    break;
+
+  case 379:
+
+/* Line 1806 of yacc.c  */
+#line 1512 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); }
+    break;
+
+  case 380:
+
+/* Line 1806 of yacc.c  */
+#line 1517 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
   case 381:
 
 /* Line 1806 of yacc.c  */
-#line 1500 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); }
+#line 1519 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); }
     break;
 
@@ -7302,6 +7066,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1502 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); }
+#line 1524 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ }
     break;
 
@@ -7309,6 +7073,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1504 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); }
+#line 1526 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); }
     break;
 
@@ -7316,6 +7080,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1509 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
+#line 1529 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
     break;
 
@@ -7323,13 +7087,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1511 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); }
-    break;
-
-  case 386:
-
-/* Line 1806 of yacc.c  */
-#line 1516 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ }
+#line 1532 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
     break;
 
@@ -7337,6 +7094,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1518 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); }
+#line 1538 "parser.yy"
+    { (yyval.en) = 0; }
     break;
 
@@ -7344,6 +7101,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1521 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
+#line 1540 "parser.yy"
+    { (yyval.en) = (yyvsp[(1) - (1)].en); }
     break;
 
@@ -7351,6 +7108,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1524 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
+#line 1545 "parser.yy"
+    { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
 
@@ -7358,6 +7115,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1530 "parser.yy"
-    { (yyval.en) = 0; }
+#line 1554 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newEnum( 0, (yyvsp[(3) - (5)].decl) ); }
     break;
 
@@ -7365,26 +7122,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1532 "parser.yy"
-    { (yyval.en) = (yyvsp[(1) - (1)].en); }
-    break;
-
-  case 393:
-
-/* Line 1806 of yacc.c  */
-#line 1537 "parser.yy"
-    { (yyval.en) = (yyvsp[(2) - (2)].en); }
-    break;
-
-  case 395:
-
-/* Line 1806 of yacc.c  */
-#line 1546 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newEnum( 0, (yyvsp[(3) - (5)].decl) ); }
-    break;
-
-  case 396:
-
-/* Line 1806 of yacc.c  */
-#line 1548 "parser.yy"
+#line 1556 "parser.yy"
     {
 			typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) );
@@ -7393,9 +7129,37 @@
     break;
 
+  case 393:
+
+/* Line 1806 of yacc.c  */
+#line 1561 "parser.yy"
+    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
+    break;
+
+  case 394:
+
+/* Line 1806 of yacc.c  */
+#line 1563 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); }
+    break;
+
+  case 395:
+
+/* Line 1806 of yacc.c  */
+#line 1568 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); }
+    break;
+
+  case 396:
+
+/* Line 1806 of yacc.c  */
+#line 1570 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); }
+    break;
+
   case 397:
 
 /* Line 1806 of yacc.c  */
-#line 1553 "parser.yy"
-    { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
+#line 1575 "parser.yy"
+    { (yyval.en) = 0; }
     break;
 
@@ -7403,6 +7167,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1555 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); }
+#line 1577 "parser.yy"
+    { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
 
@@ -7410,27 +7174,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1560 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); }
-    break;
-
-  case 400:
-
-/* Line 1806 of yacc.c  */
-#line 1562 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); }
-    break;
-
-  case 401:
-
-/* Line 1806 of yacc.c  */
-#line 1567 "parser.yy"
-    { (yyval.en) = 0; }
-    break;
-
-  case 402:
-
-/* Line 1806 of yacc.c  */
-#line 1569 "parser.yy"
-    { (yyval.en) = (yyvsp[(2) - (2)].en); }
+#line 1584 "parser.yy"
+    { (yyval.decl) = 0; }
     break;
 
@@ -7438,6 +7181,20 @@
 
 /* Line 1806 of yacc.c  */
-#line 1576 "parser.yy"
-    { (yyval.decl) = 0; }
+#line 1592 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+    break;
+
+  case 404:
+
+/* Line 1806 of yacc.c  */
+#line 1594 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
+    break;
+
+  case 405:
+
+/* Line 1806 of yacc.c  */
+#line 1596 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
     break;
 
@@ -7445,44 +7202,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 1584 "parser.yy"
+#line 1604 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
 
   case 408:
-
-/* Line 1806 of yacc.c  */
-#line 1586 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
-    break;
-
-  case 409:
-
-/* Line 1806 of yacc.c  */
-#line 1588 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
-    break;
-
-  case 411:
-
-/* Line 1806 of yacc.c  */
-#line 1596 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
-    break;
-
-  case 412:
-
-/* Line 1806 of yacc.c  */
-#line 1598 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
-    break;
-
-  case 413:
-
-/* Line 1806 of yacc.c  */
-#line 1600 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); }
-    break;
-
-  case 415:
 
 /* Line 1806 of yacc.c  */
@@ -7491,16 +7213,51 @@
     break;
 
-  case 416:
-
-/* Line 1806 of yacc.c  */
-#line 1611 "parser.yy"
+  case 409:
+
+/* Line 1806 of yacc.c  */
+#line 1608 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); }
+    break;
+
+  case 411:
+
+/* Line 1806 of yacc.c  */
+#line 1614 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+    break;
+
+  case 412:
+
+/* Line 1806 of yacc.c  */
+#line 1619 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
+  case 415:
+
+/* Line 1806 of yacc.c  */
+#line 1626 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
+    break;
+
+  case 418:
+
+/* Line 1806 of yacc.c  */
+#line 1633 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+    break;
+
   case 419:
 
 /* Line 1806 of yacc.c  */
-#line 1618 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
+#line 1635 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+    break;
+
+  case 421:
+
+/* Line 1806 of yacc.c  */
+#line 1644 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
     break;
 
@@ -7508,6 +7265,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1625 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
+#line 1647 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
     break;
 
@@ -7515,40 +7272,19 @@
 
 /* Line 1806 of yacc.c  */
-#line 1627 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
-    break;
-
-  case 425:
-
-/* Line 1806 of yacc.c  */
-#line 1636 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
-    break;
-
-  case 426:
-
-/* Line 1806 of yacc.c  */
-#line 1639 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
-    break;
-
-  case 427:
-
-/* Line 1806 of yacc.c  */
-#line 1641 "parser.yy"
+#line 1649 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addName( (yyvsp[(3) - (4)].tok) )->addQualifiers( (yyvsp[(1) - (4)].decl) ); }
     break;
 
-  case 432:
-
-/* Line 1806 of yacc.c  */
-#line 1651 "parser.yy"
+  case 428:
+
+/* Line 1806 of yacc.c  */
+#line 1659 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 434:
-
-/* Line 1806 of yacc.c  */
-#line 1657 "parser.yy"
+  case 430:
+
+/* Line 1806 of yacc.c  */
+#line 1665 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7557,8 +7293,8 @@
     break;
 
-  case 435:
-
-/* Line 1806 of yacc.c  */
-#line 1662 "parser.yy"
+  case 431:
+
+/* Line 1806 of yacc.c  */
+#line 1670 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7567,33 +7303,26 @@
     break;
 
-  case 437:
-
-/* Line 1806 of yacc.c  */
-#line 1671 "parser.yy"
+  case 433:
+
+/* Line 1806 of yacc.c  */
+#line 1679 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 438:
-
-/* Line 1806 of yacc.c  */
-#line 1680 "parser.yy"
+  case 434:
+
+/* Line 1806 of yacc.c  */
+#line 1688 "parser.yy"
     { (yyval.decl) = DeclarationNode::newName( (yyvsp[(1) - (1)].tok) ); }
     break;
 
-  case 439:
-
-/* Line 1806 of yacc.c  */
-#line 1682 "parser.yy"
+  case 435:
+
+/* Line 1806 of yacc.c  */
+#line 1690 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( DeclarationNode::newName( (yyvsp[(3) - (3)].tok) ) ); }
     break;
 
-  case 451:
-
-/* Line 1806 of yacc.c  */
-#line 1707 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 455:
+  case 447:
 
 /* Line 1806 of yacc.c  */
@@ -7602,30 +7331,58 @@
     break;
 
+  case 451:
+
+/* Line 1806 of yacc.c  */
+#line 1723 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 452:
+
+/* Line 1806 of yacc.c  */
+#line 1728 "parser.yy"
+    { (yyval.in) = 0; }
+    break;
+
+  case 453:
+
+/* Line 1806 of yacc.c  */
+#line 1730 "parser.yy"
+    { (yyval.in) = (yyvsp[(2) - (2)].in); }
+    break;
+
+  case 454:
+
+/* Line 1806 of yacc.c  */
+#line 1732 "parser.yy"
+    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); }
+    break;
+
+  case 455:
+
+/* Line 1806 of yacc.c  */
+#line 1736 "parser.yy"
+    { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); }
+    break;
+
   case 456:
 
 /* Line 1806 of yacc.c  */
-#line 1720 "parser.yy"
+#line 1737 "parser.yy"
+    { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); }
+    break;
+
+  case 457:
+
+/* Line 1806 of yacc.c  */
+#line 1742 "parser.yy"
     { (yyval.in) = 0; }
     break;
 
-  case 457:
-
-/* Line 1806 of yacc.c  */
-#line 1722 "parser.yy"
-    { (yyval.in) = (yyvsp[(2) - (2)].in); }
-    break;
-
-  case 458:
-
-/* Line 1806 of yacc.c  */
-#line 1724 "parser.yy"
-    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); }
-    break;
-
   case 459:
 
 /* Line 1806 of yacc.c  */
-#line 1728 "parser.yy"
-    { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); }
+#line 1744 "parser.yy"
+    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); }
     break;
 
@@ -7633,6 +7390,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1729 "parser.yy"
-    { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); }
+#line 1745 "parser.yy"
+    { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_last( (yyvsp[(3) - (3)].in) ) ); }
     break;
 
@@ -7640,6 +7397,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1734 "parser.yy"
-    { (yyval.in) = 0; }
+#line 1747 "parser.yy"
+    { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (4)].in)->set_last( (yyvsp[(4) - (4)].in)->set_designators( (yyvsp[(3) - (4)].en) ) ) ); }
     break;
 
@@ -7647,13 +7404,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1736 "parser.yy"
-    { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); }
-    break;
-
-  case 464:
-
-/* Line 1806 of yacc.c  */
-#line 1737 "parser.yy"
-    { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_link( (yyvsp[(3) - (3)].in) ) ); }
+#line 1763 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(1) - (2)].tok) ) ); }
     break;
 
@@ -7661,6 +7411,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 1739 "parser.yy"
-    { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (4)].in)->set_link( (yyvsp[(4) - (4)].in)->set_designators( (yyvsp[(3) - (4)].en) ) ) ); }
+#line 1769 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_last( (yyvsp[(2) - (2)].en) ) ); }
+    break;
+
+  case 466:
+
+/* Line 1806 of yacc.c  */
+#line 1775 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_varref( (yyvsp[(2) - (2)].tok) ) ); }
     break;
 
@@ -7668,6 +7425,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 1755 "parser.yy"
-    { (yyval.en) = new VarRefNode( (yyvsp[(1) - (2)].tok) ); }
+#line 1778 "parser.yy"
+    { (yyval.en) = (yyvsp[(3) - (5)].en); }
+    break;
+
+  case 468:
+
+/* Line 1806 of yacc.c  */
+#line 1780 "parser.yy"
+    { (yyval.en) = (yyvsp[(3) - (5)].en); }
     break;
 
@@ -7675,6 +7439,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1761 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_link( (yyvsp[(2) - (2)].en) )); }
+#line 1782 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ) ); }
     break;
 
@@ -7682,13 +7446,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1769 "parser.yy"
-    { (yyval.en) = new DesignatorNode( new VarRefNode( (yyvsp[(1) - (1)].tok) ) ); }
-    break;
-
-  case 471:
-
-/* Line 1806 of yacc.c  */
-#line 1771 "parser.yy"
-    { (yyval.en) = new DesignatorNode( new VarRefNode( (yyvsp[(2) - (2)].tok) ) ); }
+#line 1784 "parser.yy"
+    { (yyval.en) = (yyvsp[(4) - (6)].en); }
     break;
 
@@ -7696,6 +7453,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1774 "parser.yy"
-    { (yyval.en) = new DesignatorNode( (yyvsp[(3) - (5)].en), true ); }
+#line 1808 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
@@ -7703,6 +7460,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1776 "parser.yy"
-    { (yyval.en) = new DesignatorNode( (yyvsp[(3) - (5)].en), true ); }
+#line 1810 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
@@ -7710,13 +7467,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 1778 "parser.yy"
-    { (yyval.en) = new DesignatorNode( new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ), true ); }
-    break;
-
-  case 475:
-
-/* Line 1806 of yacc.c  */
-#line 1780 "parser.yy"
-    { (yyval.en) = new DesignatorNode( (yyvsp[(4) - (6)].en) ); }
+#line 1812 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
+    break;
+
+  case 476:
+
+/* Line 1806 of yacc.c  */
+#line 1818 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
@@ -7724,6 +7481,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1804 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+#line 1820 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
@@ -7731,13 +7488,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 1806 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 479:
-
-/* Line 1806 of yacc.c  */
-#line 1808 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
+#line 1825 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFromTypeGen( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
+    break;
+
+  case 480:
+
+/* Line 1806 of yacc.c  */
+#line 1831 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); }
     break;
 
@@ -7745,6 +7502,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1814 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
+#line 1836 "parser.yy"
+    { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); }
     break;
 
@@ -7752,13 +7509,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 1816 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 483:
-
-/* Line 1806 of yacc.c  */
-#line 1821 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFromTypeGen( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
+#line 1838 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newTypeParam( (yyvsp[(1) - (4)].tclass), (yyvsp[(2) - (4)].tok) )->addAssertions( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 484:
+
+/* Line 1806 of yacc.c  */
+#line 1844 "parser.yy"
+    { (yyval.tclass) = DeclarationNode::Type; }
     break;
 
@@ -7766,6 +7523,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1827 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); }
+#line 1846 "parser.yy"
+    { (yyval.tclass) = DeclarationNode::Ftype; }
     break;
 
@@ -7773,6 +7530,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1832 "parser.yy"
-    { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); }
+#line 1848 "parser.yy"
+    { (yyval.tclass) = DeclarationNode::Dtype; }
     break;
 
@@ -7780,6 +7537,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 1834 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newTypeParam( (yyvsp[(1) - (4)].tclass), (yyvsp[(2) - (4)].tok) )->addAssertions( (yyvsp[(4) - (4)].decl) ); }
+#line 1853 "parser.yy"
+    { (yyval.decl) = 0; }
+    break;
+
+  case 488:
+
+/* Line 1806 of yacc.c  */
+#line 1855 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); }
     break;
 
@@ -7787,40 +7551,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1840 "parser.yy"
-    { (yyval.tclass) = DeclarationNode::Type; }
-    break;
-
-  case 490:
-
-/* Line 1806 of yacc.c  */
-#line 1842 "parser.yy"
-    { (yyval.tclass) = DeclarationNode::Ftype; }
-    break;
-
-  case 491:
-
-/* Line 1806 of yacc.c  */
-#line 1844 "parser.yy"
-    { (yyval.tclass) = DeclarationNode::Dtype; }
-    break;
-
-  case 492:
-
-/* Line 1806 of yacc.c  */
-#line 1849 "parser.yy"
-    { (yyval.decl) = 0; }
-    break;
-
-  case 493:
-
-/* Line 1806 of yacc.c  */
-#line 1851 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); }
-    break;
-
-  case 494:
-
-/* Line 1806 of yacc.c  */
-#line 1856 "parser.yy"
+#line 1860 "parser.yy"
     {
 			typedefTable.openTrait( *(yyvsp[(2) - (5)].tok) );
@@ -7829,9 +7558,37 @@
     break;
 
+  case 490:
+
+/* Line 1806 of yacc.c  */
+#line 1865 "parser.yy"
+    { (yyval.decl) = (yyvsp[(4) - (5)].decl); }
+    break;
+
+  case 491:
+
+/* Line 1806 of yacc.c  */
+#line 1867 "parser.yy"
+    { (yyval.decl) = 0; }
+    break;
+
+  case 492:
+
+/* Line 1806 of yacc.c  */
+#line 1872 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_typevalue( (yyvsp[(1) - (1)].decl) ) ); }
+    break;
+
+  case 494:
+
+/* Line 1806 of yacc.c  */
+#line 1875 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( new ExpressionNode( build_typevalue( (yyvsp[(3) - (3)].decl) ) ) ) ); }
+    break;
+
   case 495:
 
 /* Line 1806 of yacc.c  */
-#line 1861 "parser.yy"
-    { (yyval.decl) = (yyvsp[(4) - (5)].decl); }
+#line 1877 "parser.yy"
+    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_last( (yyvsp[(3) - (3)].en) )); }
     break;
 
@@ -7839,6 +7596,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1863 "parser.yy"
-    { (yyval.decl) = 0; }
+#line 1882 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
     break;
 
@@ -7846,6 +7603,13 @@
 
 /* Line 1806 of yacc.c  */
-#line 1868 "parser.yy"
-    { (yyval.en) = new TypeValueNode( (yyvsp[(1) - (1)].decl) ); }
+#line 1884 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); }
+    break;
+
+  case 498:
+
+/* Line 1806 of yacc.c  */
+#line 1886 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); }
     break;
 
@@ -7853,6 +7617,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1871 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( new TypeValueNode( (yyvsp[(3) - (3)].decl) ))); }
+#line 1891 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); }
     break;
 
@@ -7860,6 +7624,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1873 "parser.yy"
-    { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) )); }
+#line 1893 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); }
     break;
 
@@ -7867,40 +7631,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1878 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
-    break;
-
-  case 502:
-
-/* Line 1806 of yacc.c  */
-#line 1880 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); }
-    break;
-
-  case 503:
-
-/* Line 1806 of yacc.c  */
-#line 1882 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); }
-    break;
-
-  case 504:
-
-/* Line 1806 of yacc.c  */
-#line 1887 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 505:
-
-/* Line 1806 of yacc.c  */
-#line 1889 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 506:
-
-/* Line 1806 of yacc.c  */
-#line 1894 "parser.yy"
+#line 1898 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(1) - (1)].tok), TypedefTable::TD );
@@ -7909,8 +7638,8 @@
     break;
 
-  case 507:
-
-/* Line 1806 of yacc.c  */
-#line 1899 "parser.yy"
+  case 502:
+
+/* Line 1806 of yacc.c  */
+#line 1903 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(1) - (6)].tok), TypedefTable::TG );
@@ -7919,8 +7648,8 @@
     break;
 
-  case 508:
-
-/* Line 1806 of yacc.c  */
-#line 1907 "parser.yy"
+  case 503:
+
+/* Line 1806 of yacc.c  */
+#line 1911 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(2) - (9)].tok), TypedefTable::ID );
@@ -7929,8 +7658,8 @@
     break;
 
-  case 509:
-
-/* Line 1806 of yacc.c  */
-#line 1912 "parser.yy"
+  case 504:
+
+/* Line 1806 of yacc.c  */
+#line 1916 "parser.yy"
     {
 			typedefTable.enterTrait( *(yyvsp[(2) - (8)].tok) );
@@ -7939,8 +7668,8 @@
     break;
 
-  case 510:
-
-/* Line 1806 of yacc.c  */
-#line 1917 "parser.yy"
+  case 505:
+
+/* Line 1806 of yacc.c  */
+#line 1921 "parser.yy"
     {
 			typedefTable.leaveTrait();
@@ -7950,15 +7679,15 @@
     break;
 
-  case 512:
-
-/* Line 1806 of yacc.c  */
-#line 1927 "parser.yy"
+  case 507:
+
+/* Line 1806 of yacc.c  */
+#line 1931 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
 
-  case 515:
-
-/* Line 1806 of yacc.c  */
-#line 1937 "parser.yy"
+  case 510:
+
+/* Line 1806 of yacc.c  */
+#line 1941 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7967,8 +7696,8 @@
     break;
 
-  case 516:
-
-/* Line 1806 of yacc.c  */
-#line 1942 "parser.yy"
+  case 511:
+
+/* Line 1806 of yacc.c  */
+#line 1946 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7977,8 +7706,8 @@
     break;
 
-  case 517:
-
-/* Line 1806 of yacc.c  */
-#line 1947 "parser.yy"
+  case 512:
+
+/* Line 1806 of yacc.c  */
+#line 1951 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( *(yyvsp[(5) - (5)].tok), TypedefTable::ID );
@@ -7987,8 +7716,8 @@
     break;
 
-  case 518:
-
-/* Line 1806 of yacc.c  */
-#line 1955 "parser.yy"
+  case 513:
+
+/* Line 1806 of yacc.c  */
+#line 1959 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7997,8 +7726,8 @@
     break;
 
-  case 519:
-
-/* Line 1806 of yacc.c  */
-#line 1960 "parser.yy"
+  case 514:
+
+/* Line 1806 of yacc.c  */
+#line 1964 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -8007,15 +7736,15 @@
     break;
 
-  case 520:
-
-/* Line 1806 of yacc.c  */
-#line 1970 "parser.yy"
+  case 515:
+
+/* Line 1806 of yacc.c  */
+#line 1974 "parser.yy"
     {}
     break;
 
-  case 521:
-
-/* Line 1806 of yacc.c  */
-#line 1972 "parser.yy"
+  case 516:
+
+/* Line 1806 of yacc.c  */
+#line 1976 "parser.yy"
     {
 			if ( theTree ) {
@@ -8027,9 +7756,23 @@
     break;
 
+  case 518:
+
+/* Line 1806 of yacc.c  */
+#line 1988 "parser.yy"
+    { (yyval.decl) = ( (yyvsp[(1) - (3)].decl) != NULL ) ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); }
+    break;
+
+  case 519:
+
+/* Line 1806 of yacc.c  */
+#line 1993 "parser.yy"
+    { (yyval.decl) = 0; }
+    break;
+
   case 523:
 
 /* Line 1806 of yacc.c  */
-#line 1984 "parser.yy"
-    { (yyval.decl) = ( (yyvsp[(1) - (3)].decl) != NULL ) ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); }
+#line 2001 "parser.yy"
+    {}
     break;
 
@@ -8037,19 +7780,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1989 "parser.yy"
-    { (yyval.decl) = 0; }
-    break;
-
-  case 528:
-
-/* Line 1806 of yacc.c  */
-#line 1997 "parser.yy"
-    {}
-    break;
-
-  case 529:
-
-/* Line 1806 of yacc.c  */
-#line 1999 "parser.yy"
+#line 2003 "parser.yy"
     {
 			linkageStack.push( linkage );
@@ -8058,8 +7787,8 @@
     break;
 
-  case 530:
-
-/* Line 1806 of yacc.c  */
-#line 2004 "parser.yy"
+  case 525:
+
+/* Line 1806 of yacc.c  */
+#line 2008 "parser.yy"
     {
 			linkage = linkageStack.top();
@@ -8069,10 +7798,10 @@
     break;
 
-  case 531:
-
-/* Line 1806 of yacc.c  */
-#line 2010 "parser.yy"
+  case 526:
+
+/* Line 1806 of yacc.c  */
+#line 2014 "parser.yy"
     {	// mark all fields in list
-			for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != NULL; iter = (DeclarationNode *)iter->get_link() )
+			for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != NULL; iter = (DeclarationNode *)iter->get_next() )
 				iter->set_extension( true );
 			(yyval.decl) = (yyvsp[(2) - (2)].decl);
@@ -8080,8 +7809,8 @@
     break;
 
-  case 533:
-
-/* Line 1806 of yacc.c  */
-#line 2025 "parser.yy"
+  case 528:
+
+/* Line 1806 of yacc.c  */
+#line 2029 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8091,8 +7820,8 @@
     break;
 
-  case 534:
-
-/* Line 1806 of yacc.c  */
-#line 2031 "parser.yy"
+  case 529:
+
+/* Line 1806 of yacc.c  */
+#line 2035 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8102,8 +7831,8 @@
     break;
 
-  case 535:
-
-/* Line 1806 of yacc.c  */
-#line 2040 "parser.yy"
+  case 530:
+
+/* Line 1806 of yacc.c  */
+#line 2044 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8113,8 +7842,8 @@
     break;
 
-  case 536:
-
-/* Line 1806 of yacc.c  */
-#line 2046 "parser.yy"
+  case 531:
+
+/* Line 1806 of yacc.c  */
+#line 2050 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8124,8 +7853,8 @@
     break;
 
-  case 537:
-
-/* Line 1806 of yacc.c  */
-#line 2052 "parser.yy"
+  case 532:
+
+/* Line 1806 of yacc.c  */
+#line 2056 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8135,8 +7864,8 @@
     break;
 
-  case 538:
-
-/* Line 1806 of yacc.c  */
-#line 2058 "parser.yy"
+  case 533:
+
+/* Line 1806 of yacc.c  */
+#line 2062 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8146,8 +7875,8 @@
     break;
 
-  case 539:
-
-/* Line 1806 of yacc.c  */
-#line 2064 "parser.yy"
+  case 534:
+
+/* Line 1806 of yacc.c  */
+#line 2068 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8157,8 +7886,8 @@
     break;
 
-  case 540:
-
-/* Line 1806 of yacc.c  */
-#line 2072 "parser.yy"
+  case 535:
+
+/* Line 1806 of yacc.c  */
+#line 2076 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8168,8 +7897,8 @@
     break;
 
-  case 541:
-
-/* Line 1806 of yacc.c  */
-#line 2078 "parser.yy"
+  case 536:
+
+/* Line 1806 of yacc.c  */
+#line 2082 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8179,8 +7908,8 @@
     break;
 
-  case 542:
-
-/* Line 1806 of yacc.c  */
-#line 2086 "parser.yy"
+  case 537:
+
+/* Line 1806 of yacc.c  */
+#line 2090 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8190,8 +7919,8 @@
     break;
 
-  case 543:
-
-/* Line 1806 of yacc.c  */
-#line 2092 "parser.yy"
+  case 538:
+
+/* Line 1806 of yacc.c  */
+#line 2096 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8201,44 +7930,72 @@
     break;
 
-  case 547:
-
-/* Line 1806 of yacc.c  */
-#line 2107 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
-    break;
-
-  case 550:
-
-/* Line 1806 of yacc.c  */
-#line 2117 "parser.yy"
+  case 542:
+
+/* Line 1806 of yacc.c  */
+#line 2111 "parser.yy"
+    { (yyval.en) = new ExpressionNode( build_range( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
+    break;
+
+  case 545:
+
+/* Line 1806 of yacc.c  */
+#line 2121 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
-  case 553:
-
-/* Line 1806 of yacc.c  */
-#line 2124 "parser.yy"
+  case 548:
+
+/* Line 1806 of yacc.c  */
+#line 2128 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 554:
-
-/* Line 1806 of yacc.c  */
-#line 2130 "parser.yy"
+  case 549:
+
+/* Line 1806 of yacc.c  */
+#line 2134 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
-  case 560:
-
-/* Line 1806 of yacc.c  */
-#line 2145 "parser.yy"
+  case 555:
+
+/* Line 1806 of yacc.c  */
+#line 2149 "parser.yy"
     {}
     break;
 
+  case 556:
+
+/* Line 1806 of yacc.c  */
+#line 2150 "parser.yy"
+    {}
+    break;
+
+  case 557:
+
+/* Line 1806 of yacc.c  */
+#line 2151 "parser.yy"
+    {}
+    break;
+
+  case 558:
+
+/* Line 1806 of yacc.c  */
+#line 2152 "parser.yy"
+    {}
+    break;
+
+  case 559:
+
+/* Line 1806 of yacc.c  */
+#line 2187 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 561:
 
 /* Line 1806 of yacc.c  */
-#line 2146 "parser.yy"
-    {}
+#line 2190 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
@@ -8246,6 +8003,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2147 "parser.yy"
-    {}
+#line 2192 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
@@ -8253,33 +8010,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2148 "parser.yy"
-    {}
-    break;
-
-  case 564:
-
-/* Line 1806 of yacc.c  */
-#line 2183 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 566:
-
-/* Line 1806 of yacc.c  */
-#line 2186 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 567:
-
-/* Line 1806 of yacc.c  */
-#line 2188 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 568:
-
-/* Line 1806 of yacc.c  */
-#line 2193 "parser.yy"
+#line 2197 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8288,428 +8017,428 @@
     break;
 
+  case 564:
+
+/* Line 1806 of yacc.c  */
+#line 2202 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 565:
+
+/* Line 1806 of yacc.c  */
+#line 2207 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 566:
+
+/* Line 1806 of yacc.c  */
+#line 2209 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 567:
+
+/* Line 1806 of yacc.c  */
+#line 2211 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 568:
+
+/* Line 1806 of yacc.c  */
+#line 2216 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 569:
 
 /* Line 1806 of yacc.c  */
-#line 2198 "parser.yy"
+#line 2218 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 570:
+
+/* Line 1806 of yacc.c  */
+#line 2220 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 571:
+
+/* Line 1806 of yacc.c  */
+#line 2222 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 570:
-
-/* Line 1806 of yacc.c  */
-#line 2203 "parser.yy"
+  case 572:
+
+/* Line 1806 of yacc.c  */
+#line 2227 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
+    break;
+
+  case 573:
+
+/* Line 1806 of yacc.c  */
+#line 2229 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 574:
+
+/* Line 1806 of yacc.c  */
+#line 2238 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 576:
+
+/* Line 1806 of yacc.c  */
+#line 2241 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 577:
+
+/* Line 1806 of yacc.c  */
+#line 2246 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
+    break;
+
+  case 578:
+
+/* Line 1806 of yacc.c  */
+#line 2248 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
+    break;
+
+  case 579:
+
+/* Line 1806 of yacc.c  */
+#line 2250 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 580:
+
+/* Line 1806 of yacc.c  */
+#line 2255 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 571:
-
-/* Line 1806 of yacc.c  */
-#line 2205 "parser.yy"
+  case 581:
+
+/* Line 1806 of yacc.c  */
+#line 2257 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 572:
-
-/* Line 1806 of yacc.c  */
-#line 2207 "parser.yy"
+  case 582:
+
+/* Line 1806 of yacc.c  */
+#line 2259 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 573:
-
-/* Line 1806 of yacc.c  */
-#line 2212 "parser.yy"
+  case 583:
+
+/* Line 1806 of yacc.c  */
+#line 2264 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 584:
+
+/* Line 1806 of yacc.c  */
+#line 2266 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 585:
+
+/* Line 1806 of yacc.c  */
+#line 2268 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 589:
+
+/* Line 1806 of yacc.c  */
+#line 2283 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); }
+    break;
+
+  case 590:
+
+/* Line 1806 of yacc.c  */
+#line 2285 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); }
+    break;
+
+  case 591:
+
+/* Line 1806 of yacc.c  */
+#line 2287 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 592:
+
+/* Line 1806 of yacc.c  */
+#line 2292 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 593:
+
+/* Line 1806 of yacc.c  */
+#line 2294 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 594:
+
+/* Line 1806 of yacc.c  */
+#line 2296 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 595:
+
+/* Line 1806 of yacc.c  */
+#line 2301 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 596:
+
+/* Line 1806 of yacc.c  */
+#line 2303 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 597:
+
+/* Line 1806 of yacc.c  */
+#line 2305 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 598:
+
+/* Line 1806 of yacc.c  */
+#line 2320 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 600:
+
+/* Line 1806 of yacc.c  */
+#line 2323 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 601:
+
+/* Line 1806 of yacc.c  */
+#line 2325 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 603:
+
+/* Line 1806 of yacc.c  */
+#line 2331 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 604:
+
+/* Line 1806 of yacc.c  */
+#line 2336 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 605:
+
+/* Line 1806 of yacc.c  */
+#line 2338 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 606:
+
+/* Line 1806 of yacc.c  */
+#line 2340 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 607:
+
+/* Line 1806 of yacc.c  */
+#line 2345 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 574:
-
-/* Line 1806 of yacc.c  */
-#line 2214 "parser.yy"
+  case 608:
+
+/* Line 1806 of yacc.c  */
+#line 2347 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 575:
-
-/* Line 1806 of yacc.c  */
-#line 2216 "parser.yy"
+  case 609:
+
+/* Line 1806 of yacc.c  */
+#line 2349 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 576:
-
-/* Line 1806 of yacc.c  */
-#line 2218 "parser.yy"
+  case 610:
+
+/* Line 1806 of yacc.c  */
+#line 2351 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 577:
-
-/* Line 1806 of yacc.c  */
-#line 2223 "parser.yy"
+  case 611:
+
+/* Line 1806 of yacc.c  */
+#line 2356 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
+    break;
+
+  case 612:
+
+/* Line 1806 of yacc.c  */
+#line 2358 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 578:
-
-/* Line 1806 of yacc.c  */
-#line 2225 "parser.yy"
+  case 613:
+
+/* Line 1806 of yacc.c  */
+#line 2360 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 579:
-
-/* Line 1806 of yacc.c  */
-#line 2234 "parser.yy"
+  case 614:
+
+/* Line 1806 of yacc.c  */
+#line 2370 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 581:
-
-/* Line 1806 of yacc.c  */
-#line 2237 "parser.yy"
+  case 616:
+
+/* Line 1806 of yacc.c  */
+#line 2373 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 582:
-
-/* Line 1806 of yacc.c  */
-#line 2242 "parser.yy"
+  case 617:
+
+/* Line 1806 of yacc.c  */
+#line 2375 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 618:
+
+/* Line 1806 of yacc.c  */
+#line 2380 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 619:
+
+/* Line 1806 of yacc.c  */
+#line 2382 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 620:
+
+/* Line 1806 of yacc.c  */
+#line 2384 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 621:
+
+/* Line 1806 of yacc.c  */
+#line 2389 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 622:
+
+/* Line 1806 of yacc.c  */
+#line 2391 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 623:
+
+/* Line 1806 of yacc.c  */
+#line 2393 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 624:
+
+/* Line 1806 of yacc.c  */
+#line 2395 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 625:
+
+/* Line 1806 of yacc.c  */
+#line 2400 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
     break;
 
-  case 583:
-
-/* Line 1806 of yacc.c  */
-#line 2244 "parser.yy"
+  case 626:
+
+/* Line 1806 of yacc.c  */
+#line 2402 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 584:
-
-/* Line 1806 of yacc.c  */
-#line 2246 "parser.yy"
+  case 627:
+
+/* Line 1806 of yacc.c  */
+#line 2404 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 585:
-
-/* Line 1806 of yacc.c  */
-#line 2251 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 586:
-
-/* Line 1806 of yacc.c  */
-#line 2253 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 587:
-
-/* Line 1806 of yacc.c  */
-#line 2255 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 588:
-
-/* Line 1806 of yacc.c  */
-#line 2260 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 589:
-
-/* Line 1806 of yacc.c  */
-#line 2262 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 590:
-
-/* Line 1806 of yacc.c  */
-#line 2264 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 594:
-
-/* Line 1806 of yacc.c  */
-#line 2279 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); }
-    break;
-
-  case 595:
-
-/* Line 1806 of yacc.c  */
-#line 2281 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); }
-    break;
-
-  case 596:
-
-/* Line 1806 of yacc.c  */
-#line 2283 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 597:
-
-/* Line 1806 of yacc.c  */
-#line 2288 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 598:
-
-/* Line 1806 of yacc.c  */
-#line 2290 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 599:
-
-/* Line 1806 of yacc.c  */
-#line 2292 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 600:
-
-/* Line 1806 of yacc.c  */
-#line 2297 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 601:
-
-/* Line 1806 of yacc.c  */
-#line 2299 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 602:
-
-/* Line 1806 of yacc.c  */
-#line 2301 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 603:
-
-/* Line 1806 of yacc.c  */
-#line 2316 "parser.yy"
+  case 628:
+
+/* Line 1806 of yacc.c  */
+#line 2435 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 605:
-
-/* Line 1806 of yacc.c  */
-#line 2319 "parser.yy"
+  case 630:
+
+/* Line 1806 of yacc.c  */
+#line 2438 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 606:
-
-/* Line 1806 of yacc.c  */
-#line 2321 "parser.yy"
+  case 631:
+
+/* Line 1806 of yacc.c  */
+#line 2440 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 608:
-
-/* Line 1806 of yacc.c  */
-#line 2327 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 609:
-
-/* Line 1806 of yacc.c  */
-#line 2332 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 610:
-
-/* Line 1806 of yacc.c  */
-#line 2334 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 611:
-
-/* Line 1806 of yacc.c  */
-#line 2336 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 612:
-
-/* Line 1806 of yacc.c  */
-#line 2341 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 613:
-
-/* Line 1806 of yacc.c  */
-#line 2343 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 614:
-
-/* Line 1806 of yacc.c  */
-#line 2345 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 615:
-
-/* Line 1806 of yacc.c  */
-#line 2347 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 616:
-
-/* Line 1806 of yacc.c  */
-#line 2352 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
-    break;
-
-  case 617:
-
-/* Line 1806 of yacc.c  */
-#line 2354 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
-    break;
-
-  case 618:
-
-/* Line 1806 of yacc.c  */
-#line 2356 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 619:
-
-/* Line 1806 of yacc.c  */
-#line 2366 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 621:
-
-/* Line 1806 of yacc.c  */
-#line 2369 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 622:
-
-/* Line 1806 of yacc.c  */
-#line 2371 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 623:
-
-/* Line 1806 of yacc.c  */
-#line 2376 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 624:
-
-/* Line 1806 of yacc.c  */
-#line 2378 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 625:
-
-/* Line 1806 of yacc.c  */
-#line 2380 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 626:
-
-/* Line 1806 of yacc.c  */
-#line 2385 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 627:
-
-/* Line 1806 of yacc.c  */
-#line 2387 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 628:
-
-/* Line 1806 of yacc.c  */
-#line 2389 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 629:
-
-/* Line 1806 of yacc.c  */
-#line 2391 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 630:
-
-/* Line 1806 of yacc.c  */
-#line 2396 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
-    break;
-
-  case 631:
-
-/* Line 1806 of yacc.c  */
-#line 2398 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
-    break;
-
   case 632:
 
 /* Line 1806 of yacc.c  */
-#line 2400 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 633:
-
-/* Line 1806 of yacc.c  */
-#line 2431 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 635:
-
-/* Line 1806 of yacc.c  */
-#line 2434 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 636:
-
-/* Line 1806 of yacc.c  */
-#line 2436 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 637:
-
-/* Line 1806 of yacc.c  */
-#line 2441 "parser.yy"
+#line 2445 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8718,8 +8447,8 @@
     break;
 
-  case 638:
-
-/* Line 1806 of yacc.c  */
-#line 2446 "parser.yy"
+  case 633:
+
+/* Line 1806 of yacc.c  */
+#line 2450 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8728,432 +8457,418 @@
     break;
 
+  case 634:
+
+/* Line 1806 of yacc.c  */
+#line 2458 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 635:
+
+/* Line 1806 of yacc.c  */
+#line 2460 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 636:
+
+/* Line 1806 of yacc.c  */
+#line 2462 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 637:
+
+/* Line 1806 of yacc.c  */
+#line 2467 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 638:
+
+/* Line 1806 of yacc.c  */
+#line 2469 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
   case 639:
 
 /* Line 1806 of yacc.c  */
-#line 2454 "parser.yy"
+#line 2474 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
+    break;
+
+  case 640:
+
+/* Line 1806 of yacc.c  */
+#line 2476 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
+    break;
+
+  case 642:
+
+/* Line 1806 of yacc.c  */
+#line 2491 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 643:
+
+/* Line 1806 of yacc.c  */
+#line 2493 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 644:
+
+/* Line 1806 of yacc.c  */
+#line 2498 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
+    break;
+
+  case 645:
+
+/* Line 1806 of yacc.c  */
+#line 2500 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 646:
+
+/* Line 1806 of yacc.c  */
+#line 2502 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
 
-  case 640:
-
-/* Line 1806 of yacc.c  */
-#line 2456 "parser.yy"
+  case 647:
+
+/* Line 1806 of yacc.c  */
+#line 2504 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
 
-  case 641:
-
-/* Line 1806 of yacc.c  */
-#line 2458 "parser.yy"
+  case 648:
+
+/* Line 1806 of yacc.c  */
+#line 2506 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 642:
-
-/* Line 1806 of yacc.c  */
-#line 2463 "parser.yy"
+  case 650:
+
+/* Line 1806 of yacc.c  */
+#line 2512 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 651:
+
+/* Line 1806 of yacc.c  */
+#line 2514 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 652:
+
+/* Line 1806 of yacc.c  */
+#line 2516 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 653:
+
+/* Line 1806 of yacc.c  */
+#line 2521 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
+    break;
+
+  case 654:
+
+/* Line 1806 of yacc.c  */
+#line 2523 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
+    break;
+
+  case 655:
+
+/* Line 1806 of yacc.c  */
+#line 2525 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 656:
+
+/* Line 1806 of yacc.c  */
+#line 2531 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
+    break;
+
+  case 657:
+
+/* Line 1806 of yacc.c  */
+#line 2533 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); }
+    break;
+
+  case 659:
+
+/* Line 1806 of yacc.c  */
+#line 2539 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); }
+    break;
+
+  case 660:
+
+/* Line 1806 of yacc.c  */
+#line 2541 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newVarArray( 0 ); }
+    break;
+
+  case 661:
+
+/* Line 1806 of yacc.c  */
+#line 2543 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); }
+    break;
+
+  case 662:
+
+/* Line 1806 of yacc.c  */
+#line 2545 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); }
+    break;
+
+  case 664:
+
+/* Line 1806 of yacc.c  */
+#line 2560 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 665:
+
+/* Line 1806 of yacc.c  */
+#line 2562 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 666:
+
+/* Line 1806 of yacc.c  */
+#line 2567 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
+    break;
+
+  case 667:
+
+/* Line 1806 of yacc.c  */
+#line 2569 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 668:
+
+/* Line 1806 of yacc.c  */
+#line 2571 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 669:
+
+/* Line 1806 of yacc.c  */
+#line 2573 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 670:
+
+/* Line 1806 of yacc.c  */
+#line 2575 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 672:
+
+/* Line 1806 of yacc.c  */
+#line 2581 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 673:
+
+/* Line 1806 of yacc.c  */
+#line 2583 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 674:
+
+/* Line 1806 of yacc.c  */
+#line 2585 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 675:
+
+/* Line 1806 of yacc.c  */
+#line 2590 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
+    break;
+
+  case 676:
+
+/* Line 1806 of yacc.c  */
+#line 2592 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
+    break;
+
+  case 677:
+
+/* Line 1806 of yacc.c  */
+#line 2594 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 679:
+
+/* Line 1806 of yacc.c  */
+#line 2601 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
 
-  case 643:
-
-/* Line 1806 of yacc.c  */
-#line 2465 "parser.yy"
+  case 681:
+
+/* Line 1806 of yacc.c  */
+#line 2612 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
+    break;
+
+  case 682:
+
+/* Line 1806 of yacc.c  */
+#line 2615 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
+    break;
+
+  case 683:
+
+/* Line 1806 of yacc.c  */
+#line 2617 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); }
+    break;
+
+  case 684:
+
+/* Line 1806 of yacc.c  */
+#line 2620 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
+    break;
+
+  case 685:
+
+/* Line 1806 of yacc.c  */
+#line 2622 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); }
+    break;
+
+  case 686:
+
+/* Line 1806 of yacc.c  */
+#line 2624 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); }
+    break;
+
+  case 688:
+
+/* Line 1806 of yacc.c  */
+#line 2638 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 689:
+
+/* Line 1806 of yacc.c  */
+#line 2640 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 690:
+
+/* Line 1806 of yacc.c  */
+#line 2645 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
+    break;
+
+  case 691:
+
+/* Line 1806 of yacc.c  */
+#line 2647 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
+  case 692:
+
+/* Line 1806 of yacc.c  */
+#line 2649 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 693:
+
+/* Line 1806 of yacc.c  */
+#line 2651 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
+    break;
+
+  case 694:
+
+/* Line 1806 of yacc.c  */
+#line 2653 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 696:
+
+/* Line 1806 of yacc.c  */
+#line 2659 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
 
-  case 644:
-
-/* Line 1806 of yacc.c  */
-#line 2470 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
-    break;
-
-  case 645:
-
-/* Line 1806 of yacc.c  */
-#line 2472 "parser.yy"
+  case 697:
+
+/* Line 1806 of yacc.c  */
+#line 2661 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
+    break;
+
+  case 698:
+
+/* Line 1806 of yacc.c  */
+#line 2663 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
+    break;
+
+  case 699:
+
+/* Line 1806 of yacc.c  */
+#line 2668 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
 
-  case 647:
-
-/* Line 1806 of yacc.c  */
-#line 2487 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 648:
-
-/* Line 1806 of yacc.c  */
-#line 2489 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 649:
-
-/* Line 1806 of yacc.c  */
-#line 2494 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
-    break;
-
-  case 650:
-
-/* Line 1806 of yacc.c  */
-#line 2496 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 651:
-
-/* Line 1806 of yacc.c  */
-#line 2498 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 652:
-
-/* Line 1806 of yacc.c  */
-#line 2500 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 653:
-
-/* Line 1806 of yacc.c  */
-#line 2502 "parser.yy"
+  case 700:
+
+/* Line 1806 of yacc.c  */
+#line 2670 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
-  case 655:
-
-/* Line 1806 of yacc.c  */
-#line 2508 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 656:
-
-/* Line 1806 of yacc.c  */
-#line 2510 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 657:
-
-/* Line 1806 of yacc.c  */
-#line 2512 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 658:
-
-/* Line 1806 of yacc.c  */
-#line 2517 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
-    break;
-
-  case 659:
-
-/* Line 1806 of yacc.c  */
-#line 2519 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
-    break;
-
-  case 660:
-
-/* Line 1806 of yacc.c  */
-#line 2521 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 661:
-
-/* Line 1806 of yacc.c  */
-#line 2527 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
-    break;
-
-  case 662:
-
-/* Line 1806 of yacc.c  */
-#line 2529 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); }
-    break;
-
-  case 664:
-
-/* Line 1806 of yacc.c  */
-#line 2535 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); }
-    break;
-
-  case 665:
-
-/* Line 1806 of yacc.c  */
-#line 2537 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newVarArray( 0 ); }
-    break;
-
-  case 666:
-
-/* Line 1806 of yacc.c  */
-#line 2539 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); }
-    break;
-
-  case 667:
-
-/* Line 1806 of yacc.c  */
-#line 2541 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); }
-    break;
-
-  case 669:
-
-/* Line 1806 of yacc.c  */
-#line 2556 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 670:
-
-/* Line 1806 of yacc.c  */
-#line 2558 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 671:
-
-/* Line 1806 of yacc.c  */
-#line 2563 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
-    break;
-
-  case 672:
-
-/* Line 1806 of yacc.c  */
-#line 2565 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 673:
-
-/* Line 1806 of yacc.c  */
-#line 2567 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 674:
-
-/* Line 1806 of yacc.c  */
-#line 2569 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 675:
-
-/* Line 1806 of yacc.c  */
-#line 2571 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 677:
-
-/* Line 1806 of yacc.c  */
-#line 2577 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 678:
-
-/* Line 1806 of yacc.c  */
-#line 2579 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 679:
-
-/* Line 1806 of yacc.c  */
-#line 2581 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 680:
-
-/* Line 1806 of yacc.c  */
-#line 2586 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
-    break;
-
-  case 681:
-
-/* Line 1806 of yacc.c  */
-#line 2588 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
-    break;
-
-  case 682:
-
-/* Line 1806 of yacc.c  */
-#line 2590 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 684:
-
-/* Line 1806 of yacc.c  */
-#line 2597 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 686:
-
-/* Line 1806 of yacc.c  */
-#line 2608 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
-    break;
-
-  case 687:
-
-/* Line 1806 of yacc.c  */
-#line 2611 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
-    break;
-
-  case 688:
-
-/* Line 1806 of yacc.c  */
-#line 2613 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); }
-    break;
-
-  case 689:
-
-/* Line 1806 of yacc.c  */
-#line 2616 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
-    break;
-
-  case 690:
-
-/* Line 1806 of yacc.c  */
-#line 2618 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); }
-    break;
-
-  case 691:
-
-/* Line 1806 of yacc.c  */
-#line 2620 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); }
-    break;
-
-  case 693:
-
-/* Line 1806 of yacc.c  */
-#line 2634 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 694:
-
-/* Line 1806 of yacc.c  */
-#line 2636 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 695:
-
-/* Line 1806 of yacc.c  */
-#line 2641 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
-    break;
-
-  case 696:
-
-/* Line 1806 of yacc.c  */
-#line 2643 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 697:
-
-/* Line 1806 of yacc.c  */
-#line 2645 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 698:
-
-/* Line 1806 of yacc.c  */
-#line 2647 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
-    break;
-
-  case 699:
-
-/* Line 1806 of yacc.c  */
-#line 2649 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 701:
-
-/* Line 1806 of yacc.c  */
-#line 2655 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
-  case 702:
-
-/* Line 1806 of yacc.c  */
-#line 2657 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
-    break;
-
   case 703:
 
 /* Line 1806 of yacc.c  */
-#line 2659 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 704:
-
-/* Line 1806 of yacc.c  */
-#line 2664 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
-    break;
-
-  case 705:
-
-/* Line 1806 of yacc.c  */
-#line 2666 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
-    break;
-
-  case 708:
-
-/* Line 1806 of yacc.c  */
-#line 2676 "parser.yy"
+#line 2680 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 711:
-
-/* Line 1806 of yacc.c  */
-#line 2686 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 712:
-
-/* Line 1806 of yacc.c  */
-#line 2688 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
-    break;
-
-  case 713:
+  case 706:
 
 /* Line 1806 of yacc.c  */
@@ -9162,5 +8877,5 @@
     break;
 
-  case 714:
+  case 707:
 
 /* Line 1806 of yacc.c  */
@@ -9169,5 +8884,5 @@
     break;
 
-  case 715:
+  case 708:
 
 /* Line 1806 of yacc.c  */
@@ -9176,5 +8891,5 @@
     break;
 
-  case 716:
+  case 709:
 
 /* Line 1806 of yacc.c  */
@@ -9183,47 +8898,47 @@
     break;
 
-  case 717:
-
-/* Line 1806 of yacc.c  */
-#line 2703 "parser.yy"
+  case 710:
+
+/* Line 1806 of yacc.c  */
+#line 2698 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 711:
+
+/* Line 1806 of yacc.c  */
+#line 2700 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
+    break;
+
+  case 712:
+
+/* Line 1806 of yacc.c  */
+#line 2707 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 718:
-
-/* Line 1806 of yacc.c  */
-#line 2705 "parser.yy"
+  case 713:
+
+/* Line 1806 of yacc.c  */
+#line 2709 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 719:
-
-/* Line 1806 of yacc.c  */
-#line 2707 "parser.yy"
+  case 714:
+
+/* Line 1806 of yacc.c  */
+#line 2711 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
 
-  case 720:
-
-/* Line 1806 of yacc.c  */
-#line 2709 "parser.yy"
+  case 715:
+
+/* Line 1806 of yacc.c  */
+#line 2713 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
     break;
 
-  case 721:
-
-/* Line 1806 of yacc.c  */
-#line 2711 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 722:
-
-/* Line 1806 of yacc.c  */
-#line 2713 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
-    break;
-
-  case 723:
+  case 716:
 
 /* Line 1806 of yacc.c  */
@@ -9232,9 +8947,58 @@
     break;
 
+  case 717:
+
+/* Line 1806 of yacc.c  */
+#line 2717 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+    break;
+
+  case 718:
+
+/* Line 1806 of yacc.c  */
+#line 2719 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 719:
+
+/* Line 1806 of yacc.c  */
+#line 2721 "parser.yy"
+    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+    break;
+
+  case 720:
+
+/* Line 1806 of yacc.c  */
+#line 2723 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
+    break;
+
+  case 721:
+
+/* Line 1806 of yacc.c  */
+#line 2725 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 722:
+
+/* Line 1806 of yacc.c  */
+#line 2730 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
+    break;
+
+  case 723:
+
+/* Line 1806 of yacc.c  */
+#line 2732 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
+    break;
+
   case 724:
 
 /* Line 1806 of yacc.c  */
-#line 2717 "parser.yy"
-    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+#line 2737 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); }
     break;
 
@@ -9242,13 +9006,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2719 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
-    break;
-
-  case 726:
-
-/* Line 1806 of yacc.c  */
-#line 2721 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
+#line 2739 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); }
     break;
 
@@ -9256,51 +9013,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 2726 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
-    break;
-
-  case 728:
-
-/* Line 1806 of yacc.c  */
-#line 2728 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
-    break;
-
-  case 729:
-
-/* Line 1806 of yacc.c  */
-#line 2733 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); }
-    break;
-
-  case 730:
-
-/* Line 1806 of yacc.c  */
-#line 2735 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); }
-    break;
-
-  case 732:
-
-/* Line 1806 of yacc.c  */
-#line 2762 "parser.yy"
+#line 2766 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
 
-  case 736:
-
-/* Line 1806 of yacc.c  */
-#line 2773 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
-    break;
-
-  case 737:
-
-/* Line 1806 of yacc.c  */
-#line 2775 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
-    break;
-
-  case 738:
+  case 731:
 
 /* Line 1806 of yacc.c  */
@@ -9309,5 +9024,5 @@
     break;
 
-  case 739:
+  case 732:
 
 /* Line 1806 of yacc.c  */
@@ -9316,5 +9031,5 @@
     break;
 
-  case 740:
+  case 733:
 
 /* Line 1806 of yacc.c  */
@@ -9323,5 +9038,5 @@
     break;
 
-  case 741:
+  case 734:
 
 /* Line 1806 of yacc.c  */
@@ -9330,9 +9045,58 @@
     break;
 
+  case 735:
+
+/* Line 1806 of yacc.c  */
+#line 2785 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
+    break;
+
+  case 736:
+
+/* Line 1806 of yacc.c  */
+#line 2787 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
+    break;
+
+  case 737:
+
+/* Line 1806 of yacc.c  */
+#line 2794 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+    break;
+
+  case 738:
+
+/* Line 1806 of yacc.c  */
+#line 2796 "parser.yy"
+    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+    break;
+
+  case 739:
+
+/* Line 1806 of yacc.c  */
+#line 2798 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
+    break;
+
+  case 740:
+
+/* Line 1806 of yacc.c  */
+#line 2800 "parser.yy"
+    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+    break;
+
+  case 741:
+
+/* Line 1806 of yacc.c  */
+#line 2802 "parser.yy"
+    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+    break;
+
   case 742:
 
 /* Line 1806 of yacc.c  */
-#line 2790 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+#line 2804 "parser.yy"
+    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
 
@@ -9340,6 +9104,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2792 "parser.yy"
-    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+#line 2809 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
     break;
 
@@ -9347,6 +9111,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2794 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
+#line 2814 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFunction( 0, DeclarationNode::newTuple( 0 ), (yyvsp[(4) - (5)].decl), 0 ); }
     break;
 
@@ -9354,6 +9118,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2796 "parser.yy"
-    { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
+#line 2816 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
     break;
 
@@ -9361,20 +9125,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2798 "parser.yy"
-    { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
-    break;
-
-  case 747:
-
-/* Line 1806 of yacc.c  */
-#line 2800 "parser.yy"
-    { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
-    break;
-
-  case 748:
-
-/* Line 1806 of yacc.c  */
-#line 2805 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
+#line 2818 "parser.yy"
+    { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
     break;
 
@@ -9382,6 +9132,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2810 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFunction( 0, DeclarationNode::newTuple( 0 ), (yyvsp[(4) - (5)].decl), 0 ); }
+#line 2842 "parser.yy"
+    { (yyval.en) = 0; }
     break;
 
@@ -9389,26 +9139,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2812 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
-    break;
-
-  case 751:
-
-/* Line 1806 of yacc.c  */
-#line 2814 "parser.yy"
-    { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
-    break;
-
-  case 754:
-
-/* Line 1806 of yacc.c  */
-#line 2838 "parser.yy"
-    { (yyval.en) = 0; }
-    break;
-
-  case 755:
-
-/* Line 1806 of yacc.c  */
-#line 2840 "parser.yy"
+#line 2844 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
@@ -9417,5 +9146,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 9420 "Parser/parser.cc"
+#line 9149 "Parser/parser.cc"
       default: break;
     }
@@ -9648,5 +9377,5 @@
 
 /* Line 2067 of yacc.c  */
-#line 2843 "parser.yy"
+#line 2847 "parser.yy"
 
 // ----end of grammar----
Index: src/Parser/parser.h
===================================================================
--- src/Parser/parser.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/parser.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -262,5 +262,5 @@
 
 /* Line 2068 of yacc.c  */
-#line 110 "parser.yy"
+#line 115 "parser.yy"
 
 	Token tok;
@@ -271,7 +271,9 @@
 	DeclarationNode::TypeClass tclass;
 	StatementNode *sn;
-	ConstantNode *constant;
+	ConstantExpr *constant;
+	ForCtl *fctl;
 	LabelNode *label;
 	InitializerNode *in;
+	OperKinds op;
 	bool flag;
 
@@ -279,5 +281,5 @@
 
 /* Line 2068 of yacc.c  */
-#line 282 "Parser/parser.h"
+#line 284 "Parser/parser.h"
 } YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/parser.yy	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 20:52:53 2016
-// Update Count     : 1661
+// Last Modified On : Mon Aug 15 15:18:19 2016
+// Update Count     : 1891
 //
 
@@ -60,4 +60,9 @@
 std::stack< LinkageSpec::Type > linkageStack;
 TypedefTable typedefTable;
+
+void appendStr( std::string &to, std::string *from ) {
+	// "abc" "def" "ghi" => "abcdefghi", remove new text from quotes and insert before last quote in old string.
+	to.insert( to.length() - 1, from->substr( 1, from->length() - 2 ) );
+} // appendStr
 %}
 
@@ -116,7 +121,9 @@
 	DeclarationNode::TypeClass tclass;
 	StatementNode *sn;
-	ConstantNode *constant;
+	ConstantExpr *constant;
+	ForCtl *fctl;
 	LabelNode *label;
 	InitializerNode *in;
+	OperKinds op;
 	bool flag;
 }
@@ -127,7 +134,7 @@
 
 // expressions
-%type<constant> constant
+%type<en> constant
 %type<en> tuple							tuple_expression_list
-%type<en> ptrref_operator				unary_operator				assignment_operator
+%type<op> ptrref_operator				unary_operator				assignment_operator
 %type<en> primary_expression			postfix_expression			unary_expression
 %type<en> cast_expression				multiplicative_expression	additive_expression			shift_expression
@@ -136,9 +143,10 @@
 %type<en> constant_expression			assignment_expression		assignment_expression_opt
 %type<en> comma_expression				comma_expression_opt
-%type<en> argument_expression_list		argument_expression			for_control_expression		assignment_opt
+%type<en> argument_expression_list		argument_expression			assignment_opt
+%type<fctl> for_control_expression
 %type<en> subrange
 %type<en> asm_operands_opt asm_operands_list asm_operand
 %type<label> label_list
-%type<constant> asm_clobbers_list_opt
+%type<en> asm_clobbers_list_opt
 %type<flag> asm_volatile_opt
 
@@ -150,8 +158,8 @@
 %type<sn> block_item_list				block_item
 %type<sn> case_clause
-%type<en> case_value					case_value_list
-%type<sn> case_label					case_label_list
+%type<en> case_value
+%type<sn> case_value_list				case_label					case_label_list
 %type<sn> switch_clause_list_opt		switch_clause_list			choose_clause_list_opt		choose_clause_list
-%type<pn> handler_list					handler_clause				finally_clause
+%type<sn> handler_list					handler_clause				finally_clause
 
 // declarations
@@ -303,7 +311,7 @@
 constant:
 		// ENUMERATIONconstant is not included here; it is treated as a variable with type "enumeration constant".
-INTEGERconstant									{ $$ = makeConstant( ConstantNode::Integer, $1 ); }
-	| FLOATINGconstant							{ $$ = makeConstant( ConstantNode::Float, $1 ); }
-	| CHARACTERconstant							{ $$ = makeConstant( ConstantNode::Character, $1 ); }
+INTEGERconstant									{ $$ = new ExpressionNode( build_constantInteger( *$1 ) ); }
+	| FLOATINGconstant							{ $$ = new ExpressionNode( build_constantFloat( *$1 ) ); }
+	| CHARACTERconstant							{ $$ = new ExpressionNode( build_constantChar( *$1 ) ); }
 	;
 
@@ -330,6 +338,11 @@
 
 string_literal_list:									// juxtaposed strings are concatenated
-	STRINGliteral								{ $$ = makeConstantStr( ConstantNode::String, $1 ); }
-	| string_literal_list STRINGliteral			{ $$ = $1->appendstr( $2 ); }
+	STRINGliteral								{ $$ = build_constantStr( *$1 ); }
+	| string_literal_list STRINGliteral
+		{
+			appendStr( $1->get_constant()->get_value(), $2 );
+			delete $2;									// allocated by lexer
+			$$ = $1;
+		}
 	;
 
@@ -338,11 +351,11 @@
 primary_expression:
 	IDENTIFIER											// typedef name cannot be used as a variable name
-		{ $$ = new VarRefNode( $1 ); }
+		{ $$ = new ExpressionNode( build_varref( $1 ) ); }
 	| zero_one
-		{ $$ = new VarRefNode( $1 ); }
+		{ $$ = new ExpressionNode( build_varref( $1 ) ); }
 	| '(' comma_expression ')'
 		{ $$ = $2; }
 	| '(' compound_statement ')'						// GCC, lambda expression
-		{ $$ = new ValofExprNode( $2 ); }
+	{ $$ = new ExpressionNode( build_valexpr( $2 ) ); }
 	;
 
@@ -354,25 +367,26 @@
 		// little advantage to this feature and many disadvantages. It is possible to write x[(i,j)] in CFA, which is
 		// equivalent to the old x[i,j].
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Index ), $1, $4 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Index, $1, $4 ) ); }
 	| postfix_expression '(' argument_expression_list ')'
-		{ $$ = new CompositeExprNode( $1, $3 ); }
+		{ $$ = new ExpressionNode( build_func( $1, $3 ) ); }
         // ambiguity with .0 so space required after field-selection, e.g.
 		//   struct S { int 0, 1; } s; s. 0 = 0; s. 1 = 1;
 	| postfix_expression '.' no_attr_identifier
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), $1, new VarRefNode( $3 )); }
+		{ $$ = new ExpressionNode( build_fieldSel( $1, build_varref( $3 ) ) ); }
 	| postfix_expression '.' '[' push field_list pop ']' // CFA, tuple field selector
 	| postfix_expression ARROW no_attr_identifier
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), $1, new VarRefNode( $3 )); }
+		{ $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); }
 	| postfix_expression ARROW '[' push field_list pop ']' // CFA, tuple field selector
 	| postfix_expression ICR
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::IncrPost ), $1 ); }
+	  	{ $$ = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, $1 ) ); }
 	| postfix_expression DECR
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), $1 ); }
+	  	{ $$ = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, $1 ) ); }
 	| '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99
-		{ $$ = new CompoundLiteralNode( $2, new InitializerNode( $5, true ) ); }
+		{ $$ = new ExpressionNode( build_compoundLiteral( $2, new InitializerNode( $5, true ) ) ); }
 	| postfix_expression '{' argument_expression_list '}' // CFA
 		{
-			Token fn; fn.str = new std::string( "?{}" ); // location undefined
-			$$ = new CompositeExprNode( new VarRefNode( fn ), (ExpressionNode *)( $1 )->set_link( $3 ) );
+			Token fn;
+			fn.str = new std::string( "?{}" ); // location undefined
+			$$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_last( $3 ) ) );
 		}
 	;
@@ -381,5 +395,5 @@
 	argument_expression
 	| argument_expression_list ',' argument_expression
-		{ $$ = (ExpressionNode *)( $1->set_link( $3 )); }
+		{ $$ = (ExpressionNode *)( $1->set_last( $3 )); }
 	;
 
@@ -388,33 +402,24 @@
 		{ $$ = 0; }										// use default argument
 	| assignment_expression
-	| no_attr_identifier ':' assignment_expression
-		{ $$ = $3->set_argName( $1 ); }
-		// Only a list of no_attr_identifier_or_type_name is allowed in this context. However, there is insufficient
-		// look ahead to distinguish between this list of parameter names and a tuple, so the tuple form must be used
-		// with an appropriate semantic check.
-	| '[' push assignment_expression pop ']' ':' assignment_expression
-		{ $$ = $7->set_argName( $3 ); }
-	| '[' push assignment_expression ',' tuple_expression_list pop ']' ':' assignment_expression
-		{ $$ = $9->set_argName( new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)$3->set_link( flattenCommas( $5 )))); }
 	;
 
 field_list:												// CFA, tuple field selector
 	field
-	| field_list ',' field						{ $$ = (ExpressionNode *)$1->set_link( $3 ); }
+	| field_list ',' field						{ $$ = (ExpressionNode *)$1->set_last( $3 ); }
 	;
 
 field:													// CFA, tuple field selector
 	no_attr_identifier
-		{ $$ = new VarRefNode( $1 ); }
+		{ $$ = new ExpressionNode( build_varref( $1 ) ); }
         // ambiguity with .0 so space required after field-selection, e.g.
 		//   struct S { int 0, 1; } s; s. 0 = 0; s. 1 = 1;
 	| no_attr_identifier '.' field
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), new VarRefNode( $1 ), $3 ); }
+		{ $$ = new ExpressionNode( build_fieldSel( $3, build_varref( $1 ) ) ); }
 	| no_attr_identifier '.' '[' push field_list pop ']'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::FieldSel ), new VarRefNode( $1 ), $5 ); }
+		{ $$ = new ExpressionNode( build_fieldSel( $5, build_varref( $1 ) ) ); }
 	| no_attr_identifier ARROW field
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), new VarRefNode( $1 ), $3 ); }
+		{ $$ = new ExpressionNode( build_pfieldSel( $3, build_varref( $1 ) ) ); }
 	| no_attr_identifier ARROW '[' push field_list pop ']'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::PFieldSel ), new VarRefNode( $1 ), $5 ); }
+		{ $$ = new ExpressionNode( build_pfieldSel( $5, build_varref( $1 ) ) ); }
 	;
 
@@ -426,50 +431,61 @@
 		{ $$ = $1; }
 	| string_literal_list
-		{ $$ = $1; }
+		{ $$ = new ExpressionNode( $1 ); }
 	| EXTENSION cast_expression							// GCC
 		{ $$ = $2->set_extension( true ); }
-	| ptrref_operator cast_expression					// CFA
-		{ $$ = new CompositeExprNode( $1, $2 ); }
 		// '*' ('&') is separated from unary_operator because of shift/reduce conflict in:
 		//		{ * X; }	 // dereference X
 		//		{ * int X; } // CFA declaration of pointer to int
+	| ptrref_operator cast_expression					// CFA
+		{
+			switch ( $1 ) {
+			  case OperKinds::AddressOf:
+				$$ = new ExpressionNode( build_addressOf( $2 ) );
+				break;
+			  case OperKinds::PointTo:
+				$$ = new ExpressionNode( build_unary_val( $1, $2 ) );
+				break;
+			  default:
+				assert( false );
+			}
+		}
 	| unary_operator cast_expression
-		{ $$ = new CompositeExprNode( $1, $2 ); }
+	  	{ $$ = new ExpressionNode( build_unary_val( $1, $2 ) ); }
 	| ICR unary_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Incr ), $2 ); }
+	  	{ $$ = new ExpressionNode( build_unary_ptr( OperKinds::Incr, $2 ) ); }
 	| DECR unary_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Decr ), $2 ); }
+	  	{ $$ = new ExpressionNode( build_unary_ptr( OperKinds::Decr, $2 ) ); }
 	| SIZEOF unary_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), $2 ); }
+		{ $$ = new ExpressionNode( build_sizeOfexpr( $2 ) ); }
 	| SIZEOF '(' type_name_no_function ')'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::SizeOf ), new TypeValueNode( $3 )); }
+		{ $$ = new ExpressionNode( build_sizeOftype( $3 ) ); }
+	| ALIGNOF unary_expression							// GCC, variable alignment
+		{ $$ = new ExpressionNode( build_alignOfexpr( $2 ) ); }
+	| ALIGNOF '(' type_name_no_function ')'				// GCC, type alignment
+		{ $$ = new ExpressionNode( build_alignOftype( $3 ) ); }
 	| OFFSETOF '(' type_name_no_function ',' no_attr_identifier ')'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::OffsetOf ), new TypeValueNode( $3 ), new VarRefNode( $5 )); }
+		{ $$ = new ExpressionNode( build_offsetOf( $3, build_varref( $5 ) ) ); }
 	| ATTR_IDENTIFIER
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 )); }
+		{ $$ = new ExpressionNode( build_attrexpr( build_varref( $1 ), nullptr ) ); }
+	| ATTR_IDENTIFIER '(' argument_expression ')'
+		{ $$ = new ExpressionNode( build_attrexpr( build_varref( $1 ), $3 ) ); }
 	| ATTR_IDENTIFIER '(' type_name ')'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ), new TypeValueNode( $3 )); }
-	| ATTR_IDENTIFIER '(' argument_expression ')'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ), $3 ); }
-	| ALIGNOF unary_expression							// GCC, variable alignment
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), $2 ); }
-	| ALIGNOF '(' type_name_no_function ')'				// GCC, type alignment
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::AlignOf ), new TypeValueNode( $3 ) ); }
+		{ $$ = new ExpressionNode( build_attrtype( build_varref( $1 ), $3 ) ); }
 //	| ANDAND IDENTIFIER									// GCC, address of label
-//		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LabelAddress ), new VarRefNode( $2, true ) ); }
+//		{ $$ = new ExpressionNode( new OperatorNode( OperKinds::LabelAddress ), new ExpressionNode( build_varref( $2, true ) ); }
 	;
 
 ptrref_operator:
-	'*'											{ $$ = new OperatorNode( OperatorNode::PointTo ); }
-	| '&'										{ $$ = new OperatorNode( OperatorNode::AddressOf ); }
+	'*'											{ $$ = OperKinds::PointTo; }
+	| '&'										{ $$ = OperKinds::AddressOf; }
 		// GCC, address of label must be handled by semantic check for ref,ref,label
-	| ANDAND									{ $$ = new OperatorNode( OperatorNode::And ); }
+//	| ANDAND									{ $$ = OperKinds::And; }
 	;
 
 unary_operator:
-	'+'											{ $$ = new OperatorNode( OperatorNode::UnPlus ); }
-	| '-'										{ $$ = new OperatorNode( OperatorNode::UnMinus ); }
-	| '!'										{ $$ = new OperatorNode( OperatorNode::Neg ); }
-	| '~'										{ $$ = new OperatorNode( OperatorNode::BitNeg ); }
+	'+'											{ $$ = OperKinds::UnPlus; }
+	| '-'										{ $$ = OperKinds::UnMinus; }
+	| '!'										{ $$ = OperKinds::Neg; }
+	| '~'										{ $$ = OperKinds::BitNeg; }
 	;
 
@@ -477,7 +493,7 @@
 	unary_expression
 	| '(' type_name_no_function ')' cast_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Cast ), new TypeValueNode( $2 ), $4 ); }
+		{ $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
 	| '(' type_name_no_function ')' tuple
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Cast ), new TypeValueNode( $2 ), $4 ); }
+		{ $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
 	;
 
@@ -485,9 +501,9 @@
 	cast_expression
 	| multiplicative_expression '*' cast_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Mul ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); }
 	| multiplicative_expression '/' cast_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Div ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Div, $1, $3 ) ); }
 	| multiplicative_expression '%' cast_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Mod ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); }
 	;
 
@@ -495,7 +511,7 @@
 	multiplicative_expression
 	| additive_expression '+' multiplicative_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Plus ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Plus, $1, $3 ) ); }
 	| additive_expression '-' multiplicative_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Minus ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Minus, $1, $3 ) ); }
 	;
 
@@ -503,7 +519,7 @@
 	additive_expression
 	| shift_expression LS additive_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LShift ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::LShift, $1, $3 ) ); }
 	| shift_expression RS additive_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::RShift ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::RShift, $1, $3 ) ); }
 	;
 
@@ -511,11 +527,11 @@
 	shift_expression
 	| relational_expression '<' shift_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LThan ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::LThan, $1, $3 ) ); }
 	| relational_expression '>' shift_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::GThan ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::GThan, $1, $3 ) ); }
 	| relational_expression LE shift_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LEThan ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::LEThan, $1, $3 ) ); }
 	| relational_expression GE shift_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::GEThan ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::GEThan, $1, $3 ) ); }
 	;
 
@@ -523,7 +539,7 @@
 	relational_expression
 	| equality_expression EQ relational_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Eq ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Eq, $1, $3 ) ); }
 	| equality_expression NE relational_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Neq ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Neq, $1, $3 ) ); }
 	;
 
@@ -531,5 +547,5 @@
 	equality_expression
 	| AND_expression '&' equality_expression
-		{ $$ =new CompositeExprNode( new OperatorNode( OperatorNode::BitAnd ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::BitAnd, $1, $3 ) ); }
 	;
 
@@ -537,5 +553,5 @@
 	AND_expression
 	| exclusive_OR_expression '^' AND_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Xor ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::Xor, $1, $3 ) ); }
 	;
 
@@ -543,5 +559,5 @@
 	exclusive_OR_expression
 	| inclusive_OR_expression '|' exclusive_OR_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::BitOr ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_val( OperKinds::BitOr, $1, $3 ) ); }
 	;
 
@@ -549,5 +565,5 @@
 	inclusive_OR_expression
 	| logical_AND_expression ANDAND inclusive_OR_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::And ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_and_or( $1, $3, true ) ); }
 	;
 
@@ -555,5 +571,5 @@
 	logical_AND_expression
 	| logical_OR_expression OROR logical_AND_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Or ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_and_or( $1, $3, false ) ); }
 	;
 
@@ -561,9 +577,10 @@
 	logical_OR_expression
 	| logical_OR_expression '?' comma_expression ':' conditional_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*$1, *$3, *$5 ) ) ); }
+		{ $$ = new ExpressionNode( build_cond( $1, $3, $5 ) ); }
+		// FIX ME: this hack computes $1 twice
 	| logical_OR_expression '?' /* empty */ ':' conditional_expression // GCC, omitted first operand
-		{ $$=new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), $1, $4 ); }
+		{ $$ = new ExpressionNode( build_cond( $1, $1, $4 ) ); }
 	| logical_OR_expression '?' comma_expression ':' tuple // CFA, tuple expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*$1, *$3, *$5 ) ) ); }
+		{ $$ = new ExpressionNode( build_cond( $1, $3, $5 ) ); }
 	;
 
@@ -575,16 +592,28 @@
 		// CFA, assignment is separated from assignment_operator to ensure no assignment operations for tuples
 	conditional_expression
-	| unary_expression '=' assignment_expression
-		{ $$ =new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $3 ); }
 	| unary_expression assignment_operator assignment_expression
-		{ $$ =new CompositeExprNode( $2, $1, $3 ); }
+		{ $$ = new ExpressionNode( build_binary_ptr( $2, $1, $3 ) ); }
 	| tuple assignment_opt								// CFA, tuple expression
-		{ $$ = ( $2 == 0 ) ? $1 : new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $2 ); }
+		{ $$ = ( $2 == 0 ) ? $1 : new ExpressionNode( build_binary_ptr( OperKinds::Assign, $1, $2 ) ); }
 	;
 
 assignment_expression_opt:
 	// empty
-		{ $$ = new NullExprNode; }
+		{ $$ = nullptr; }
 	| assignment_expression
+	;
+
+assignment_operator:
+	'='											{ $$ = OperKinds::Assign; }
+	| MULTassign								{ $$ = OperKinds::MulAssn; }
+	| DIVassign									{ $$ = OperKinds::DivAssn; }
+	| MODassign									{ $$ = OperKinds::ModAssn; }
+	| PLUSassign								{ $$ = OperKinds::PlusAssn; }
+	| MINUSassign								{ $$ = OperKinds::MinusAssn; }
+	| LSassign									{ $$ = OperKinds::LSAssn; }
+	| RSassign									{ $$ = OperKinds::RSAssn; }
+	| ANDassign									{ $$ = OperKinds::AndAssn; }
+	| ERassign									{ $$ = OperKinds::ERAssn; }
+	| ORassign									{ $$ = OperKinds::OrAssn; }
 	;
 
@@ -593,11 +622,11 @@
 		// comma_expression in new_identifier_parameter_array and new_abstract_array
 	'[' ']'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ) ); }
+		{ $$ = new ExpressionNode( build_tuple() ); }
 	| '[' push assignment_expression pop ']'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), $3 ); }
+		{ $$ = new ExpressionNode( build_tuple( $3 ) ); }
 	| '[' push ',' tuple_expression_list pop ']'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(new NullExprNode)->set_link( $4 ) ); }
+		{ $$ = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( $4 ) ) ); }
 	| '[' push assignment_expression ',' tuple_expression_list pop ']'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)$3->set_link( flattenCommas( $5 ) ) ); }
+		{ $$ = new ExpressionNode( build_tuple( (ExpressionNode *)$3->set_last( $5 ) ) ); }
 	;
 
@@ -605,24 +634,11 @@
 	assignment_expression_opt
 	| tuple_expression_list ',' assignment_expression_opt
-		{ $$ = (ExpressionNode *)$1->set_link( $3 ); }
-	;
-
-assignment_operator:
-	MULTassign									{ $$ = new OperatorNode( OperatorNode::MulAssn ); }
-	| DIVassign									{ $$ = new OperatorNode( OperatorNode::DivAssn ); }
-	| MODassign									{ $$ = new OperatorNode( OperatorNode::ModAssn ); }
-	| PLUSassign								{ $$ = new OperatorNode( OperatorNode::PlusAssn ); }
-	| MINUSassign								{ $$ = new OperatorNode( OperatorNode::MinusAssn ); }
-	| LSassign									{ $$ = new OperatorNode( OperatorNode::LSAssn ); }
-	| RSassign									{ $$ = new OperatorNode( OperatorNode::RSAssn ); }
-	| ANDassign									{ $$ = new OperatorNode( OperatorNode::AndAssn ); }
-	| ERassign									{ $$ = new OperatorNode( OperatorNode::ERAssn ); }
-	| ORassign									{ $$ = new OperatorNode( OperatorNode::OrAssn ); }
+		{ $$ = (ExpressionNode *)$1->set_last( $3 ); }
 	;
 
 comma_expression:
 	assignment_expression
-	| comma_expression ',' assignment_expression	// { $$ = (ExpressionNode *)$1->add_to_list( $3 ); }
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Comma ), $1, $3 ); }
+	| comma_expression ',' assignment_expression
+		{ $$ = new ExpressionNode( build_comma( $1, $3 ) ); }
 	;
 
@@ -646,7 +662,7 @@
 	| '^' postfix_expression '{' argument_expression_list '}' ';' // CFA
 		{
-			Token fn; fn.str = new std::string( "^?{}" ); // location undefined
-			$$ = new StatementNode( StatementNode::Exp, new CompositeExprNode( new VarRefNode( fn ),
-				(ExpressionNode *)( $2 )->set_link( $4 ) ), 0 );
+			Token fn;
+			fn.str = new std::string( "^?{}" ); // location undefined
+			$$ = new StatementNode( build_expr( new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $2 )->set_last( $4 ) ) ) ) );
 		}
 	;
@@ -662,5 +678,5 @@
 compound_statement:
 	'{' '}'
-		{ $$ = new CompoundStmtNode( (StatementNode *)0 ); }
+		{ $$ = new StatementNode( build_compound( (StatementNode *)0 ) ); }
 	| '{'
 		// Two scopes are necessary because the block itself has a scope, but every declaration within the block also
@@ -669,5 +685,5 @@
 	  local_label_declaration_opt						// GCC, local labels
 	  block_item_list pop '}'							// C99, intermix declarations and statements
-		{ $$ = new CompoundStmtNode( $5 ); }
+		{ $$ = new StatementNode( build_compound( $5 ) ); }
 	;
 
@@ -675,5 +691,5 @@
 	block_item
 	| block_item_list push block_item
-		{ if ( $1 != 0 ) { $1->set_link( $3 ); $$ = $1; } }
+		{ if ( $1 != 0 ) { $1->set_last( $3 ); $$ = $1; } }
 	;
 
@@ -683,5 +699,5 @@
 	| EXTENSION declaration								// GCC
 		{	// mark all fields in list
-			for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_link() )
+			for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_next() )
 				iter->set_extension( true );
 			$$ = new StatementNode( $2 );
@@ -695,10 +711,10 @@
 	statement
 	| statement_list statement
-		{ if ( $1 != 0 ) { $1->set_link( $2 ); $$ = $1; } }
+		{ if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
 	;
 
 expression_statement:
 	comma_expression_opt ';'
-		{ $$ = new StatementNode( StatementNode::Exp, $1, 0 ); }
+		{ $$ = new StatementNode( build_expr( $1 ) ); }
 	;
 
@@ -706,24 +722,25 @@
 	IF '(' comma_expression ')' statement				%prec THEN
 		// explicitly deal with the shift/reduce conflict on if/else
-		{ $$ = new StatementNode( StatementNode::If, $3, $5 ); }
+		{ $$ = new StatementNode( build_if( $3, $5, nullptr ) ); }
 	| IF '(' comma_expression ')' statement ELSE statement
-		{ $$ = new StatementNode( StatementNode::If, $3, (StatementNode *)mkList((*$5, *$7 )) ); }
+		{ $$ = new StatementNode( build_if( $3, $5, $7 ) ); }
 	| SWITCH '(' comma_expression ')' case_clause		// CFA
-		{ $$ = new StatementNode( StatementNode::Switch, $3, $5 ); }
+		{ $$ = new StatementNode( build_switch( $3, $5 ) ); }
 	| SWITCH '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA
 		{
-			StatementNode *sw = new StatementNode( StatementNode::Switch, $3, $8 );
+			StatementNode *sw = new StatementNode( build_switch( $3, $8 ) );
 			// The semantics of the declaration list is changed to include associated initialization, which is performed
 			// *before* the transfer to the appropriate case clause by hoisting the declarations into a compound
 			// statement around the switch.  Statements after the initial declaration list can never be executed, and
-			// therefore, are removed from the grammar even though C allows it. Change also applies to choose statement.
-			$$ = $7 != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode( $7 ))->set_link( sw )) ) : sw;
+			// therefore, are removed from the grammar even though C allows it. The change also applies to choose
+			// statement.
+			$$ = $7 != 0 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( $7 ))->set_last( sw )) ) ) : sw;
 		}
 	| CHOOSE '(' comma_expression ')' case_clause		// CFA
-		{ $$ = new StatementNode( StatementNode::Switch, $3, $5 ); }
+		{ $$ = new StatementNode( build_switch( $3, $5 ) ); }
 	| CHOOSE '(' comma_expression ')' '{' push declaration_list_opt choose_clause_list_opt '}' // CFA
 		{
-			StatementNode *sw = new StatementNode( StatementNode::Switch, $3, $8 );
-			$$ = $7 != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode( $7 ))->set_link( sw )) ) : sw;
+			StatementNode *sw = new StatementNode( build_switch( $3, $8 ) );
+			$$ = $7 != 0 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( $7 ))->set_last( sw )) ) ) : sw;
 		}
 	;
@@ -735,17 +752,17 @@
 	constant_expression							{ $$ = $1; }
 	| constant_expression ELLIPSIS constant_expression	// GCC, subrange
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_range( $1, $3 ) ); }
 	| subrange											// CFA, subrange
 	;
 
 case_value_list:										// CFA
-	case_value
-	| case_value_list ',' case_value
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(tupleContents( $1 ))->set_link( $3 ) ); }
+	case_value									{ $$ = new StatementNode( build_case( $1 ) ); }
+		// convert case list, e.g., "case 1, 3, 5:" into "case 1: case 3: case 5"
+	| case_value_list ',' case_value			{ $$ = (StatementNode *)($1->set_last( new StatementNode( build_case( $3 ) ) ) ); }
 	;
 
 case_label:												// CFA
-	CASE case_value_list ':'					{ $$ = new StatementNode( StatementNode::Case, $2, 0 ); }
-	| DEFAULT ':'								{ $$ = new StatementNode( StatementNode::Default ); }
+	CASE case_value_list ':'					{ $$ = $2; }
+	| DEFAULT ':'								{ $$ = new StatementNode( build_default() ); }
 		// A semantic check is required to ensure only one default clause per switch/choose statement.
 	;
@@ -753,9 +770,9 @@
 case_label_list:										// CFA
 	case_label
-	| case_label_list case_label				{ $$ = (StatementNode *)( $1->set_link( $2 )); }
+	| case_label_list case_label				{ $$ = (StatementNode *)( $1->set_last( $2 )); }
 	;
 
 case_clause:											// CFA
-	case_label_list statement					{ $$ = $1->append_last_case( new CompoundStmtNode( $2 ) ); }
+	case_label_list statement					{ $$ = $1->append_last_case( new StatementNode( build_compound( $2 ) ) ); }
 	;
 
@@ -768,7 +785,7 @@
 switch_clause_list:										// CFA
 	case_label_list statement_list
-		{ $$ = $1->append_last_case( new CompoundStmtNode( $2 ) ); }
+		{ $$ = $1->append_last_case( new StatementNode( build_compound( $2 ) ) ); }
 	| switch_clause_list case_label_list statement_list
-		{ $$ = (StatementNode *)( $1->set_link( $2->append_last_case( new CompoundStmtNode( $3 ) ) ) ); }
+		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( $3 ) ) ) ) ); }
 	;
 
@@ -783,14 +800,14 @@
 		{ $$ = $1->append_last_case( $2 ); }
 	| case_label_list statement_list fall_through_opt
-		{ $$ = $1->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*$2, *$3 ) ) ) ); }
+		{ $$ = $1->append_last_case( new StatementNode( build_compound( (StatementNode *)$2->set_last( $3 ) ) ) ); }
 	| choose_clause_list case_label_list fall_through
-		{ $$ = (StatementNode *)( $1->set_link( $2->append_last_case( $3 ))); }
+		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( $3 ))); }
 	| choose_clause_list case_label_list statement_list fall_through_opt
-		{ $$ = (StatementNode *)( $1->set_link( $2->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*$3, *$4 ) ) ) ) ) ); }
+		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( (StatementNode *)$3->set_last( $4 ) ) ) ) ) ); }
 	;
 
 fall_through_opt:										// CFA
 	// empty
-		{ $$ = new StatementNode( StatementNode::Break ); }	// insert implicit break
+		{ $$ = new StatementNode( build_branch( "", BranchStmt::Break ) ); } // insert implicit break
 	| fall_through
 	;
@@ -805,88 +822,80 @@
 iteration_statement:
 	WHILE '(' comma_expression ')' statement
-		{ $$ = new StatementNode( StatementNode::While, $3, $5 ); }
+		{ $$ = new StatementNode( build_while( $3, $5 ) ); }
 	| DO statement WHILE '(' comma_expression ')' ';'
-		{ $$ = new StatementNode( StatementNode::Do, $5, $2 ); }
+		{ $$ = new StatementNode( build_while( $5, $2 ) ); }
 	| FOR '(' push for_control_expression ')' statement
-		{ $$ = new StatementNode( StatementNode::For, $4, $6 ); }
+		{ $$ = new StatementNode( build_for( $4, $6 ) ); }
 	;
 
 for_control_expression:
 	comma_expression_opt pop ';' comma_expression_opt ';' comma_expression_opt
-		{ $$ = new ForCtlExprNode( $1, $4, $6 ); }
+		{ $$ = new ForCtl( $1, $4, $6 ); }
 	| declaration comma_expression_opt ';' comma_expression_opt // C99
-		{ $$ = new ForCtlExprNode( $1, $2, $4 ); }
-	;
+		{ $$ = new ForCtl( $1, $2, $4 ); }
+ 	;
 
 jump_statement:
 	GOTO IDENTIFIER ';'
-		{ $$ = new StatementNode( StatementNode::Goto, $2 ); }
+		{ $$ = new StatementNode( build_branch( *$2, BranchStmt::Goto ) ); }
 	| GOTO '*' comma_expression ';'						// GCC, computed goto
 		// The syntax for the GCC computed goto violates normal expression precedence, e.g., goto *i+3; => goto *(i+3);
 		// whereas normal operator precedence yields goto (*i)+3;
-		{ $$ = new StatementNode( StatementNode::Goto, $3 ); }
+		{ $$ = new StatementNode( build_computedgoto( $3 ) ); }
 	| CONTINUE ';'
 		// A semantic check is required to ensure this statement appears only in the body of an iteration statement.
-		{ $$ = new StatementNode( StatementNode::Continue ); }
+		{ $$ = new StatementNode( build_branch( "", BranchStmt::Continue ) ); }
 	| CONTINUE IDENTIFIER ';'							// CFA, multi-level continue
 		// A semantic check is required to ensure this statement appears only in the body of an iteration statement, and
 		// the target of the transfer appears only at the start of an iteration statement.
-		{ $$ = new StatementNode( StatementNode::Continue, $2 ); }
+		{ $$ = new StatementNode( build_branch( *$2, BranchStmt::Continue ) ); delete $2; }
 	| BREAK ';'
 		// A semantic check is required to ensure this statement appears only in the body of an iteration statement.
-		{ $$ = new StatementNode( StatementNode::Break ); }
+		{ $$ = new StatementNode( build_branch( "", BranchStmt::Break ) ); }
 	| BREAK IDENTIFIER ';'								// CFA, multi-level exit
 		// A semantic check is required to ensure this statement appears only in the body of an iteration statement, and
 		// the target of the transfer appears only at the start of an iteration statement.
-		{ $$ = new StatementNode( StatementNode::Break, $2 ); }
+		{ $$ = new StatementNode( build_branch( *$2, BranchStmt::Break ) ); delete $2; }
 	| RETURN comma_expression_opt ';'
-		{ $$ = new StatementNode( StatementNode::Return, $2, 0 ); }
-	| THROW assignment_expression_opt ';'
-		{ $$ = new StatementNode( StatementNode::Throw, $2, 0 ); }
-//	| THROW ';'
-//		{ $$ = new StatementNode( StatementNode::Throw ); }
-	| THROWRESUME assignment_expression_opt ';'
-		{ $$ = new StatementNode( StatementNode::Throw, $2, 0 ); }
-	| THROWRESUME assignment_expression_opt AT assignment_expression ';'
-		{ $$ = new StatementNode( StatementNode::Throw, $2, 0 ); }
-//	| THROWRESUME ';'
-//		{ $$ = new StatementNode( StatementNode::Throw ); }
+		{ $$ = new StatementNode( build_return( $2 ) ); }
+	| THROW assignment_expression_opt ';'				// handles rethrow
+		{ $$ = new StatementNode( build_throw( $2 ) ); }
+	| THROWRESUME assignment_expression_opt ';'			// handles reresume
+		{ $$ = new StatementNode( build_throw( $2 ) ); }
+	| THROWRESUME assignment_expression_opt AT assignment_expression ';' // handles reresume
+		{ $$ = new StatementNode( build_throw( $2 ) ); }
 	;
 
 exception_statement:
 	TRY compound_statement handler_list
-		{ $$ = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*$2,*$3 )))); }
+		{ $$ = new StatementNode( build_try( $2, $3, 0 ) ); }
 	| TRY compound_statement finally_clause
-		{ $$ = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*$2,*$3 )))); }
+		{ $$ = new StatementNode( build_try( $2, 0, $3 ) ); }
 	| TRY compound_statement handler_list finally_clause
-		{
-			$3->set_link( $4 );
-			$$ = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*$2,*$3 ))));
-		}
+		{ $$ = new StatementNode( build_try( $2, $3, $4 ) ); }
 	;
 
 handler_list:
-		// There must be at least one catch clause
 	handler_clause
 		// ISO/IEC 9899:1999 Section 15.3(6 ) If present, a "..." handler shall be the last handler for its try block.
 	| CATCH '(' ELLIPSIS ')' compound_statement
-		{ $$ = StatementNode::newCatchStmt( 0, $5, true ); }
+		{ $$ = new StatementNode( build_catch( 0, $5, true ) ); }
 	| handler_clause CATCH '(' ELLIPSIS ')' compound_statement
-		{ $$ = $1->set_link( StatementNode::newCatchStmt( 0, $6, true ) ); }
+		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( 0, $6, true ) ) ); }
 	| CATCHRESUME '(' ELLIPSIS ')' compound_statement
-		{ $$ = StatementNode::newCatchStmt( 0, $5, true ); }
+		{ $$ = new StatementNode( build_catch( 0, $5, true ) ); }
 	| handler_clause CATCHRESUME '(' ELLIPSIS ')' compound_statement
-		{ $$ = $1->set_link( StatementNode::newCatchStmt( 0, $6, true ) ); }
+		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( 0, $6, true ) ) ); }
 	;
 
 handler_clause:
 	CATCH '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = StatementNode::newCatchStmt( $5, $8 ); }
+		{ $$ = new StatementNode( build_catch( $5, $8 ) ); }
 	| handler_clause CATCH '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = $1->set_link( StatementNode::newCatchStmt( $6, $9 ) ); }
+	{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $6, $9 ) ) ); }
 	| CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = StatementNode::newCatchStmt( $5, $8 ); }
+		{ $$ = new StatementNode( build_catch( $5, $8 ) ); }
 	| handler_clause CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = $1->set_link( StatementNode::newCatchStmt( $6, $9 ) ); }
+		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $6, $9 ) ) ); }
 	;
 
@@ -894,6 +903,5 @@
 	FINALLY compound_statement
 		{
-			$$ = new StatementNode( StatementNode::Finally, 0, $2 );
-			std::cout << "Just created a finally node" << std::endl;
+			$$ = new StatementNode( build_finally( $2 ) );
 		}
 	;
@@ -923,13 +931,13 @@
 asm_statement:
 	ASM asm_volatile_opt '(' string_literal_list ')' ';'
-		{ $$ = new AsmStmtNode( StatementNode::Asm, $2, $4, 0 ); }
+		{ $$ = new StatementNode( build_asmstmt( $2, $4, 0 ) ); }
 	| ASM asm_volatile_opt '(' string_literal_list ':' asm_operands_opt ')' ';' // remaining GCC
-		{ $$ = new AsmStmtNode( StatementNode::Asm, $2, $4, $6 ); }
+		{ $$ = new StatementNode( build_asmstmt( $2, $4, $6 ) ); }
 	| ASM asm_volatile_opt '(' string_literal_list ':' asm_operands_opt ':' asm_operands_opt ')' ';'
-		{ $$ = new AsmStmtNode( StatementNode::Asm, $2, $4, $6, $8 ); }
+		{ $$ = new StatementNode( build_asmstmt( $2, $4, $6, $8 ) ); }
 	| ASM asm_volatile_opt '(' string_literal_list ':' asm_operands_opt ':' asm_operands_opt ':' asm_clobbers_list_opt ')' ';'
-		{ $$ = new AsmStmtNode( StatementNode::Asm, $2, $4, $6, $8, $10 ); }
+		{ $$ = new StatementNode( build_asmstmt( $2, $4, $6, $8, $10 ) ); }
 	| ASM asm_volatile_opt GOTO '(' string_literal_list ':' ':' asm_operands_opt ':' asm_clobbers_list_opt ':' label_list ')' ';'
-	{ $$ = new AsmStmtNode( StatementNode::Asm, $2, $5, 0, $8, $10, $12 ); }
+		{ $$ = new StatementNode( build_asmstmt( $2, $5, 0, $8, $10, $12 ) ); }
 	;
 
@@ -950,12 +958,12 @@
 	asm_operand
 	| asm_operands_list ',' asm_operand
-		{ $$ = (ExpressionNode *)$1->set_link( $3 ); }
+		{ $$ = (ExpressionNode *)$1->set_last( $3 ); }
 	;
 
 asm_operand:											// GCC
 	string_literal_list '(' constant_expression ')'
-		{ $$ = new AsmExprNode( 0, $1, $3 ); }
+		{ $$ = new ExpressionNode( build_asmexpr( 0, $1, $3 ) ); }
 	| '[' constant_expression ']' string_literal_list '(' constant_expression ')'
-		{ $$ = new AsmExprNode( $2, $4, $6 ); }
+	{ $$ = new ExpressionNode( build_asmexpr( $2, $4, $6 ) ); }
 	;
 
@@ -964,14 +972,14 @@
 		{ $$ = 0; }										// use default argument
 	| string_literal_list
-		{ $$ = $1; }
+		{ $$ = new ExpressionNode( $1 ); }
 	| asm_clobbers_list_opt ',' string_literal_list
-		{ $$ = (ConstantNode *)$1->set_link( $3 ); }
+		{ $$ = (ExpressionNode *)$1->set_last( new ExpressionNode( $3 ) ); }
 	;
 
 label_list:
 	no_attr_identifier
-		{ $$ = new LabelNode(); $$->append_label( $1 ); }
+		{ $$ = new LabelNode(); $$->labels.push_back( *$1 ); }
 	| label_list ',' no_attr_identifier
-		{ $$ = $1; $1->append_label( $3 ); }
+		{ $$ = $1; $1->labels.push_back( *$3 ); }
 	;
 
@@ -1489,5 +1497,5 @@
 	| EXTENSION field_declaring_list ';'				// GCC
 		{	// mark all fields in list
-			for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_link() )
+			for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_next() )
 				iter->set_extension( true );
 			$$ = $2;
@@ -1735,7 +1743,7 @@
 	| initializer
 	| designation initializer					{ $$ = $2->set_designators( $1 ); }
-	| initializer_list ',' initializer			{ $$ = (InitializerNode *)( $1->set_link( $3 ) ); }
+	| initializer_list ',' initializer			{ $$ = (InitializerNode *)( $1->set_last( $3 ) ); }
 	| initializer_list ',' designation initializer
-		{ $$ = (InitializerNode *)( $1->set_link( $4->set_designators( $3 ) ) ); }
+		{ $$ = (InitializerNode *)( $1->set_last( $4->set_designators( $3 ) ) ); }
 	;
 
@@ -1753,5 +1761,5 @@
 	designator_list ':'									// C99, CFA uses ":" instead of "="
 	| no_attr_identifier_or_type_name ':'				// GCC, field name
-		{ $$ = new VarRefNode( $1 ); }
+		{ $$ = new ExpressionNode( build_varref( $1 ) ); }
 	;
 
@@ -1759,24 +1767,20 @@
 	designator
 	| designator_list designator
-		{ $$ = (ExpressionNode *)( $1->set_link( $2 )); }
-	//| designator_list designator						{ $$ = new CompositeExprNode( $1, $2 ); }
+		{ $$ = (ExpressionNode *)( $1->set_last( $2 ) ); }
+	//| designator_list designator						{ $$ = new ExpressionNode( $1, $2 ); }
 	;
 
 designator:
-		// lexer ambiguity: designator ".0" is floating-point constant or designator for name 0 only ".0" and ".1"
-		// allowed => semantic check
-	FLOATINGconstant
-		{ $$ = new DesignatorNode( new VarRefNode( $1 ) ); }
-	| '.' no_attr_identifier_or_type_name				// C99, field name
-		{ $$ = new DesignatorNode( new VarRefNode( $2 ) ); }
+	'.' no_attr_identifier_or_type_name					// C99, field name
+		{ $$ = new ExpressionNode( build_varref( $2 ) ); }
 	| '[' push assignment_expression pop ']'			// C99, single array element
 		// assignment_expression used instead of constant_expression because of shift/reduce conflicts with tuple.
-		{ $$ = new DesignatorNode( $3, true ); }
+		{ $$ = $3; }
 	| '[' push subrange pop ']'							// CFA, multiple array elements
-		{ $$ = new DesignatorNode( $3, true ); }
+		{ $$ = $3; }
 	| '[' push constant_expression ELLIPSIS constant_expression pop ']' // GCC, multiple array elements
-		{ $$ = new DesignatorNode( new CompositeExprNode( new OperatorNode( OperatorNode::Range ), $3, $5 ), true ); }
+		{ $$ = new ExpressionNode( build_range( $3, $5 ) ); }
 	| '.' '[' push field_list pop ']'					// CFA, tuple field selector
-		{ $$ = new DesignatorNode( $4 ); }
+		{ $$ = $4; }
 	;
 
@@ -1866,10 +1870,10 @@
 type_name_list:											// CFA
 	type_name
-		{ $$ = new TypeValueNode( $1 ); }
+		{ $$ = new ExpressionNode( build_typevalue( $1 ) ); }
 	| assignment_expression
 	| type_name_list ',' type_name
-		{ $$ = (ExpressionNode *)( $1->set_link( new TypeValueNode( $3 ))); }
+		{ $$ = (ExpressionNode *)( $1->set_last( new ExpressionNode( build_typevalue( $3 ) ) ) ); }
 	| type_name_list ',' assignment_expression
-		{ $$ = (ExpressionNode *)( $1->set_link( $3 )); }
+		{ $$ = (ExpressionNode *)( $1->set_last( $3 )); }
 	;
 
@@ -2009,5 +2013,5 @@
 	| EXTENSION external_definition
 		{	// mark all fields in list
-			for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_link() )
+			for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_next() )
 				iter->set_extension( true );
 			$$ = $2;
@@ -2105,5 +2109,5 @@
 subrange:
 	constant_expression '~' constant_expression			// CFA, integer subrange
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), $1, $3 ); }
+		{ $$ = new ExpressionNode( build_range( $1, $3 ) ); }
 	;
 
Index: src/Parser/parseutility.cc
===================================================================
--- src/Parser/parseutility.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/Parser/parseutility.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:30:39 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat May 16 15:31:33 2015
-// Update Count     : 2
+// Last Modified On : Sun Aug 14 23:45:03 2016
+// Update Count     : 3
 // 
 
@@ -17,4 +17,9 @@
 #include "SynTree/Type.h"
 #include "SynTree/Expression.h"
+
+// rewrite
+//    if ( x ) ...
+// as
+//    if ( (int)(x != 0) ) ...
 
 Expression *notZeroExpr( Expression *orig ) {
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/ResolvExpr/Resolver.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -24,4 +24,5 @@
 #include "SynTree/Initializer.h"
 #include "SymTab/Indexer.h"
+#include "SymTab/Autogen.h"
 #include "Common/utility.h"
 #include "InitTweak/InitTweak.h"
@@ -41,4 +42,5 @@
 
 		virtual void visit( ArrayType * at );
+		virtual void visit( PointerType * at );
 
 		virtual void visit( ExprStmt *exprStmt );
@@ -52,5 +54,4 @@
 		virtual void visit( BranchStmt *branchStmt );
 		virtual void visit( ReturnStmt *returnStmt );
-		virtual void visit( ImplicitCtorDtorStmt * impCtorDtorStmt );
 
 		virtual void visit( SingleInit *singleInit );
@@ -59,4 +60,7 @@
 	  private:
   	typedef std::list< Initializer * >::iterator InitIterator;
+
+		template< typename PtrType >
+		void handlePtrType( PtrType * type );
 
 	  void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & );
@@ -192,13 +196,22 @@
 	}
 
+	template< typename PtrType >
+	void Resolver::handlePtrType( PtrType * type ) {
+		if ( type->get_dimension() ) {
+			CastExpr *castExpr = new CastExpr( type->get_dimension(), SymTab::SizeType->clone() );
+			Expression *newExpr = findSingleExpression( castExpr, *this );
+			delete type->get_dimension();
+			type->set_dimension( newExpr );
+		}
+	}
+
 	void Resolver::visit( ArrayType * at ) {
-		if ( at->get_dimension() ) {
-			BasicType arrayLenType = BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
-			CastExpr *castExpr = new CastExpr( at->get_dimension(), arrayLenType.clone() );
-			Expression *newExpr = findSingleExpression( castExpr, *this );
-			delete at->get_dimension();
-			at->set_dimension( newExpr );
-		}
+		handlePtrType( at );
 		Visitor::visit( at );
+	}
+
+	void Resolver::visit( PointerType * pt ) {
+		handlePtrType( pt );
+		Visitor::visit( pt );
 	}
 
@@ -422,6 +435,6 @@
 
 	void Resolver::visit( ListInit * listInit ) {
-		InitIterator iter = listInit->begin_initializers();
-		InitIterator end = listInit->end_initializers();
+		InitIterator iter = listInit->begin();
+		InitIterator end = listInit->end();
 
 		if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) {
@@ -521,54 +534,19 @@
 		// implicitly generated, there's no way for it to have side effects, so get rid of it
 		// to clean up generated code.
-		if ( InitTweak::isInstrinsicSingleArgCallStmt( ctorInit->get_ctor() ) ) {
+		if ( InitTweak::isIntrinsicSingleArgCallStmt( ctorInit->get_ctor() ) ) {
 			delete ctorInit->get_ctor();
 			ctorInit->set_ctor( NULL );
 		}
-		if ( InitTweak::isInstrinsicSingleArgCallStmt( ctorInit->get_ctor() ) ) {
+
+		// xxx - todo
+		// if ( InitTweak::isIntrinsicCallStmt( ctorInit->get_ctor() ) ) {
+		// 	// can reduce the constructor down to a SingleInit using the
+		// 	// second argument from the ctor call
+		// }
+
+		if ( InitTweak::isIntrinsicSingleArgCallStmt( ctorInit->get_dtor() ) ) {
 			delete ctorInit->get_dtor();
 			ctorInit->set_dtor( NULL );
 		}
-	}
-
-	void Resolver::visit( ImplicitCtorDtorStmt * impCtorDtorStmt ) {
-		// before resolving ctor/dtor, need to remove type qualifiers from the first argument (the object being constructed).
-		// Do this through a cast expression to greatly simplify the code.
-		Expression * callExpr = InitTweak::getCtorDtorCall( impCtorDtorStmt );
-		assert( callExpr );
-		Expression *& constructee = InitTweak::getCallArg( callExpr, 0 );
-		Type * type = 0;
-
-		// need to find the type of the first argument, which is unfortunately not uniform since array construction
-		// includes an untyped '+' expression.
-		if ( UntypedExpr * plusExpr = dynamic_cast< UntypedExpr * >( constructee ) ) {
-			// constructee is <array>+<index>
-			// get Variable <array>, then get the base type of the VariableExpr - this is the type that needs to be fixed
-			Expression * arr = InitTweak::getCallArg( plusExpr, 0 );
-			assert( dynamic_cast< VariableExpr * >( arr ) || dynamic_cast< MemberExpr *>( arr ) );
-			assert( arr && arr->get_results().size() == 1 );
-			type = arr->get_results().front()->clone();
-		} else {
-			// otherwise, constructing a plain object, which means the object's address is being taken.
-			// Need to get the type of the VariableExpr object, because the AddressExpr is rebuilt and uses the
-			// type of the VariableExpr to do so.
-			assert( constructee->get_results().size() == 1 );
-			AddressExpr * addrExpr = dynamic_cast< AddressExpr * > ( constructee );
-			assert( addrExpr && addrExpr->get_results().size() == 1 );
-			type = addrExpr->get_results().front()->clone();
-		}
-		// cast to T* with qualifiers removed.
-		// unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument
-		// must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever
-		// remove lvalue as a qualifier, this can change to
-		//   type->get_qualifiers() = Type::Qualifiers();
-		Type * base = InitTweak::getPointerBase( type );
-		assert( base );
-		base->get_qualifiers() -= Type::Qualifiers(true, true, true, false, true, true);
-		// if pointer has lvalue qualifier, cast won't appear in output
-		type->set_isLvalue( false );
-		constructee = new CastExpr( constructee, type );
-
-		// finally, resolve the ctor/dtor
-		impCtorDtorStmt->get_callStmt()->accept( *this );
 	}
 } // namespace ResolvExpr
Index: src/SymTab/AddVisit.h
===================================================================
--- src/SymTab/AddVisit.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SymTab/AddVisit.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 16:14:32 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:46:33 2016
-// Update Count     : 6
+// Last Modified On : Thu Aug  4 11:22:01 2016
+// Update Count     : 9
 //
 
@@ -33,5 +33,5 @@
 	template< typename Visitor >
 	inline void addVisit(SwitchStmt *switchStmt, Visitor &visitor) {
-		addVisitStatementList( switchStmt->get_branches(), visitor );
+		addVisitStatementList( switchStmt->get_statements(), visitor );
 		maybeAccept( switchStmt->get_condition(), visitor );
 	}
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SymTab/Autogen.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -26,4 +26,6 @@
 
 namespace SymTab {
+	Type * SizeType = 0;
+
 	class AutogenerateRoutines : public Visitor {
 		public:
@@ -59,36 +61,4 @@
 	bool isUnnamedBitfield( ObjectDecl * obj ) {
 		return obj != NULL && obj->get_name() == "" && obj->get_bitfieldWidth() != NULL;
-	}
-
-	template< typename OutputIterator >
-	void makeScalarFunction( Expression *src, ObjectDecl *dstParam, DeclarationWithType *member, std::string fname, OutputIterator out ) {
-		ObjectDecl *obj = dynamic_cast<ObjectDecl *>( member );
-		// unnamed bit fields are not copied as they cannot be accessed
-		if ( isUnnamedBitfield( obj ) ) return;
-
-		// want to be able to generate assignment, ctor, and dtor generically,
-		// so fname is either ?=?, ?{}, or ^?{}
-		UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) );
-
-		UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) );
-		derefExpr->get_args().push_back( new VariableExpr( dstParam ) );
-
-		// do something special for unnamed members
-		Expression *dstselect = new AddressExpr( new MemberExpr( member, derefExpr ) );
-		fExpr->get_args().push_back( dstselect );
-
-		if ( src ) {
-			fExpr->get_args().push_back( src );
-		}
-
-		Statement * callStmt = new ExprStmt( noLabels, fExpr );
-		if ( (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && obj->get_bitfieldWidth() == NULL ) ) ) {
-			// implicitly generated ctor/dtor calls should be wrapped
-			// so that later passes are aware they were generated.
-			// xxx - don't mark as an implicit ctor/dtor if obj is a bitfield,
-			// because this causes the address to be taken at codegen, which is illegal in C.
-			callStmt = new ImplicitCtorDtorStmt( callStmt );
-		}
-		*out++ = callStmt;
 	}
 
@@ -203,14 +173,8 @@
 	}
 
-	void makeStructMemberOp( ObjectDecl * dstParam, Expression * src, DeclarationWithType * field, FunctionDecl * func, TypeSubstitution & genericSubs, bool isGeneric, bool forward = true ) {
-		if ( isGeneric ) {
-			// rewrite member type in terms of the type variables on this operator
-			field = field->clone();
-			genericSubs.apply( field );
-
-			if ( src ) {
-				genericSubs.apply( src );
-			}
-		}
+	void makeStructMemberOp( ObjectDecl * dstParam, Expression * src, DeclarationWithType * field, FunctionDecl * func, TypeSubstitution & genericSubs, bool isDynamicLayout, bool forward = true ) {
+// 		if ( isDynamicLayout && src ) {
+// 			genericSubs.apply( src );
+// 		}
 
 		ObjectDecl * returnVal = NULL;
@@ -219,26 +183,22 @@
 		}
 
+		InitTweak::InitExpander srcParam( src );
+
 		// assign to destination (and return value if generic)
-		if ( ArrayType *array = dynamic_cast< ArrayType * >( field->get_type() ) ) {
-			UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) );
-			derefExpr->get_args().push_back( new VariableExpr( dstParam ) );
-			Expression *dstselect = new MemberExpr( field, derefExpr );
-
-			makeArrayFunction( src, dstselect, array, func->get_name(), back_inserter( func->get_statements()->get_kids() ), forward );
-			if ( isGeneric && returnVal ) {
-				UntypedExpr *derefRet = new UntypedExpr( new NameExpr( "*?" ) );
-				derefRet->get_args().push_back( new VariableExpr( returnVal ) );
-				Expression *retselect = new MemberExpr( field, derefRet );
-
-				makeArrayFunction( src, retselect, array, func->get_name(), back_inserter( func->get_statements()->get_kids() ), forward );
-			}
-		} else {
-			makeScalarFunction( src, dstParam, field, func->get_name(), back_inserter( func->get_statements()->get_kids() ) );
-			if ( isGeneric && returnVal ) makeScalarFunction( src, returnVal, field, func->get_name(), back_inserter( func->get_statements()->get_kids() ) );
+		UntypedExpr *derefExpr = new UntypedExpr( new NameExpr( "*?" ) );
+		derefExpr->get_args().push_back( new VariableExpr( dstParam ) );
+		Expression *dstselect = new MemberExpr( field, derefExpr );
+		genImplicitCall( srcParam, dstselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward );
+
+		if ( isDynamicLayout && returnVal ) {
+			UntypedExpr *derefRet = new UntypedExpr( new NameExpr( "*?" ) );
+			derefRet->get_args().push_back( new VariableExpr( returnVal ) );
+			Expression *retselect = new MemberExpr( field, derefRet );
+			genImplicitCall( srcParam, retselect, func->get_name(), back_inserter( func->get_statements()->get_kids() ), field, forward );
 		} // if
 	}
 
 	template<typename Iterator>
-	void makeStructFunctionBody( Iterator member, Iterator end, FunctionDecl * func, TypeSubstitution & genericSubs, bool isGeneric, bool forward = true ) {
+	void makeStructFunctionBody( Iterator member, Iterator end, FunctionDecl * func, TypeSubstitution & genericSubs, bool isDynamicLayout, bool forward = true ) {
 		for ( ; member != end; ++member ) {
 			if ( DeclarationWithType *field = dynamic_cast< DeclarationWithType * >( *member ) ) { // otherwise some form of type declaration, e.g. Aggregate
@@ -276,5 +236,5 @@
 
 				Expression *srcselect = srcParam ? new MemberExpr( field, new VariableExpr( srcParam ) ) : NULL;
-				makeStructMemberOp( dstParam, srcselect, field, func, genericSubs, isGeneric, forward );
+				makeStructMemberOp( dstParam, srcselect, field, func, genericSubs, isDynamicLayout, forward );
 			} // if
 		} // for
@@ -284,5 +244,5 @@
 	/// void ?{}(A *, int) and void?{}(A *, int, int) for a struct A which has two int fields.
 	template<typename Iterator>
-	void makeStructFieldCtorBody( Iterator member, Iterator end, FunctionDecl * func, TypeSubstitution & genericSubs, bool isGeneric ) {
+	void makeStructFieldCtorBody( Iterator member, Iterator end, FunctionDecl * func, TypeSubstitution & genericSubs, bool isDynamicLayout ) {
 		FunctionType * ftype = func->get_functionType();
 		std::list<DeclarationWithType*> & params = ftype->get_parameters();
@@ -310,9 +270,9 @@
 					// matching parameter, initialize field with copy ctor
 					Expression *srcselect = new VariableExpr(*parameter);
-					makeStructMemberOp( dstParam, srcselect, field, func, genericSubs, isGeneric );
+					makeStructMemberOp( dstParam, srcselect, field, func, genericSubs, isDynamicLayout );
 					++parameter;
 				} else {
 					// no matching parameter, initialize field with default ctor
-					makeStructMemberOp( dstParam, NULL, field, func, genericSubs, isGeneric );
+					makeStructMemberOp( dstParam, NULL, field, func, genericSubs, isDynamicLayout );
 				}
 			}
@@ -324,10 +284,10 @@
 
 		// Make function polymorphic in same parameters as generic struct, if applicable
-		bool isGeneric = false;  // NOTE this flag is an incredibly ugly kludge; we should fix the assignment signature instead (ditto for union)
+		bool isDynamicLayout = false;  // NOTE this flag is an incredibly ugly kludge; we should fix the assignment signature instead (ditto for union)
 		std::list< TypeDecl* >& genericParams = aggregateDecl->get_parameters();
 		std::list< Expression* > structParams;  // List of matching parameters to put on types
 		TypeSubstitution genericSubs; // Substitutions to make to member types of struct
 		for ( std::list< TypeDecl* >::const_iterator param = genericParams.begin(); param != genericParams.end(); ++param ) {
-			isGeneric = true;
+			if ( (*param)->get_kind() == TypeDecl::Any ) isDynamicLayout = true;
 			TypeDecl *typeParam = cloneAndRename( *param, "_autoassign_" + aggregateDecl->get_name() + "_" + (*param)->get_name() );
 			assignType->get_forall().push_back( typeParam );
@@ -389,5 +349,5 @@
 			FunctionDecl * ctor = new FunctionDecl( "?{}", functionNesting > 0 ? DeclarationNode::NoStorageClass : DeclarationNode::Static, LinkageSpec::AutoGen, memCtorType->clone(), new CompoundStmt( noLabels ), true, false );
 			ctor->fixUniqueId();
-			makeStructFieldCtorBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), ctor, genericSubs, isGeneric );
+			makeStructFieldCtorBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), ctor, genericSubs, isDynamicLayout );
 			memCtors.push_back( ctor );
 		}
@@ -395,11 +355,11 @@
 
 		// generate appropriate calls to member ctor, assignment
-		makeStructFunctionBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), assignDecl, genericSubs, isGeneric );
-		makeStructFunctionBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), ctorDecl, genericSubs, isGeneric );
-		makeStructFunctionBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), copyCtorDecl, genericSubs, isGeneric );
+		makeStructFunctionBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), assignDecl, genericSubs, isDynamicLayout );
+		makeStructFunctionBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), ctorDecl, genericSubs, isDynamicLayout );
+		makeStructFunctionBody( aggregateDecl->get_members().begin(), aggregateDecl->get_members().end(), copyCtorDecl, genericSubs, isDynamicLayout );
 		// needs to do everything in reverse, so pass "forward" as false
-		makeStructFunctionBody( aggregateDecl->get_members().rbegin(), aggregateDecl->get_members().rend(), dtorDecl, genericSubs, isGeneric, false );
-
-		if ( ! isGeneric ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );
+		makeStructFunctionBody( aggregateDecl->get_members().rbegin(), aggregateDecl->get_members().rend(), dtorDecl, genericSubs, isDynamicLayout, false );
+
+		if ( ! isDynamicLayout ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );
 
 		declsToAdd.push_back( assignDecl );
@@ -414,9 +374,9 @@
 
 		// Make function polymorphic in same parameters as generic union, if applicable
-		bool isGeneric = false;  // NOTE this flag is an incredibly ugly kludge; we should fix the assignment signature instead (ditto for struct)
+		bool isDynamicLayout = false; // NOTE this flag is an incredibly ugly kludge; we should fix the assignment signature instead (ditto for struct)
 		std::list< TypeDecl* >& genericParams = aggregateDecl->get_parameters();
 		std::list< Expression* > unionParams;  // List of matching parameters to put on types
 		for ( std::list< TypeDecl* >::const_iterator param = genericParams.begin(); param != genericParams.end(); ++param ) {
-			isGeneric = true;
+			if ( (*param)->get_kind() == TypeDecl::Any ) isDynamicLayout = true;
 			TypeDecl *typeParam = cloneAndRename( *param, "_autoassign_" + aggregateDecl->get_name() + "_" + (*param)->get_name() );
 			assignType->get_forall().push_back( typeParam );
@@ -454,7 +414,6 @@
 
 		makeUnionFieldsAssignment( srcParam, dstParam, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) );
-		if ( isGeneric ) makeUnionFieldsAssignment( srcParam, returnVal, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) );
-
-		if ( ! isGeneric ) assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );
+		if ( isDynamicLayout ) makeUnionFieldsAssignment( srcParam, returnVal, cloneWithParams( refType, unionParams ), back_inserter( assignDecl->get_statements()->get_kids() ) );
+		else assignDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );
 
 		// body of assignment and copy ctor is the same
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SymTab/Autogen.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -22,82 +22,160 @@
 #include "SynTree/Declaration.h"
 #include "SynTree/Initializer.h"
+#include "InitTweak/InitTweak.h"
 
 namespace SymTab {
-  /// Generates assignment operators, constructors, and destructor for aggregate types as required
-  void autogenerateRoutines( std::list< Declaration * > &translationUnit );
+	/// Generates assignment operators, constructors, and destructor for aggregate types as required
+	void autogenerateRoutines( std::list< Declaration * > &translationUnit );
 
-  // originally makeArrayAssignment - changed to Function because it is now used for ctors and dtors as well
-  // admittedly not a great name change. This used to live in Validate.cc, but has been moved so it can be reused elsewhere
+	/// returns true if obj's name is the empty string and it has a bitfield width
+	bool isUnnamedBitfield( ObjectDecl * obj );
 
-  /// Store in out a loop which calls fname on each element of the array with srcParam and dstParam as arguments.
-  /// If forward is true, loop goes from 0 to N-1, else N-1 to 0
-  template< typename OutputIterator >
-  void makeArrayFunction( Expression *srcParam, Expression *dstParam, ArrayType *array, std::string fname, OutputIterator out, bool forward = true ) {
-    static UniqueName indexName( "_index" );
+	/// size_t type - set when size_t typedef is seen. Useful in a few places,
+	/// such as in determining array dimension type
+	extern Type * SizeType;
 
-    // for a flexible array member nothing is done -- user must define own assignment
-    if ( ! array->get_dimension() ) return;
+	/// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls.
+	template< typename OutputIterator >
+	Statement * genCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false, bool forward = true );
 
-    Expression * begin, * end, * update, * cmp;
-    if ( forward ) {
-      // generate: for ( int i = 0; i < 0; ++i )
-      begin = new NameExpr( "0" );
-      end = array->get_dimension()->clone();
-      cmp = new NameExpr( "?<?" );
-      update = new NameExpr( "++?" );
-    } else {
-      // generate: for ( int i = N-1; i >= 0; --i )
-      begin = new UntypedExpr( new NameExpr( "?-?" ) );
-      ((UntypedExpr*)begin)->get_args().push_back( array->get_dimension()->clone() );
-      ((UntypedExpr*)begin)->get_args().push_back( new NameExpr( "1" ) );
-      end = new NameExpr( "0" );
-      cmp = new NameExpr( "?>=?" );
-      update = new NameExpr( "--?" );
-    }
+	/// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Should only be called with non-array types.
+	/// optionally returns a statement which must be inserted prior to the containing loop, if there is one
+	template< typename OutputIterator >
+	Statement * genScalarCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false ) {
+		// want to be able to generate assignment, ctor, and dtor generically,
+		// so fname is either ?=?, ?{}, or ^?{}
+		UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) );
 
-    ObjectDecl *index = new ObjectDecl( indexName.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), NULL );
+		// do something special for unnamed members
+		dstParam = new AddressExpr( dstParam );
+		if ( addCast ) {
+			// cast to T* with qualifiers removed, so that qualified objects can be constructed
+			// and destructed with the same functions as non-qualified objects.
+			// unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument
+			// must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever
+			// remove lvalue as a qualifier, this can change to
+			//   type->get_qualifiers() = Type::Qualifiers();
+			assert( type );
+			Type * castType = type->clone();
+			castType->get_qualifiers() -= Type::Qualifiers(true, true, true, false, true, true);
+			castType->set_isLvalue( true ); // xxx - might not need this
+			dstParam = new CastExpr( dstParam, new PointerType( Type::Qualifiers(), castType ) );
+		}
+		fExpr->get_args().push_back( dstParam );
 
-    UntypedExpr *init = new UntypedExpr( new NameExpr( "?=?" ) );
-    init->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) );
-    init->get_args().push_back( begin );
-    index->set_init( new SingleInit( init, std::list<Expression*>() ) );
+		Statement * listInit = srcParam.buildListInit( fExpr );
 
-    UntypedExpr *cond = new UntypedExpr( cmp );
-    cond->get_args().push_back( new VariableExpr( index ) );
-    cond->get_args().push_back( end );
+		std::list< Expression * > args = *++srcParam;
+		fExpr->get_args().splice( fExpr->get_args().end(), args );
 
-    UntypedExpr *inc = new UntypedExpr( update );
-    inc->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) );
+		*out++ = new ExprStmt( noLabels, fExpr );
 
-    // want to be able to generate assignment, ctor, and dtor generically,
-    // so fname is either ?=?, ?{}, or ^?{}
-    UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) );
+		srcParam.clearArrayIndices();
 
-    UntypedExpr *dstIndex = new UntypedExpr( new NameExpr( "?+?" ) );
-    dstIndex->get_args().push_back( dstParam );
-    dstIndex->get_args().push_back( new VariableExpr( index ) );
-    fExpr->get_args().push_back( dstIndex );
+		return listInit;
+	}
 
-    // srcParam is NULL for default ctor/dtor
-    if ( srcParam ) {
-      UntypedExpr *srcIndex = new UntypedExpr( new NameExpr( "?[?]" ) );
-      srcIndex->get_args().push_back( srcParam );
-      srcIndex->get_args().push_back( new VariableExpr( index ) );
-      fExpr->get_args().push_back( srcIndex );
-    }
+	/// Store in out a loop which calls fname on each element of the array with srcParam and dstParam as arguments.
+	/// If forward is true, loop goes from 0 to N-1, else N-1 to 0
+	template< typename OutputIterator >
+	void genArrayCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, ArrayType *array, bool addCast = false, bool forward = true ) {
+		static UniqueName indexName( "_index" );
 
-    std::list<Statement *> initList;
-    CompoundStmt * block = new CompoundStmt( noLabels );
-    block->get_kids().push_back( new DeclStmt( noLabels, index ) );
-    block->get_kids().push_back( new ForStmt( noLabels, initList, cond, inc, new ExprStmt( noLabels, fExpr ) ) );
+		// for a flexible array member nothing is done -- user must define own assignment
+		if ( ! array->get_dimension() ) return ;
 
-    Statement * stmt = block;
-    if ( fname == "?{}" || fname == "^?{}" ) {
-      // implicitly generated ctor/dtor calls should be wrapped
-      // so that later passes are aware they were generated
-      stmt = new ImplicitCtorDtorStmt( stmt );
-    }
-    *out++ = stmt;
-  }
+		Expression * begin, * end, * update, * cmp;
+		if ( forward ) {
+			// generate: for ( int i = 0; i < 0; ++i )
+			begin = new NameExpr( "0" );
+			end = array->get_dimension()->clone();
+			cmp = new NameExpr( "?<?" );
+			update = new NameExpr( "++?" );
+		} else {
+			// generate: for ( int i = N-1; i >= 0; --i )
+			begin = new UntypedExpr( new NameExpr( "?-?" ) );
+			((UntypedExpr*)begin)->get_args().push_back( array->get_dimension()->clone() );
+			((UntypedExpr*)begin)->get_args().push_back( new NameExpr( "1" ) );
+			end = new NameExpr( "0" );
+			cmp = new NameExpr( "?>=?" );
+			update = new NameExpr( "--?" );
+		}
+
+		ObjectDecl *index = new ObjectDecl( indexName.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), NULL );
+
+		UntypedExpr *init = new UntypedExpr( new NameExpr( "?=?" ) );
+		init->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) );
+		init->get_args().push_back( begin );
+		index->set_init( new SingleInit( init, std::list<Expression*>() ) );
+
+		UntypedExpr *cond = new UntypedExpr( cmp );
+		cond->get_args().push_back( new VariableExpr( index ) );
+		cond->get_args().push_back( end );
+
+		UntypedExpr *inc = new UntypedExpr( update );
+		inc->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) );
+
+		UntypedExpr *dstIndex = new UntypedExpr( new NameExpr( "?[?]" ) );
+		dstIndex->get_args().push_back( dstParam );
+		dstIndex->get_args().push_back( new VariableExpr( index ) );
+		dstParam = dstIndex;
+
+		// srcParam must keep track of the array indices to build the
+		// source parameter and/or array list initializer
+		srcParam.addArrayIndex( new VariableExpr( index ), array->get_dimension()->clone() );
+
+		// for stmt's body, eventually containing call
+		CompoundStmt * body = new CompoundStmt( noLabels );
+		Statement * listInit = genCall( srcParam, dstParam, fname, back_inserter( body->get_kids() ), array->get_base(), addCast, forward );
+
+		// block containing for stmt and index variable
+		std::list<Statement *> initList;
+		CompoundStmt * block = new CompoundStmt( noLabels );
+		block->get_kids().push_back( new DeclStmt( noLabels, index ) );
+		if ( listInit ) block->get_kids().push_back( listInit );
+		block->get_kids().push_back( new ForStmt( noLabels, initList, cond, inc, body ) );
+
+		*out++ = block;
+	}
+
+	template< typename OutputIterator >
+	Statement * genCall( InitTweak::InitExpander &  srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast, bool forward ) {
+		if ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) {
+			genArrayCall( srcParam, dstParam, fname, out, at, addCast, forward );
+			return 0;
+		} else {
+			return genScalarCall( srcParam, dstParam, fname, out, type, addCast );
+		}
+	}
+
+	/// inserts into out a generated call expression to function fname with arguments dstParam
+	/// and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls. decl is the
+	/// object being constructed. The function wraps constructor and destructor calls in an
+	/// ImplicitCtorDtorStmt node.
+	template< typename OutputIterator >
+	void genImplicitCall( InitTweak::InitExpander &  srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, DeclarationWithType * decl, bool forward = true ) {
+		ObjectDecl *obj = dynamic_cast<ObjectDecl *>( decl );
+		assert( obj );
+		// unnamed bit fields are not copied as they cannot be accessed
+		if ( isUnnamedBitfield( obj ) ) return;
+
+		bool addCast = (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && obj->get_bitfieldWidth() == NULL ) );
+		std::list< Statement * > stmts;
+		genCall( srcParam, dstParam, fname, back_inserter( stmts ), obj->get_type(), addCast, forward );
+
+		// currently genCall should produce at most one element, but if that changes then the next line needs to be updated to grab the statement which contains the call
+		assert( stmts.size() <= 1 );
+		if ( stmts.size() == 1 ) {
+			Statement * callStmt = stmts.front();
+			if ( addCast ) {
+				// implicitly generated ctor/dtor calls should be wrapped
+				// so that later passes are aware they were generated.
+				// xxx - don't mark as an implicit ctor/dtor if obj is a bitfield,
+				// because this causes the address to be taken at codegen, which is illegal in C.
+				callStmt = new ImplicitCtorDtorStmt( callStmt );
+			}
+			*out++ = callStmt;
+		}
+	}
 } // namespace SymTab
 #endif // AUTOGEN_H
Index: src/SymTab/FixFunction.cc
===================================================================
--- src/SymTab/FixFunction.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SymTab/FixFunction.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// FixFunction.cc -- 
+// FixFunction.cc --
 //
 // Author           : Richard C. Bilson
@@ -44,5 +44,6 @@
 
 	Type * FixFunction::mutate(ArrayType *arrayType) {
-		PointerType *pointerType = new PointerType( arrayType->get_qualifiers(), maybeClone( arrayType->get_base()->clone() ), maybeClone( arrayType->get_dimension() ), arrayType->get_isVarLen(), arrayType->get_isStatic() );
+		// need to recursively mutate the base type in order for multi-dimensional arrays to work.
+		PointerType *pointerType = new PointerType( arrayType->get_qualifiers(), arrayType->get_base()->clone()->acceptMutator( *this ), maybeClone( arrayType->get_dimension() ), arrayType->get_isVarLen(), arrayType->get_isStatic() );
 		delete arrayType;
 		return pointerType;
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SymTab/Validate.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -174,5 +174,5 @@
 
 		virtual void visit( FunctionDecl *funcDecl );
-};
+	};
 
 	class CompoundLiteral : public GenPoly::DeclMutator {
@@ -191,9 +191,9 @@
 		EliminateTypedef::eliminateTypedef( translationUnit );
 		HoistStruct::hoistStruct( translationUnit );
+		autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs Pass1
 		acceptAll( translationUnit, pass1 );
 		acceptAll( translationUnit, pass2 );
 		ReturnChecker::checkFunctionReturns( translationUnit );
-		mutateAll( translationUnit, compoundliteral );
-		autogenerateRoutines( translationUnit );
+		compoundliteral.mutateDeclarationList( translationUnit );
 		acceptAll( translationUnit, pass3 );
 		VerifyCtorDtor::verify( translationUnit );
@@ -490,5 +490,14 @@
 		EliminateTypedef eliminator;
 		mutateAll( translationUnit, eliminator );
+		if ( eliminator.typedefNames.count( "size_t" ) ) {
+			// grab and remember declaration of size_t
+			SizeType = eliminator.typedefNames["size_t"].first->get_base()->clone();
+		} else {
+			// xxx - missing global typedef for size_t - default to long unsigned int, even though that may be wrong
+			// eventually should have a warning for this case.
+			SizeType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
+		}
 		filter( translationUnit, isTypedef, true );
+
 	}
 
@@ -518,4 +527,5 @@
 	Declaration *EliminateTypedef::mutate( TypedefDecl * tyDecl ) {
 		Declaration *ret = Mutator::mutate( tyDecl );
+
 		if ( typedefNames.count( tyDecl->get_name() ) == 1 && typedefNames[ tyDecl->get_name() ].second == scopeLevel ) {
 			// typedef to the same name from the same scope
@@ -541,7 +551,8 @@
 		if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( tyDecl->get_base() ) ) {
 			return new StructDecl( aggDecl->get_name() );
-//			return aggDecl->get_baseStruct();
 		} else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( tyDecl->get_base() ) ) {
 			return new UnionDecl( aggDecl->get_name() );
+		} else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( tyDecl->get_base() ) ) {
+			return new EnumDecl( enumDecl->get_name() );
 		} else {
 			return ret;
Index: src/SynTree/AddStmtVisitor.cc
===================================================================
--- src/SynTree/AddStmtVisitor.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/AddStmtVisitor.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jun 22 12:11:17 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:49:59 2016
-// Update Count     : 12
+// Last Modified On : Thu Aug  4 11:23:47 2016
+// Update Count     : 16
 //
 
@@ -71,5 +71,5 @@
 
 void AddStmtVisitor::visit(SwitchStmt *switchStmt) {
-	visitStatementList( switchStmt->get_branches() );
+	visitStatementList( switchStmt->get_statements() );
 	maybeAccept( switchStmt->get_condition(), *this );
 }
Index: src/SynTree/Declaration.cc
===================================================================
--- src/SynTree/Declaration.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Declaration.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Declaration.cc -- 
+// Declaration.cc --
 //
 // Author           : Richard C. Bilson
@@ -20,4 +20,5 @@
 #include "Initializer.h"
 #include "Type.h"
+#include "Attribute.h"
 #include "Common/utility.h"
 
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Declaration.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -64,5 +64,5 @@
 class DeclarationWithType : public Declaration {
   public:
-	DeclarationWithType( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage );
+	DeclarationWithType( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, const std::list< Attribute * > & attributes );
 	DeclarationWithType( const DeclarationWithType &other );
 	virtual ~DeclarationWithType();
@@ -75,4 +75,7 @@
 	int get_scopeLevel() const { return scopeLevel; }
 	void set_scopeLevel( int newValue ) { scopeLevel = newValue; }
+
+	std::list< Attribute * >& get_attributes() { return attributes; }
+	const std::list< Attribute * >& get_attributes() const { return attributes; }
 
 	virtual DeclarationWithType *clone() const = 0;
@@ -87,4 +90,6 @@
 	// shadowed identifiers can be accessed
 	int scopeLevel = 0;
+
+	std::list< Attribute * > attributes;
 };
 
@@ -92,5 +97,5 @@
 	typedef DeclarationWithType Parent;
   public:
-	ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, Expression *bitfieldWidth, Type *type, Initializer *init, bool isInline = false, bool isNoreturn = false );
+	ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, Expression *bitfieldWidth, Type *type, Initializer *init, const std::list< Attribute * > attributes = std::list< Attribute * >(), bool isInline = false, bool isNoreturn = false );
 	ObjectDecl( const ObjectDecl &other );
 	virtual ~ObjectDecl();
@@ -131,5 +136,4 @@
 	std::list< std::string >& get_oldIdents() { return oldIdents; }
 	std::list< Declaration* >& get_oldDecls() { return oldDecls; }
-	std::list< Attribute * >& get_attributes() { return attributes; }
 
 	virtual FunctionDecl *clone() const { return new FunctionDecl( *this ); }
@@ -143,5 +147,4 @@
 	std::list< std::string > oldIdents;
 	std::list< Declaration* > oldDecls;
-	std::list< Attribute * > attributes;
 };
 
Index: src/SynTree/DeclarationWithType.cc
===================================================================
--- src/SynTree/DeclarationWithType.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/DeclarationWithType.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -16,15 +16,18 @@
 #include "Declaration.h"
 #include "Type.h"
+#include "Attribute.h"
 #include "Common/utility.h"
 
-DeclarationWithType::DeclarationWithType( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage )
-		: Declaration( name, sc, linkage ) {
+DeclarationWithType::DeclarationWithType( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, const std::list< Attribute * > & attributes )
+		: Declaration( name, sc, linkage ), attributes( attributes ) {
 }
 
 DeclarationWithType::DeclarationWithType( const DeclarationWithType &other )
 		: Declaration( other ), mangleName( other.mangleName ), scopeLevel( other.scopeLevel ) {
+	cloneAll( other.attributes, attributes );
 }
 
 DeclarationWithType::~DeclarationWithType() {
+	deleteAll( attributes );
 }
 
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Expression.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun 13 16:03:39 2016
-// Update Count     : 42
+// Last Modified On : Fri Aug  5 14:23:56 2016
+// Update Count     : 49
 //
 
@@ -344,10 +344,11 @@
 }
 
+//// is this right? It's cloning the member, but the member is a declaration so probably shouldn't be cloned...
 MemberExpr::MemberExpr( const MemberExpr &other ) :
-		Expression( other ), member( maybeClone( other.member ) ), aggregate( maybeClone( other.aggregate ) ) {
+		Expression( other ), member( other.member ), aggregate( maybeClone( other.aggregate ) ) {
 }
 
 MemberExpr::~MemberExpr() {
-	delete member;
+	// delete member;
 	delete aggregate;
 }
@@ -528,4 +529,12 @@
 }
 
+RangeExpr::RangeExpr( Expression *low, Expression *high ) : low( low ), high( high ) {}
+RangeExpr::RangeExpr( const RangeExpr &other ) : low( other.low->clone() ), high( other.high->clone() ) {}
+void RangeExpr::print( std::ostream &os, int indent ) const {
+	os << std::string( indent, ' ' ) << "Range Expression: ";
+	low->print( os, indent );
+	os << " ... ";
+	high->print( os, indent );
+}
 
 std::ostream & operator<<( std::ostream & out, Expression * expr ) {
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Expression.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jul  4 14:45:32 2016
-// Update Count     : 23
+// Last Modified On : Sat Aug  6 08:52:53 2016
+// Update Count     : 35
 //
 
@@ -18,4 +18,5 @@
 
 #include <map>
+#include <memory>
 #include "SynTree.h"
 #include "Visitor.h"
@@ -27,5 +28,5 @@
 class Expression {
   public:
-	Expression(Expression *_aname = 0 );
+	Expression( Expression *_aname = nullptr );
 	Expression( const Expression &other );
 	virtual ~Expression();
@@ -69,6 +70,6 @@
 typedef std::map< UniqueId, ParamEntry > InferredParams;
 
-/// ApplicationExpr represents the application of a function to a set of parameters.  This is the
-/// result of running an UntypedExpr through the expression analyzer.
+/// ApplicationExpr represents the application of a function to a set of parameters.  This is the result of running an
+/// UntypedExpr through the expression analyzer.
 class ApplicationExpr : public Expression {
   public:
@@ -92,12 +93,12 @@
 };
 
-/// UntypedExpr represents the application of a function to a set of parameters, but where the
-/// particular overload for the function name has not yet been determined.  Most operators are
-/// converted into functional form automatically, to permit operator overloading.
+/// UntypedExpr represents the application of a function to a set of parameters, but where the particular overload for
+/// the function name has not yet been determined.  Most operators are converted into functional form automatically, to
+/// permit operator overloading.
 class UntypedExpr : public Expression {
   public:
-	UntypedExpr( Expression *function, Expression *_aname = 0 );
+	UntypedExpr( Expression *function, Expression *_aname = nullptr );
 	UntypedExpr( const UntypedExpr &other );
-	UntypedExpr( Expression *function, std::list<Expression *> &args, Expression *_aname = 0 );
+	UntypedExpr( Expression *function, std::list<Expression *> &args, Expression *_aname = nullptr );
 	virtual ~UntypedExpr();
 
@@ -123,5 +124,5 @@
 class NameExpr : public Expression {
   public:
-	NameExpr( std::string name, Expression *_aname = 0 );
+	NameExpr( std::string name, Expression *_aname = nullptr );
 	NameExpr( const NameExpr &other );
 	virtual ~NameExpr();
@@ -144,5 +145,5 @@
 class AddressExpr : public Expression {
   public:
-	AddressExpr( Expression *arg, Expression *_aname = 0 );
+	AddressExpr( Expression *arg, Expression *_aname = nullptr );
 	AddressExpr( const AddressExpr &other );
 	virtual ~AddressExpr();
@@ -180,6 +181,6 @@
 class CastExpr : public Expression {
   public:
-	CastExpr( Expression *arg, Expression *_aname = 0 );
-	CastExpr( Expression *arg, Type *toType, Expression *_aname = 0 );
+	CastExpr( Expression *arg, Expression *_aname = nullptr );
+	CastExpr( Expression *arg, Type *toType, Expression *_aname = nullptr );
 	CastExpr( const CastExpr &other );
 	virtual ~CastExpr();
@@ -199,5 +200,5 @@
 class UntypedMemberExpr : public Expression {
   public:
-	UntypedMemberExpr( std::string member, Expression *aggregate, Expression *_aname = 0 );
+	UntypedMemberExpr( std::string member, Expression *aggregate, Expression *_aname = nullptr );
 	UntypedMemberExpr( const UntypedMemberExpr &other );
 	virtual ~UntypedMemberExpr();
@@ -220,5 +221,5 @@
 class MemberExpr : public Expression {
   public:
-	MemberExpr( DeclarationWithType *member, Expression *aggregate, Expression *_aname = 0 );
+	MemberExpr( DeclarationWithType *member, Expression *aggregate, Expression *_aname = nullptr );
 	MemberExpr( const MemberExpr &other );
 	virtual ~MemberExpr();
@@ -241,5 +242,5 @@
 class VariableExpr : public Expression {
   public:
-	VariableExpr( DeclarationWithType *var, Expression *_aname = 0 );
+	VariableExpr( DeclarationWithType *var, Expression *_aname = nullptr );
 	VariableExpr( const VariableExpr &other );
 	virtual ~VariableExpr();
@@ -259,5 +260,5 @@
 class ConstantExpr : public Expression {
   public:
-	ConstantExpr( Constant constant, Expression *_aname = 0 );
+	ConstantExpr( Constant constant, Expression *_aname = nullptr );
 	ConstantExpr( const ConstantExpr &other );
 	virtual ~ConstantExpr();
@@ -277,7 +278,7 @@
 class SizeofExpr : public Expression {
   public:
-	SizeofExpr( Expression *expr, Expression *_aname = 0 );
+	SizeofExpr( Expression *expr, Expression *_aname = nullptr );
 	SizeofExpr( const SizeofExpr &other );
-	SizeofExpr( Type *type, Expression *_aname = 0 );
+	SizeofExpr( Type *type, Expression *_aname = nullptr );
 	virtual ~SizeofExpr();
 
@@ -302,7 +303,7 @@
 class AlignofExpr : public Expression {
   public:
-	AlignofExpr( Expression *expr, Expression *_aname = 0 );
+	AlignofExpr( Expression *expr, Expression *_aname = nullptr );
 	AlignofExpr( const AlignofExpr &other );
-	AlignofExpr( Type *type, Expression *_aname = 0 );
+	AlignofExpr( Type *type, Expression *_aname = nullptr );
 	virtual ~AlignofExpr();
 
@@ -327,5 +328,5 @@
 class UntypedOffsetofExpr : public Expression {
   public:
-	UntypedOffsetofExpr( Type *type, const std::string &member, Expression *_aname = 0 );
+	UntypedOffsetofExpr( Type *type, const std::string &member, Expression *_aname = nullptr );
 	UntypedOffsetofExpr( const UntypedOffsetofExpr &other );
 	virtual ~UntypedOffsetofExpr();
@@ -348,5 +349,5 @@
 class OffsetofExpr : public Expression {
   public:
-	OffsetofExpr( Type *type, DeclarationWithType *member, Expression *_aname = 0 );
+	OffsetofExpr( Type *type, DeclarationWithType *member, Expression *_aname = nullptr );
 	OffsetofExpr( const OffsetofExpr &other );
 	virtual ~OffsetofExpr();
@@ -389,7 +390,7 @@
 class AttrExpr : public Expression {
   public:
-	AttrExpr(Expression *attr, Expression *expr, Expression *_aname = 0 );
+	AttrExpr(Expression *attr, Expression *expr, Expression *_aname = nullptr );
 	AttrExpr( const AttrExpr &other );
-	AttrExpr( Expression *attr, Type *type, Expression *_aname = 0 );
+	AttrExpr( Expression *attr, Type *type, Expression *_aname = nullptr );
 	virtual ~AttrExpr();
 
@@ -417,5 +418,5 @@
 class LogicalExpr : public Expression {
   public:
-	LogicalExpr( Expression *arg1, Expression *arg2, bool andp = true, Expression *_aname = 0 );
+	LogicalExpr( Expression *arg1, Expression *arg2, bool andp = true, Expression *_aname = nullptr );
 	LogicalExpr( const LogicalExpr &other );
 	virtual ~LogicalExpr();
@@ -440,5 +441,5 @@
 class ConditionalExpr : public Expression {
   public:
-	ConditionalExpr( Expression *arg1, Expression *arg2, Expression *arg3, Expression *_aname = 0 );
+	ConditionalExpr( Expression *arg1, Expression *arg2, Expression *arg3, Expression *_aname = nullptr );
 	ConditionalExpr( const ConditionalExpr &other );
 	virtual ~ConditionalExpr();
@@ -464,5 +465,5 @@
 class CommaExpr : public Expression {
   public:
-	CommaExpr( Expression *arg1, Expression *arg2, Expression *_aname = 0 );
+	CommaExpr( Expression *arg1, Expression *arg2, Expression *_aname = nullptr );
 	CommaExpr( const CommaExpr &other );
 	virtual ~CommaExpr();
@@ -485,5 +486,5 @@
 class TupleExpr : public Expression {
   public:
-	TupleExpr( Expression *_aname = 0 );
+	TupleExpr( Expression *_aname = nullptr );
 	TupleExpr( const TupleExpr &other );
 	virtual ~TupleExpr();
@@ -503,6 +504,6 @@
 class SolvedTupleExpr : public Expression {
   public:
-	SolvedTupleExpr( Expression *_aname = 0 ) : Expression( _aname ) {}
-	SolvedTupleExpr( std::list<Expression *> &, Expression *_aname = 0 );
+	SolvedTupleExpr( Expression *_aname = nullptr ) : Expression( _aname ) {}
+	SolvedTupleExpr( std::list<Expression *> &, Expression *_aname = nullptr );
 	SolvedTupleExpr( const SolvedTupleExpr &other );
 	virtual ~SolvedTupleExpr() {}
@@ -597,5 +598,5 @@
 class UntypedValofExpr : public Expression {
   public:
-	UntypedValofExpr( Statement *_body, Expression *_aname = 0 ) : Expression( _aname ), body ( _body ) {}
+	UntypedValofExpr( Statement *_body, Expression *_aname = nullptr ) : Expression( _aname ), body ( _body ) {}
 	UntypedValofExpr( const UntypedValofExpr & other );
 	virtual ~UntypedValofExpr();
@@ -632,4 +633,22 @@
 	Type * type;
 	Initializer * initializer;
+};
+
+class RangeExpr : public Expression {
+  public:
+	RangeExpr( Expression *low, Expression *high );
+	RangeExpr( const RangeExpr &other );
+
+	Expression * get_low() const { return low; }
+	Expression * get_high() const { return high; }
+	RangeExpr * set_low( Expression *low ) { RangeExpr::low = low; return this; }
+	RangeExpr * set_high( Expression *high ) { RangeExpr::high = high; return this; }
+
+	virtual RangeExpr *clone() const { return new RangeExpr( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+  private:
+	Expression *low, *high;
 };
 
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/FunctionDecl.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -23,5 +23,5 @@
 
 FunctionDecl::FunctionDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, FunctionType *type, CompoundStmt *statements, bool isInline, bool isNoreturn, std::list< Attribute * > attributes )
-		: Parent( name, sc, linkage ), type( type ), statements( statements ), attributes( attributes ) {
+		: Parent( name, sc, linkage, attributes ), type( type ), statements( statements ) {
 	set_isInline( isInline );
 	set_isNoreturn( isNoreturn );
@@ -34,5 +34,4 @@
 FunctionDecl::FunctionDecl( const FunctionDecl &other )
 	: Parent( other ), type( maybeClone( other.type ) ), statements( maybeClone( other.statements ) ) {
-		cloneAll( other.attributes, attributes );
 }
 
@@ -40,5 +39,4 @@
 	delete type;
 	delete statements;
-	deleteAll( attributes );
 }
 
@@ -69,5 +67,5 @@
 	} // if
 
-	printAll( attributes, os, indent );
+	printAll( get_attributes(), os, indent );
 
 	if ( get_storageClass() != DeclarationNode::NoStorageClass ) {
Index: src/SynTree/Initializer.h
===================================================================
--- src/SynTree/Initializer.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Initializer.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -93,6 +93,7 @@
 	std::list<Initializer*> &get_initializers() { return initializers; }
 
-	std::list<Initializer*>::iterator begin_initializers() { return initializers.begin(); }
-	std::list<Initializer*>::iterator end_initializers() { return initializers.end(); }
+	typedef std::list<Initializer*>::iterator iterator;
+	iterator begin() { return initializers.begin(); }
+	iterator end() { return initializers.end(); }
 
 	virtual ListInit *clone() const { return new ListInit( *this ); }
Index: src/SynTree/Label.h
===================================================================
--- src/SynTree/Label.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Label.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -9,7 +9,7 @@
 // Author           : Rob Schluntz
 // Created On       : Wed Jun 8 12:53:12 2016
-// Last Modified By : Rob Schluntz
-// Last Modified On : Wed Jun 8 12:53:28 2016
-// Update Count     : 1
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Sun Aug  7 14:44:29 2016
+// Update Count     : 2
 //
 
@@ -24,5 +24,5 @@
 class Label {
   public:
-	Label( const std::string & name = "", Statement * labelled = 0 ) : name( name ), labelled( labelled ) {}
+	Label( const std::string & name = "", Statement * labelled = 0, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : name( name ), labelled( labelled ), attributes( attributes ) {}
 	Label( const char * name, Statement * labelled = 0 ) : name( name ), labelled( labelled ) {}
 
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Mutator.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:51:19 2016
-// Update Count     : 17
+// Last Modified On : Thu Aug  4 11:23:21 2016
+// Update Count     : 19
 //
 
@@ -126,5 +126,5 @@
 Statement *Mutator::mutate( SwitchStmt *switchStmt ) {
 	switchStmt->set_condition( maybeMutate( switchStmt->get_condition(), *this ) );
-	mutateAll( switchStmt->get_branches(), *this );
+	mutateAll( switchStmt->get_statements(), *this );
 	return switchStmt;
 }
@@ -349,4 +349,10 @@
 	compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) );
 	return compLitExpr;
+}
+
+Expression *Mutator::mutate( RangeExpr *rangeExpr ) {
+	rangeExpr->set_low( maybeMutate( rangeExpr->get_low(), *this ) );
+	rangeExpr->set_high( maybeMutate( rangeExpr->get_high(), *this ) );
+	return rangeExpr;
 }
 
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Mutator.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:51:43 2016
-// Update Count     : 11
+// Last Modified On : Wed Aug  3 16:59:45 2016
+// Update Count     : 12
 //
 #include <cassert>
@@ -78,4 +78,5 @@
 	virtual Expression* mutate( UntypedValofExpr *valofExpr );
 	virtual Expression* mutate( CompoundLiteralExpr *compLitExpr );
+	virtual Expression* mutate( RangeExpr *rangeExpr );
 
 	virtual Type* mutate( VoidType *basicType );
Index: src/SynTree/ObjectDecl.cc
===================================================================
--- src/SynTree/ObjectDecl.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/ObjectDecl.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -18,9 +18,10 @@
 #include "Initializer.h"
 #include "Expression.h"
+#include "Attribute.h"
 #include "Common/utility.h"
 #include "Statement.h"
 
-ObjectDecl::ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, Expression *bitfieldWidth, Type *type, Initializer *init, bool isInline, bool isNoreturn )
-	: Parent( name, sc, linkage ), type( type ), init( init ), bitfieldWidth( bitfieldWidth ) {
+ObjectDecl::ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, Expression *bitfieldWidth, Type *type, Initializer *init, const std::list< Attribute * > attributes, bool isInline, bool isNoreturn )
+	: Parent( name, sc, linkage, attributes ), type( type ), init( init ), bitfieldWidth( bitfieldWidth ) {
 	set_isInline( isInline );
 	set_isNoreturn( isNoreturn );
@@ -45,4 +46,6 @@
 		os << LinkageSpec::toString( get_linkage() ) << " ";
 	} // if
+
+	printAll( get_attributes(), os, indent );
 
 	if ( get_storageClass() != DeclarationNode::NoStorageClass ) {
@@ -80,4 +83,6 @@
 	} // if
 
+	// xxx - should printShort print attributes?
+
 	if ( get_storageClass() != DeclarationNode::NoStorageClass ) {
 		os << DeclarationNode::storageName[ get_storageClass() ] << ' ';
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Statement.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:52:32 2016
-// Update Count     : 55
+// Last Modified On : Fri Aug 12 13:58:48 2016
+// Update Count     : 62
 //
 
@@ -143,19 +143,17 @@
 }
 
-SwitchStmt::SwitchStmt( std::list<Label> _labels, Expression * _condition, std::list<Statement *> &_branches ):
-	Statement( _labels ), condition( _condition ), branches( _branches ) {
+SwitchStmt::SwitchStmt( std::list<Label> _labels, Expression * _condition, std::list<Statement *> &_statements ):
+	Statement( _labels ), condition( _condition ), statements( _statements ) {
 }
 
 SwitchStmt::SwitchStmt( const SwitchStmt & other ):
 	Statement( other ), condition( maybeClone( other.condition ) ) {
-	cloneAll( other.branches, branches );
+	cloneAll( other.statements, statements );
 }
 
 SwitchStmt::~SwitchStmt() {
 	delete condition;
-	// destroy branches
-}
-
-void SwitchStmt::add_case( CaseStmt *c ) {}
+	// destroy statements
+}
 
 void SwitchStmt::print( std::ostream &os, int indent ) const {
@@ -164,10 +162,10 @@
 	os << endl;
 
-	// branches
+	// statements
 	std::list<Statement *>::const_iterator i;
-	for ( i = branches.begin(); i != branches.end(); i++)
+	for ( i = statements.begin(); i != statements.end(); i++)
 		(*i)->print( os, indent + 4 );
 
-	//for_each( branches.begin(), branches.end(), mem_fun( bind1st(&Statement::print ), os ));
+	//for_each( statements.begin(), statements.end(), mem_fun( bind1st(&Statement::print ), os ));
 }
 
@@ -187,6 +185,6 @@
 }
 
-CaseStmt * CaseStmt::makeDefault( std::list<Label> labels, std::list<Statement *> branches ) {
-	return new CaseStmt( labels, 0, branches, true );
+CaseStmt * CaseStmt::makeDefault( std::list<Label> labels, std::list<Statement *> stmts ) {
+	return new CaseStmt( labels, 0, stmts, true );
 }
 
@@ -311,6 +309,6 @@
 }
 
-CatchStmt::CatchStmt( std::list<Label> labels, Declaration *_decl, Statement *_body, bool isCatchRest ) :
-	Statement( labels ), decl ( _decl ), body( _body ), catchRest ( isCatchRest ) {
+CatchStmt::CatchStmt( std::list<Label> labels, Declaration *_decl, Statement *_body, bool catchAny ) :
+	Statement( labels ), decl ( _decl ), body( _body ), catchRest ( catchAny ) {
 }
 
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Statement.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:53:29 2016
-// Update Count     : 47
+// Last Modified On : Fri Aug 12 13:57:46 2016
+// Update Count     : 65
 //
 
@@ -129,5 +129,5 @@
 class SwitchStmt : public Statement {
   public:
-	SwitchStmt( std::list<Label> labels, Expression *condition, std::list<Statement *> &branches );
+	SwitchStmt( std::list<Label> labels, Expression *condition, std::list<Statement *> &statements );
 	SwitchStmt( const SwitchStmt &other );
 	virtual ~SwitchStmt();
@@ -136,6 +136,5 @@
 	void set_condition( Expression *newValue ) { condition = newValue; }
 
-	std::list<Statement *> & get_branches() { return branches; }
-	void add_case( CaseStmt * );
+	std::list<Statement *> & get_statements() { return statements; }
 
 	virtual void accept( Visitor &v ) { v.visit( this ); }
@@ -146,16 +145,14 @@
   private:
 	Expression * condition;
-	std::list<Statement *> branches; // should be list of CaseStmt
+	std::list<Statement *> statements;
 };
 
 class CaseStmt : public Statement {
   public:
-	CaseStmt( std::list<Label> labels, Expression *conditions,
-	      std::list<Statement *> &stmts, bool isdef = false ) throw(SemanticError);
+	CaseStmt( std::list<Label> labels, Expression *conditions, std::list<Statement *> &stmts, bool isdef = false ) throw(SemanticError);
 	CaseStmt( const CaseStmt &other );
 	virtual ~CaseStmt();
 
-	static CaseStmt * makeDefault( std::list<Label> labels = std::list<Label>(),
-		std::list<Statement *> stmts = std::list<Statement *>() );
+	static CaseStmt * makeDefault( std::list<Label> labels = std::list<Label>(), std::list<Statement *> stmts = std::list<Statement *>() );
 
 	bool isDefault() const { return _isDefault; }
@@ -317,5 +314,5 @@
 class CatchStmt : public Statement {
   public:
-	CatchStmt( std::list<Label> labels, Declaration *decl, Statement *body, bool isCatchRest = false );
+	CatchStmt( std::list<Label> labels, Declaration *decl, Statement *body, bool catchAny = false );
 	CatchStmt( const CatchStmt &other );
 	virtual ~CatchStmt();
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/SynTree.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:54:02 2016
-// Update Count     : 6
+// Last Modified On : Wed Aug  3 17:02:34 2016
+// Update Count     : 7
 //
 
@@ -83,4 +83,5 @@
 class UntypedValofExpr;
 class CompoundLiteralExpr;
+class RangeExpr;
 
 class Type;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Visitor.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:54:39 2016
-// Update Count     : 19
+// Last Modified On : Thu Aug  4 11:24:25 2016
+// Update Count     : 21
 //
 
@@ -109,5 +109,5 @@
 void Visitor::visit( SwitchStmt *switchStmt ) {
 	maybeAccept( switchStmt->get_condition(), *this );
-	acceptAll( switchStmt->get_branches(), *this );
+	acceptAll( switchStmt->get_statements(), *this );
 }
 
@@ -296,4 +296,9 @@
 	maybeAccept( compLitExpr->get_type(), *this );
 	maybeAccept( compLitExpr->get_initializer(), *this );
+}
+
+void Visitor::visit( RangeExpr *rangeExpr ) {
+	maybeAccept( rangeExpr->get_low(), *this );
+	maybeAccept( rangeExpr->get_high(), *this );
 }
 
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/SynTree/Visitor.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 17:55:09 2016
-// Update Count     : 8
+// Last Modified On : Wed Aug  3 17:01:50 2016
+// Update Count     : 9
 //
 
@@ -78,4 +78,5 @@
 	virtual void visit( UntypedValofExpr *valofExpr );
 	virtual void visit( CompoundLiteralExpr *compLitExpr );
+	virtual void visit( RangeExpr *rangeExpr );
 
 	virtual void visit( VoidType *basicType );
Index: src/driver/cfa.cc
===================================================================
--- src/driver/cfa.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/driver/cfa.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Tue Aug 20 13:44:49 2002
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul  7 08:56:01 2016
-// Update Count     : 144
+// Last Modified On : Sat Aug  6 16:14:55 2016
+// Update Count     : 148
 //
 
@@ -87,4 +87,5 @@
 	bool cpp_flag = false;								// -E or -M flag, preprocessor only
 	bool std_flag = false;								// -std= flag
+	bool noincstd_flag = false;							// -no-include-stdhdr= flag
 	bool debugging __attribute(( unused )) = false;		// -g flag
 
@@ -144,4 +145,6 @@
 			} else if ( arg == "-nohelp" ) {
 				help = false;							// strip the nohelp flag
+			} else if ( arg == "-no-include-stdhdr" ) {
+				noincstd_flag = true;					// strip the no-include-stdhdr flag
 			} else if ( arg == "-compiler" ) {
 				// use the user specified compiler
@@ -248,6 +251,8 @@
 	args[nargs] = "-I" CFA_INCDIR;
 	nargs += 1;
-	args[nargs] = "-I" CFA_INCDIR "/stdhdr";
-	nargs += 1;
+	if ( ! noincstd_flag ) {							// do not use during build
+		args[nargs] = "-I" CFA_INCDIR "/stdhdr";
+		nargs += 1;
+	} // if
 	args[nargs] = "-I" CFA_INCDIR "/containers";
 	nargs += 1;
Index: c/examples/asm.c
===================================================================
--- src/examples/asm.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ 	(revision )
@@ -1,29 +1,0 @@
-int fred() {
-    int src;
-    int dst;
-
-    asm volatile ( "mov %1, %0\n\t"
-		   "add $1, %0" : : : );
-
-    asm volatile ( "mov %1, %0\n\t"
-		   "add $1, %0"
-		   : "=" "r" (dst));
-
-    asm volatile ( "mov %1, %0\n\t"
-		   "add $1, %0"
-		   : "=r" (dst)
-		   : "r" (src));
-
-    asm ( "mov %1, %0\n\t"
-	  "add $1, %0"
-	  : "=r" (dst), "=r" (src)
-	  : [src] "r" (dst)
-	  : "r0");
-
-  L1: L2:
-    asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5"
-	       : /* No outputs. */
-	       : "r"(src), "r"(&dst)
-	       : "r5", "memory"
-	       : L1, L2 );
-}
Index: src/examples/gc_no_raii/bug-repro/return_template.c
===================================================================
--- src/examples/gc_no_raii/bug-repro/return_template.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/examples/gc_no_raii/bug-repro/return_template.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -5,6 +5,11 @@
 };
 
+forall(otype T) void ?{}(wrap(T)* this);
+forall(otype T) void ?{}(wrap(T)* this, wrap(T)* rhs);
+forall(otype T) void ^?{}(wrap(T)* this);
+forall(otype T) void ?=?(wrap(T)* this, wrap(T)* rhs);
+
 forall(otype T)
-static inline wrap(T) test()
+wrap(T) test()
 {
 	wrap(T) tester;
Index: src/examples/gc_no_raii/src/gc.h
===================================================================
--- src/examples/gc_no_raii/src/gc.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/examples/gc_no_raii/src/gc.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -7,7 +7,15 @@
 static inline gcpointer(T) gcmalloc()
 {
-    gcpointer(T) test;
-    // ctor(&test, gc_allocate(sizeof(T)));
-    // gc_conditional_collect();
-    return test;
+    gcpointer(T) ptr = { gc_allocate(sizeof(T)) };
+    ptr{};
+    gc_conditional_collect();
+    return ptr;
 }
+
+forall(otype T)
+static inline void gcmalloc(gcpointer(T)* ptr)
+{
+	ptr{ gc_allocate(sizeof(T)) };
+      (*ptr){};
+      gc_conditional_collect();
+}
Index: src/examples/gc_no_raii/src/gcpointers.c
===================================================================
--- src/examples/gc_no_raii/src/gcpointers.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/examples/gc_no_raii/src/gcpointers.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -1,5 +1,5 @@
 #include "gcpointers.h"
 
-#include "gc.h"
+// #include "gc.h"
 #include "internal/collector.h"
 #include "internal/object_header.h"
Index: src/examples/gc_no_raii/src/gcpointers.h
===================================================================
--- src/examples/gc_no_raii/src/gcpointers.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/examples/gc_no_raii/src/gcpointers.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,9 +10,9 @@
 };
 
-void gcpointer_ctor(gcpointer_t* this);
-void gcpointer_ctor(gcpointer_t* this, void* address);
-void gcpointer_ctor(gcpointer_t* this, gcpointer_t* other);
-void gcpointer_dtor(gcpointer_t* this);
-gcpointer_t* gcpointer_assign(gcpointer_t* this, gcpointer_t* rhs);
+void ?{}(gcpointer_t* this);
+void ?{}(gcpointer_t* this, void* address);
+void ?{}(gcpointer_t* this, gcpointer_t other);
+void ^?{}(gcpointer_t* this);
+gcpointer_t* ?=?(gcpointer_t this, gcpointer_t rhs);
 
 //Logical operators
@@ -27,60 +27,16 @@
 };
 
-forall(otype T)
-static inline void ctor(gcpointer(T)* this)
-{
-	gcpointer_ctor(&this->internal);
-}
+//
+forall(otype T) void ?{}(gcpointer(T)* this);
+forall(otype T) void ?{}(gcpointer(T)* this, void* address);
+forall(otype T) void ctor(gcpointer(T)* this, void* address);
+forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T)* other);
+forall(otype T) void ^?{}(gcpointer(T)* this);
+forall(otype T) gcpointer(T) ?=?(gcpointer(T) this, gcpointer(T) rhs);
 
-// forall(otype T)
-// static inline void ctor(gcpointer(T)* this, int null)
-// {
-// 	gcpointer_ctor(&this->internal, NULL);
-// }
 
-forall(otype T)
-static inline void ctor(gcpointer(T)* this, void* address)
-{
-	gcpointer_ctor(&this->internal, address);
-}
-
-forall(otype T)
-static inline void ctor(gcpointer(T)* this, gcpointer(T)* other)
-{
-	gcpointer_ctor(&this->internal, other);
-}
-
-forall(otype T)
-static inline void dtor(gcpointer(T)* this)
-{
-	gcpointer_dtor(&this->internal);
-}
-
-forall(otype T)
-static inline gcpointer(T)* ?=?(gcpointer(T)* this, gcpointer(T)* rhs)
-{
-	gcpointer_assign(&this->internal, &rhs->internal);
-	return this;
-}
-
-forall(otype T)
-static inline T *?(gcpointer(T) this)
-{
-	return *(T*)this.internal.ptr;
-}
+forall(otype T) T *?(gcpointer(T) this);
 
 //Logical operators
-forall(otype T)
-static inline int ?!=?(gcpointer(T) this, gcpointer(T) rhs)
-{
-	return this.internal.ptr != rhs.internal.ptr;
-}
-
-forall(otype T)
-static inline int ?==?(gcpointer(T) this, gcpointer(T) rhs)
-{
-	return !(this == rhs);
-}
-
-forall(otype T)
-extern struct gcpointer(T) 0;
+forall(otype T) int ?!=?(gcpointer(T) this, gcpointer(T) rhs);
+forall(otype T) int ?==?(gcpointer(T) this, gcpointer(T) rhs);
Index: src/examples/gc_no_raii/src/internal/memory_pool.h
===================================================================
--- src/examples/gc_no_raii/src/internal/memory_pool.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/examples/gc_no_raii/src/internal/memory_pool.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -3,4 +3,5 @@
 extern "C" {
 #include <stdbool.h>
+#include <stddef.h>
 #include <stdint.h>
 }
Index: src/examples/gc_no_raii/src/internal/state.h
===================================================================
--- src/examples/gc_no_raii/src/internal/state.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/examples/gc_no_raii/src/internal/state.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -1,9 +1,15 @@
 #pragma once
 
+#ifdef __cforall
+extern "C" {
+#endif
 #include <stddef.h>
 #include <stdint.h>
+#ifdef __cforall
+}
+#endif
+#include <vector>
 
 #include "tools.h"
-#include "vector.h"
 
 typedef vector(struct gc_memory_pool*, heap_allocator(struct gc_memory_pool*)) pools_table_t;
Index: src/examples/gc_no_raii/src/tools/worklist.h
===================================================================
--- src/examples/gc_no_raii/src/tools/worklist.h	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/examples/gc_no_raii/src/tools/worklist.h	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,5 +10,5 @@
 #endif
 
-#include "vector.h"
+#include <vector>
 
 typedef vector(intptr_t*, heap_allocator(intptr_t*)) worklist_t;
Index: src/examples/gc_no_raii/test/badlll.c
===================================================================
--- src/examples/gc_no_raii/test/badlll.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/examples/gc_no_raii/test/badlll.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -7,46 +7,50 @@
 };
 
+void ?{}(List_t* this);
+List_t* ?=?(List_t* this, List_t* rhs);
+
 typedef gcpointer(List_t) LLL;
 
 #define MAX (1024 * 1024)
 
-LLL buildLLL(int sz)
+// LLL buildLLL(int sz)
+void bla()
 {
 	int i;
-	LLL ll0, lll, llc;
-
-	ll0 = gcmalloc();
-	ll0->val = 0;
-	lll = ll0;
-
-	for (i = 1; i < sz; i++)
-	{
-		llc = gcmalloc();
-		llc->val = i;
-		lll->next = llc;
-		lll = llc;
-	}
-
-	return ll0;
+	// LLL ll0;//, lll, llc;
+//
+// 	ll0 = gcmalloc();
+// 	ll0->val = 0;
+// 	lll = ll0;
+//
+// 	for (i = 1; i < sz; i++)
+// 	{
+// 		llc = gcmalloc();
+// 		llc->val = i;
+// 		lll->next = llc;
+// 		lll = llc;
+// 	}
+//
+	// return ll0;
 }
-
-void testLLL(LLL lll)
-{
-	unsigned char *counted;
-
-	counted = (unsigned char *) calloc(MAX, sizeof(unsigned char));
-	while (lll)
-	{
-		counted[lll->val]++;
-		if (counted[lll->val] > 1)
-		{
-			fprintf(stderr, "ERROR! Encountered %d twice!\n", lll->val);
-			exit(1);
-		}
-		lll = lll->next;
-	}
-
-	return;
-}
+//
+// void testLLL(LLL lll)
+// {
+// 	unsigned char *counted;
+//
+// 	counted = (unsigned char *) calloc(MAX, sizeof(unsigned char));
+// 	while (lll)
+// 	{
+// 		counted[lll->val]++;
+// 		if (counted[lll->val] > 1)
+// 		{
+// 			fprintf(stderr, "ERROR! Encountered %d twice!\n", lll->val);
+// 			exit(1);
+// 		}
+// 		lll = lll->next;
+// 	}
+//
+// 	return;
+// }
 
 int main(void)
@@ -54,7 +58,7 @@
 	LLL mylll;
 
-	mylll = buildLLL(MAX);
-
-	testLLL(mylll);
+	// mylll = buildLLL(MAX);
+	//
+	// testLLL(mylll);
 
 	return 0;
Index: src/examples/gc_no_raii/test/gctest.c
===================================================================
--- src/examples/gc_no_raii/test/gctest.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/examples/gc_no_raii/test/gctest.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -7,3 +7,8 @@
 int main() {
 	sout | "Bonjour au monde!\n";
+
+	for(int i = 0; i < 1000000; i++) {
+		gcpointer(int) anInt;
+		gcmalloc(&anInt);
+	}
 }
Index: src/libcfa/Makefile.am
===================================================================
--- src/libcfa/Makefile.am	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/libcfa/Makefile.am	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 08:54:01 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Fri Jul  8 23:05:11 2016
-## Update Count     : 192
+## Last Modified On : Thu Aug 11 15:36:32 2016
+## Update Count     : 198
 ###############################################################################
 
@@ -26,14 +26,14 @@
 # create extra forward types/declarations to reduce inclusion of library files
 extras.cf : extras.regx extras.c
-	$(AM_V_GEN)@BACKEND_CC@ @CFA_FLAGS@ -E ${srcdir}/extras.c | grep -f extras.regx > ${srcdir}/extras.cf
+	${AM_V_GEN}@BACKEND_CC@ @CFA_FLAGS@ -E ${srcdir}/extras.c | grep -f extras.regx > ${srcdir}/extras.cf
 
 # create forward declarations for gcc builtins
 builtins.cf : builtins.c
-	$(AM_V_GEN)if [ -e $< ] ; then \
+	${AM_V_GEN}if [ -e $< ] ; then \
 		@BACKEND_CC@ -E -P $^ | sed -e "/targetm/s/.*//" -e "/_Decimal/s/.*//" -e "s/void (const char \*)0();//" -e "s/\"//g" -e "s/\(__builtin_\) /\1/" > $@ ; \
 	fi
 
 builtins.c : builtins.def prototypes.awk
-	$(AM_V_GEN)if [ -e $< ] ; then \
+	${AM_V_GEN}if [ -e $< ] ; then \
 		@BACKEND_CC@ -E prototypes.c | awk -f prototypes.awk > $@ ; \
 	fi
@@ -48,13 +48,13 @@
 
 libcfa-prelude.c : ${srcdir}/prelude.cf ${srcdir}/extras.cf ${srcdir}/builtins.cf
-	$(AM_V_GEN)${abs_top_srcdir}/src/driver/cfa-cpp -l ${srcdir}/prelude.cf $@  # use src/cfa-cpp as not in lib until after install
+	${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -l ${srcdir}/prelude.cf $@  # use src/cfa-cpp as not in lib until after install
 
 libcfa-prelude.o : libcfa-prelude.c
-	 $(AM_V_GEN)@BACKEND_CC@ @CFA_FLAGS@ -c -o $@ $<
+	 ${AM_V_GEN}@BACKEND_CC@ @CFA_FLAGS@ -c -o $@ $<
 
-CFLAGS = -quiet -g -Wall -Wno-unused-function @CFA_FLAGS@ -B${abs_top_srcdir}/src/driver -XCFA -t # TEMPORARY: does not build with -O2
+CFLAGS = -quiet -no-include-stdhdr -g -Wall -Wno-unused-function @CFA_FLAGS@ -B${abs_top_srcdir}/src/driver -XCFA -t # TEMPORARY: does not build with -O2
 CC = ${abs_top_srcdir}/src/driver/cfa
 
-headers = limits stdlib math iostream fstream iterator rational containers/vector
+headers = limits stdlib math iostream fstream iterator rational # containers/vector
 libobjs = ${headers:=.o}
 
@@ -63,5 +63,5 @@
 	@true
 
-${libobjs} : ${abs_top_srcdir}/src/driver/cfa-cpp ${cfalib_DATA}	# add dependency to cfa-cpp so all libraries are rebuilt with new translator
+${libobjs} : ${abs_top_srcdir}/src/driver/cfa-cpp ${cfalib_DATA} # add dependency to cfa-cpp so all libraries are rebuilt with new translator
 
 libcfa_a_SOURCES = libcfa-prelude.c ${headers:=.c}
Index: src/libcfa/Makefile.in
===================================================================
--- src/libcfa/Makefile.in	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/libcfa/Makefile.in	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -89,8 +89,7 @@
 libcfa_a_AR = $(AR) $(ARFLAGS)
 libcfa_a_LIBADD =
-am__dirstamp = $(am__leading_dot)dirstamp
 am__objects_1 = limits.$(OBJEXT) stdlib.$(OBJEXT) math.$(OBJEXT) \
 	iostream.$(OBJEXT) fstream.$(OBJEXT) iterator.$(OBJEXT) \
-	rational.$(OBJEXT) containers/vector.$(OBJEXT)
+	rational.$(OBJEXT)
 am_libcfa_a_OBJECTS = libcfa-prelude.$(OBJEXT) $(am__objects_1)
 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS)
@@ -136,5 +135,5 @@
 CFA_LIBDIR = @CFA_LIBDIR@
 CFA_PREFIX = @CFA_PREFIX@
-CFLAGS = -quiet -g -Wall -Wno-unused-function @CFA_FLAGS@ -B${abs_top_srcdir}/src/driver -XCFA -t # TEMPORARY: does not build with -O2
+CFLAGS = -quiet -no-include-stdhdr -g -Wall -Wno-unused-function @CFA_FLAGS@ -B${abs_top_srcdir}/src/driver -XCFA -t # TEMPORARY: does not build with -O2
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -234,5 +233,5 @@
 cfalib_DATA = builtins.cf extras.cf prelude.cf
 MAINTAINERCLEANFILES = builtins.cf extras.cf ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
-headers = limits stdlib math iostream fstream iterator rational containers/vector
+headers = limits stdlib math iostream fstream iterator rational # containers/vector
 libobjs = ${headers:=.o}
 libcfa_a_SOURCES = libcfa-prelude.c ${headers:=.c}
@@ -304,12 +303,4 @@
 clean-libLIBRARIES:
 	-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
-containers/$(am__dirstamp):
-	@$(MKDIR_P) containers
-	@: > containers/$(am__dirstamp)
-containers/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) containers/$(DEPDIR)
-	@: > containers/$(DEPDIR)/$(am__dirstamp)
-containers/vector.$(OBJEXT): containers/$(am__dirstamp) \
-	containers/$(DEPDIR)/$(am__dirstamp)
 libcfa.a: $(libcfa_a_OBJECTS) $(libcfa_a_DEPENDENCIES) $(EXTRA_libcfa_a_DEPENDENCIES) 
 	$(AM_V_at)-rm -f libcfa.a
@@ -319,5 +310,4 @@
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
-	-rm -f containers/vector.$(OBJEXT)
 
 distclean-compile:
@@ -332,5 +322,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rational.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdlib.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@containers/$(DEPDIR)/vector.Po@am__quote@
 
 .c.o:
@@ -505,6 +494,4 @@
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-	-rm -f containers/$(DEPDIR)/$(am__dirstamp)
-	-rm -f containers/$(am__dirstamp)
 
 maintainer-clean-generic:
@@ -517,5 +504,5 @@
 
 distclean: distclean-am
-	-rm -rf ./$(DEPDIR) containers/$(DEPDIR)
+	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
@@ -563,5 +550,5 @@
 
 maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR) containers/$(DEPDIR)
+	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic \
@@ -603,14 +590,14 @@
 # create extra forward types/declarations to reduce inclusion of library files
 extras.cf : extras.regx extras.c
-	$(AM_V_GEN)@BACKEND_CC@ @CFA_FLAGS@ -E ${srcdir}/extras.c | grep -f extras.regx > ${srcdir}/extras.cf
+	${AM_V_GEN}@BACKEND_CC@ @CFA_FLAGS@ -E ${srcdir}/extras.c | grep -f extras.regx > ${srcdir}/extras.cf
 
 # create forward declarations for gcc builtins
 builtins.cf : builtins.c
-	$(AM_V_GEN)if [ -e $< ] ; then \
+	${AM_V_GEN}if [ -e $< ] ; then \
 		@BACKEND_CC@ -E -P $^ | sed -e "/targetm/s/.*//" -e "/_Decimal/s/.*//" -e "s/void (const char \*)0();//" -e "s/\"//g" -e "s/\(__builtin_\) /\1/" > $@ ; \
 	fi
 
 builtins.c : builtins.def prototypes.awk
-	$(AM_V_GEN)if [ -e $< ] ; then \
+	${AM_V_GEN}if [ -e $< ] ; then \
 		@BACKEND_CC@ -E prototypes.c | awk -f prototypes.awk > $@ ; \
 	fi
@@ -623,8 +610,8 @@
 
 libcfa-prelude.c : ${srcdir}/prelude.cf ${srcdir}/extras.cf ${srcdir}/builtins.cf
-	$(AM_V_GEN)${abs_top_srcdir}/src/driver/cfa-cpp -l ${srcdir}/prelude.cf $@  # use src/cfa-cpp as not in lib until after install
+	${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -l ${srcdir}/prelude.cf $@  # use src/cfa-cpp as not in lib until after install
 
 libcfa-prelude.o : libcfa-prelude.c
-	 $(AM_V_GEN)@BACKEND_CC@ @CFA_FLAGS@ -c -o $@ $<
+	 ${AM_V_GEN}@BACKEND_CC@ @CFA_FLAGS@ -c -o $@ $<
 
 # extensionless header files are overridden by -o flag in default makerule => explicitly override default rule to silently do nothing
@@ -632,5 +619,5 @@
 	@true
 
-${libobjs} : ${abs_top_srcdir}/src/driver/cfa-cpp ${cfalib_DATA}	# add dependency to cfa-cpp so all libraries are rebuilt with new translator
+${libobjs} : ${abs_top_srcdir}/src/driver/cfa-cpp ${cfalib_DATA} # add dependency to cfa-cpp so all libraries are rebuilt with new translator
 
 maintainer-clean-local:
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/main.cc	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,16 +10,12 @@
 // Created On       : Fri May 15 23:12:02 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul  5 15:23:11 2016
-// Update Count     : 209
+// Last Modified On : Mon Aug 15 17:58:57 2016
+// Update Count     : 220
 //
 
 #include <iostream>
 #include <fstream>
-#include <cstdlib>
-#include <cstdio>
 #include <getopt.h>
 #include "Parser/Parser.h"
-#include "Parser/ParseNode.h"
-#include "Parser/LinkageSpec.h"
 #include "SynTree/Declaration.h"
 #include "SynTree/Visitor.h"
@@ -28,4 +24,5 @@
 #include "GenPoly/Box.h"
 #include "GenPoly/CopyParams.h"
+#include "GenPoly/InstantiateGeneric.h"
 #include "CodeGen/Generate.h"
 #include "CodeGen/FixNames.h"
@@ -42,7 +39,4 @@
 #include "InitTweak/GenInit.h"
 #include "InitTweak/FixInit.h"
-#include "InitTweak/FixGlobalInit.h"
-//#include "Explain/GenProlog.h"
-//#include "Try/Visit.h"
 
 #include "Common/SemanticError.h"
@@ -193,5 +187,5 @@
 			input = fopen( argv[ optind ], "r" );
 			if ( ! input ) {
-				std::cout << "Error: can't open " << argv[ optind ] << std::endl;
+				std::cout << "Error: cannot open " << argv[ optind ] << std::endl;
 				exit( EXIT_FAILURE );
 			} // if
@@ -219,5 +213,5 @@
 			FILE * builtins = fopen( libcfap | treep ? "builtins.cf" : CFA_LIBDIR "/builtins.cf", "r" );
 			if ( builtins == NULL ) {
-				std::cerr << "Error: can't open builtins.cf" << std::endl;
+				std::cerr << "Error: cannot open builtins.cf" << std::endl;
 				exit( EXIT_FAILURE );
 			} // if
@@ -227,5 +221,5 @@
 			FILE * extras = fopen( libcfap | treep ? "extras.cf" : CFA_LIBDIR "/extras.cf", "r" );
 			if ( extras == NULL ) {
-				std::cerr << "Error: can't open extras.cf" << std::endl;
+				std::cerr << "Error: cannot open extras.cf" << std::endl;
 				exit( EXIT_FAILURE );
 			} // if
@@ -236,5 +230,5 @@
 				FILE * prelude = fopen( treep ? "prelude.cf" : CFA_LIBDIR "/prelude.cf", "r" );
 				if ( prelude == NULL ) {
-					std::cerr << "Error: can't open prelude.cf" << std::endl;
+					std::cerr << "Error: cannot open prelude.cf" << std::endl;
 					exit( EXIT_FAILURE );
 				} // if
@@ -282,6 +276,4 @@
 		OPTPRINT( "fixNames" )
 		CodeGen::fixNames( translationUnit );
-		OPTPRINT( "fixGlobalInit" );
-		InitTweak::fixGlobalInit( translationUnit, filename, libcfap || treep );
 		OPTPRINT( "tweakInit" )
 		InitTweak::genInit( translationUnit );
@@ -304,7 +296,7 @@
 		}
 
+		// fix ObjectDecl - replaces ConstructorInit nodes
 		OPTPRINT( "fixInit" )
-		// fix ObjectDecl - replaces ConstructorInit nodes
-		InitTweak::fix( translationUnit );
+		InitTweak::fix( translationUnit, filename, libcfap || treep );
 		if ( ctorinitp ) {
 			dump ( translationUnit );
@@ -312,4 +304,6 @@
 		}
 
+		OPTPRINT("instantiateGenerics")
+		GenPoly::instantiateGeneric( translationUnit );
 		OPTPRINT( "copyParams" );
 		GenPoly::copyParams( translationUnit );
@@ -384,6 +378,5 @@
 	std::list< Declaration * > decls;
 	if ( noprotop ) {
-		filter( translationUnit.begin(), translationUnit.end(),
-				std::back_inserter( decls ), notPrelude );
+		filter( translationUnit.begin(), translationUnit.end(), std::back_inserter( decls ), notPrelude );
 	} else {
 		decls = translationUnit;
Index: src/tests/.expect/32/extension.txt
===================================================================
--- src/tests/.expect/32/extension.txt	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/.expect/32/extension.txt	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -100,15 +100,2 @@
     ((void)((__extension__ __a__i_2 , __extension__ __b__i_2) , __extension__ __c__i_2));
 }
-__attribute__ ((constructor(),)) static void _init_extension(void){
-    int _global_init0;
-    ((void)((*((int *)(&__a__i_1)))=_global_init0) /* ?{} */);
-    int _global_init1;
-    ((void)((*((int *)(&__b__i_1)))=_global_init1) /* ?{} */);
-    int _global_init2;
-    ((void)((*((int *)(&__c__i_1)))=_global_init2) /* ?{} */);
-}
-__attribute__ ((destructor(),)) static void _destroy_extension(void){
-    ((void)((*((int *)(&__c__i_1)))) /* ^?{} */);
-    ((void)((*((int *)(&__b__i_1)))) /* ^?{} */);
-    ((void)((*((int *)(&__a__i_1)))) /* ^?{} */);
-}
Index: src/tests/.expect/32/gccExtensions.txt
===================================================================
--- src/tests/.expect/32/gccExtensions.txt	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/.expect/32/gccExtensions.txt	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -5,8 +5,16 @@
 extern void exit(int __status);
 extern int printf(const char *__restrict __format, ...);
+extern int __x__i_1;
 int main(int __argc__i_1, const char **__argv__PPCc_1){
     asm ( "nop" :  :  :  );
     asm ( "nop" :  :  :  );
     asm ( "nop" :  :  :  );
+    static int __y__i_2;
+    int __src__i_2;
+    int __dst__i_2;
+    asm volatile ( "mov %1, %0\n\tadd $1, %0" :  :  :  );
+    asm volatile ( "mov %1, %0\n\tadd $1, %0" : "=r" ( __dst__i_2 ) :  :  );
+    asm volatile ( "mov %1, %0\n\tadd $1, %0" : "=r" ( __dst__i_2 ) : "r" ( __src__i_2 ) :  );
+    asm ( "mov %1, %0\n\tadd $1, %0" : "=r" ( __dst__i_2 ), "=r" ( __src__i_2 ) : [ __src__i_2 ] "r" ( __dst__i_2 ) : "r0" );
     double _Complex __c1__Xd_2;
     double _Complex __c2__Xd_2;
@@ -151,7 +159,7 @@
     struct s4 __y2__3ss4_2;
     ((void)___constructor__F_P3ss4_autogen___2(((struct s4 *)(&__y2__3ss4_2))));
-    int __m1__A0i_2[((long unsigned int )10)];
-    int __m2__A0A0i_2[((long unsigned int )10)][((long unsigned int )10)];
-    int __m3__A0A0i_2[((long unsigned int )10)][((long unsigned int )10)];
+    int __m1__A0i_2[((unsigned int )10)];
+    int __m2__A0A0i_2[((unsigned int )10)][((unsigned int )10)];
+    int __m3__A0A0i_2[((unsigned int )10)][((unsigned int )10)];
     int _retVal0 = { 0 };
     ((void)(_retVal0=0) /* ?{} */);
Index: src/tests/.expect/64/extension.txt
===================================================================
--- src/tests/.expect/64/extension.txt	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/.expect/64/extension.txt	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -100,15 +100,2 @@
     ((void)((__extension__ __a__i_2 , __extension__ __b__i_2) , __extension__ __c__i_2));
 }
-__attribute__ ((constructor(),)) static void _init_extension(void){
-    int _global_init0;
-    ((void)((*((int *)(&__a__i_1)))=_global_init0) /* ?{} */);
-    int _global_init1;
-    ((void)((*((int *)(&__b__i_1)))=_global_init1) /* ?{} */);
-    int _global_init2;
-    ((void)((*((int *)(&__c__i_1)))=_global_init2) /* ?{} */);
-}
-__attribute__ ((destructor(),)) static void _destroy_extension(void){
-    ((void)((*((int *)(&__c__i_1)))) /* ^?{} */);
-    ((void)((*((int *)(&__b__i_1)))) /* ^?{} */);
-    ((void)((*((int *)(&__a__i_1)))) /* ^?{} */);
-}
Index: src/tests/.expect/64/gccExtensions.txt
===================================================================
--- src/tests/.expect/64/gccExtensions.txt	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/.expect/64/gccExtensions.txt	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -5,8 +5,17 @@
 extern void exit(int __status);
 extern int printf(const char *__restrict __format, ...);
+extern int __x__i_1;
 int main(int __argc__i_1, const char **__argv__PPCc_1){
     asm ( "nop" :  :  :  );
     asm ( "nop" :  :  :  );
     asm ( "nop" :  :  :  );
+    static int __y__i_2;
+    int __src__i_2;
+    int __dst__i_2;
+    asm volatile ( "mov %1, %0\n\tadd $1, %0" :  :  :  );
+    asm volatile ( "mov %1, %0\n\tadd $1, %0" : "=r" ( __dst__i_2 ) :  :  );
+    asm volatile ( "mov %1, %0\n\tadd $1, %0" : "=r" ( __dst__i_2 ) : "r" ( __src__i_2 ) :  );
+    asm ( "mov %1, %0\n\tadd $1, %0" : "=r" ( __dst__i_2 ), "=r" ( __src__i_2 ) : [ __src__i_2 ] "r" ( __dst__i_2 ) : "r0" );
+    L2: L1: asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5" :  : "r" ( __src__i_2 ), "r" ( (&__dst__i_2) ) : "r5", "memory" : L1, L2 );
     double _Complex __c1__Xd_2;
     double _Complex __c2__Xd_2;
Index: c/tests/.expect/libcfa_vector.txt
===================================================================
--- src/tests/.expect/libcfa_vector.txt	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ 	(revision )
@@ -1,5 +1,0 @@
-0
-1
-2
-3
-0
Index: src/tests/.expect/multiDimension.txt
===================================================================
--- src/tests/.expect/multiDimension.txt	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
+++ src/tests/.expect/multiDimension.txt	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -0,0 +1,304 @@
+constructing with 1
+constructing with 2
+constructing with 3
+constructing with 4
+constructing with 5
+constructing with 6
+constructing with 7
+constructing with 8
+constructing with 9
+constructing with 10
+constructing with 1
+constructing with 2
+constructing with 3
+constructing with 4
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+constructing with 1234567
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+constructing with 1
+constructing with 2
+constructing with 3
+constructing with 4
+constructing with 5
+constructing with 6
+constructing with 7
+constructing with 8
+constructing with 9
+constructing with 0
+constructing with 0
+constructing with 0
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+default constructing
+constructing with 999
+constructing with 1111
+default constructing
+default constructing
+constructing with 1
+constructing with 2
+constructing with 3
+constructing with 4
+default constructing
+default constructing
+default constructing
+default constructing
+constructing with 0
+default constructing
+default constructing
+default constructing
+constructing with 11
+constructing with 22
+constructing with 33
+constructing with 55
+constructing with 66
+default constructing
+constructing with 77
+default constructing
+default constructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
+destructing
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/Makefile.am	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Sat Jul  9 11:23:24 2016
-## Update Count     : 35
+## Last Modified On : Mon Aug 15 12:24:54 2016
+## Update Count     : 39
 ###############################################################################
 
@@ -27,14 +27,14 @@
 
 all-local :
-	+python test.py vector_test avl_test operators numericConstants expression enum asmName array typeof cast dtor-early-exit init_once
+	@+python test.py vector_test avl_test operators numericConstants expression enum array typeof cast dtor-early-exit init_once
 
 all-tests :
-	+python test.py --all
+	@+python test.py --all		# '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
 
 clean-local :
-	-rm -f ${EXTRA_PROGRAMS}
+	rm -f ${EXTRA_PROGRAMS}
 
 list :
-	+python test.py --list
+	@+python test.py --list
 
 constant0-1DP : constant0-1.c
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/Makefile.in	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -635,14 +635,14 @@
 
 all-local :
-	+python test.py vector_test avl_test operators numericConstants expression enum asmName array typeof cast dtor-early-exit init_once
+	@+python test.py vector_test avl_test operators numericConstants expression enum array typeof cast dtor-early-exit init_once
 
 all-tests :
-	+python test.py --all
+	@+python test.py --all		# '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
 
 clean-local :
-	-rm -f ${EXTRA_PROGRAMS}
+	rm -f ${EXTRA_PROGRAMS}
 
 list :
-	+python test.py --list
+	@+python test.py --list
 
 constant0-1DP : constant0-1.c
Index: c/tests/asmName.c
===================================================================
--- src/tests/asmName.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ 	(revision )
@@ -1,16 +1,0 @@
-//Testing assembly declaration
-extern int x asm( "xx" );
-
-int fred( int x ) {
-    static int y asm( "yy" );
-
-// Cforall extensions
-
-    static * int z asm( "zz" );
-}
-
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
Index: src/tests/exception.c
===================================================================
--- src/tests/exception.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/exception.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -11,5 +11,5 @@
 	x/4;
     } catch( int ) {
-    } catch( int x ) {
+    } catch( float x ) {
     } catch( struct { int i; } ) {
     } catch( struct { int i; } x ) {
@@ -21,5 +21,5 @@
     } catch( * struct { int i; } x ) {
     } catch( ... ) {
-//    } finally {
+    } finally {
     } // try
 }
Index: src/tests/gccExtensions.c
===================================================================
--- src/tests/gccExtensions.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/gccExtensions.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -1,6 +1,54 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// gccExtensions.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Sun Aug 14 17:28:17 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Aug 15 12:44:35 2016
+// Update Count     : 5
+// 
+
+extern int x asm( "xx" );
+
 int main(int argc, char const *argv[]) {
 	asm( "nop" );
 	__asm( "nop" );
 	__asm__( "nop" );
+
+	static int y asm( "yy" );
+//	static * int z asm( "zz" );							// CFA declaration
+
+	int src;
+	int dst;
+
+	asm volatile ( "mov %1, %0\n\t"
+				   "add $1, %0" : : : );
+
+	asm volatile ( "mov %1, %0\n\t"
+				   "add $1, %0"
+				   : "=" "r" (dst));
+
+	asm volatile ( "mov %1, %0\n\t"
+				   "add $1, %0"
+				   : "=r" (dst)
+				   : "r" (src));
+
+	asm ( "mov %1, %0\n\t"
+		  "add $1, %0"
+		  : "=r" (dst), "=r" (src)
+		  : [src] "r" (dst)
+		  : "r0");
+
+  L1: L2:
+	asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5"
+			   : /* No outputs. */
+			   : "r"(src), "r"(&dst)
+			   : "r5", "memory"
+			   : L1, L2 );
 
 	__complex__ c1;
@@ -57,2 +105,7 @@
 	return 0;
 }
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa gccExtensions.c" //
+// End: //
Index: src/tests/init_once.c
===================================================================
--- src/tests/init_once.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/init_once.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -92,4 +92,8 @@
 init_once y = x;
 
+void static_variable() {
+	static init_once x;
+}
+
 int main() {
 	// local variables
@@ -179,4 +183,9 @@
 		}
 	}
+
+	// function-scoped static variable
+	for (int i = 0; i < 10; i++) {
+		static_variable();
+	}
 }
 
Index: src/tests/labelledExit.c
===================================================================
--- src/tests/labelledExit.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/labelledExit.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -1,2 +1,17 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// labelledExit.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug 10 07:29:39 2016
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Wed Aug 10 07:30:15 2016
+// Update Count     : 1
+// 
+
 int foo() {
   	int i;
@@ -136,14 +151,12 @@
 	else
 		i += 1;
-
 }
 
-int main(int argc, char const *argv[]) {
+int main( int argc, char const *argv[] ) {
 	/* code */
-	return 0;
 }
 
 // Local Variables: //
 // tab-width: 4 //
-// compile-command: "cfa LabelledExit.c" //
+// compile-command: "cfa labelledExit.c" //
 // End: //
Index: src/tests/multiDimension.c
===================================================================
--- src/tests/multiDimension.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
+++ src/tests/multiDimension.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -0,0 +1,72 @@
+struct X {
+  int a;
+  int * ptr;
+};
+
+void ?{}(X * this) {
+  printf("default constructing\n");
+  (&this->a){ 123 };
+  this->ptr = malloc(sizeof(int));
+}
+
+void ?{}(X * this, X other) {
+  printf("copy constructing\n");
+  (&this->a){ other.a };
+  this->ptr = malloc(sizeof(int));
+}
+
+void ?{}(X * this, int a) {
+  printf("constructing with %d\n", a);
+  (&this->a){ a };
+  this->ptr = malloc(sizeof(int));
+}
+
+void ^?{}(X * this) {
+  printf("destructing\n");
+  free(this->ptr);
+}
+
+X ?=?(X * this, X other) {
+  this->a = other.a;
+  return *this;
+}
+
+X global[10][10] = {
+  { 1, { 2 }, { 3 }, { 4 }, 5, 6, 7, 8, 9, 10, 11, 12 },
+  { 1, 2, 3, 4 },
+  { { 1234567 } }
+};
+
+X global2[3][3][3] = {
+  {
+    { 1, 2, 3 },
+    { 4, 5, 6 },
+    { 7, 8, 9 },
+    { 10, 11, 12 }
+  },
+  {
+    { 0, 0, 0 }
+  }
+};
+
+int foo() {
+  static X abc[3][3] = {
+    { 11, 22, 33, 44 },
+    { 55, 66 },
+    { 77 },
+    { 88, 99, 1010 }
+  };
+}
+
+int main() {
+  X abc[4][4] = {
+    { 999, 1111 },
+    { 1, 2, 3, 4, 5 },
+    {},
+    { 0 },
+    { 88 }
+  };
+
+  foo();
+  foo();
+}
Index: src/tests/switch.c
===================================================================
--- src/tests/switch.c	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/switch.c	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jul 12 06:50:22 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 18:02:23 2016
-// Update Count     : 22
+// Last Modified On : Thu Aug  4 11:44:29 2016
+// Update Count     : 31
 // 
 
@@ -33,11 +33,19 @@
 	} // switch
 
-	// switch (3 ) {
-	// 	int j;
-	//   case 3:
-	// 	break;
-	//   case 4:
-	// 	j = 0;
-	// }
+	switch ( 3 ) {
+		int j;
+	  case 3:
+		break;
+	  case 4:
+		j = 0;
+	}
+
+	switch ( i ) {
+	  case 1, 2, 3:
+		switch ( i ) {
+		  case 2, 3, 4:
+			7;
+		}
+	}
 
 	switch ( i ) {
@@ -49,8 +57,8 @@
 	  default:
 		i = 3;
-	  case 3:
+	  case 19:
 	  case 'A' ... 'Z':
-	  case 5 ... 6:
-	  case 2, 4:
+	  case 1 ... 6:
+	  case 20, 30:
 		j = 3;
 		f( 3 );
@@ -78,8 +86,8 @@
 		struct S { int i; };
 		S s;
-	  case 3:
+	  case 19:
 	  case 'A' ... 'Z':
-	  case 5 ... 6:
-	  case 2, 4, 7:
+	  case 0 ... 6:
+	  case 20, 30, 40:
 		i = 3;
 		f( 3 );
Index: src/tests/test.py
===================================================================
--- src/tests/test.py	(revision 950f7a72ccf248faed22f2bbd0d7542e24948798)
+++ src/tests/test.py	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -23,8 +23,10 @@
 # parses the Makefile to find the machine type (32-bit / 64-bit)
 def getMachineType():
-	with open('Makefile') as file:
-		makefile = file.read()
-		m = re.search("CFA_FLAGS\s*=\s*-m(.*)", makefile)
-		return m.group(1) if m else '64'
+	sh('echo "int main() { return 0; }" > .dummy.c')
+	sh("make .dummy", print2stdout=False)
+	_, out = sh("file .dummy", print2stdout=False)
+	sh("rm -f .dummy.c > /dev/null 2>&1")
+	sh("rm -f .dummy > /dev/null 2>&1")
+	return re.search("ELF\s([0-9]+)-bit", out).group(1)
 
 # reads the directory ./.expect and indentifies the tests
@@ -97,9 +99,4 @@
 		return False
 
-# find the test data for a given test name
-def filterTests(testname) :
-	found = [test for test in allTests if test.name == testname]
-	return (found[0] if len(found) == 1 else Test(testname, testname) )
-
 ################################################################################
 #               running test functions
@@ -139,5 +136,5 @@
 		if not dry_run and fileContainsOnly(out_file, "make: *** No rule to make target `%s'.  Stop." % test.name) :
 			retcode = 1;
-			error = "\t\tNo make target for test %s!" % test
+			error = "\t\tNo make target for test %s!" % test.name
 			sh("rm %s" % out_file, False)
 
@@ -250,5 +247,10 @@
 	# already existing tests and create new info for the new tests
 	if options.regenerate_expected :
-		tests = map(filterTests, options.tests)
+		for testname in options.tests :
+			if testname.endswith(".c") or testname.endswith(".cc") or testname.endswith(".cpp") :
+				print('ERROR: "%s", tests are not allowed to end with a C/C++/CFA extension, ignoring it' % testname, file=sys.stderr)
+			else :
+				found = [test for test in allTests if test.name == testname]
+				tests.append( found[0] if len(found) == 1 else Test(testname, testname) )
 
 	else :
