Release coccinelle-0.1.7
authorCoccinelle <cocci@diku.dk>
Sun, 3 Oct 2010 11:57:49 +0000 (13:57 +0200)
committerRene Rydhof Hansen <rrh@cs.aau.dk>
Sun, 3 Oct 2010 11:57:49 +0000 (13:57 +0200)
** Language:
   - initialize and finalize script code, cf demos/initial_final.cocci

** Features:
   - -iso_limit option to limit the depth of isomorphism application
   - with the dir option, the include path is implicitly set to the "include"
     subdirectory of the specified directory, if the option -I is not used.
   - give a seed for the name of a fresh identifier
   - better handling of cpp "constructed" identifiers as in a##b, that in
     the futur will make it easier to match over those idents.
     cf tests/pb_parsing_macro.c. Thanks to Ali-Erdem Ozcan for pointing
     out the problem. A new "parsing hack hint" is also available:
     YACFE_IDENT_BUILDER, cf standard.h.

** Bugfix:
   - drop excessive "optimization" in ctl generation for while and for loops
   - allow . as the name of the directory
   - for type inference for an assignment, take the type of the right-hand
     side expression, not the type of the assigned variable
   - allow for with a declartion in the first header element, as in C++
     (partial support)
   - allow for matching against variable declarations that include only
     storage, eg static, but no type at all.
   - allow for matching against types that contain both short/long and int
   - allow the type metavariable in the SmPL code "unsigned T" to match a T
     that is a type consisting of more than one word, eg long int.
   - -ifdef_to_if option made to process nested ifdefs
     (partial support)

** Internals:
   - improve and fix installation process (usable on BSD)
   - improve and fix testing process
   - apply patches from Eugeniy Meshcheryakov
   - reorganize the way we parse C identifiers, especially concatenated cpp
     identifiers as in a##b. This may lead to some regressions as we may
     not parse as much code as before.
   - removed popl/ and popl09/ and popl related stuff from official distrib.

201 files changed:
.depend [deleted file]
Makefile
bugs.txt
changes.txt
cocci.ml
cocci.mli
commitmsg
commons/.depend [deleted file]
commons/Makefile
commons/authors.txt
commons/common.ml
commons/common.mli
commons/features.ml.cpp [new file with mode: 0644]
commons/ocollection/oassocb.ml
commons/oset.ml
commons/readme.txt [new file with mode: 0644]
commons/seti.ml
commons/sexp_common.ml [new file with mode: 0644]
configure
credits.txt
ctl/Makefile
demos/initial_final.cocci [new file with mode: 0644]
docs/Makefile [new file with mode: 0644]
docs/SmPL-ver2-tutorial-ols07.pdf [deleted file]
docs/SmPL-with-grammar-ercim-evos06.pdf [deleted file]
docs/grammar/cocci_syntax.pdf [new file with mode: 0644]
docs/grammar/cocci_syntax.tex
docs/grammar/grammar.tex
docs/options.pdf
docs/options.tex
docs/semantic-patches-for-collateral-evolutions.ppt [deleted file]
docs/semantic-patches-talk-ols07.odp [deleted file]
docs/semantic-patches-talk-ols07.ppt [deleted file]
engine/.depend [deleted file]
engine/Makefile
engine/asttoctl2.ml
engine/asttomember.ml
engine/c_vs_c.ml
engine/cocci_vs_c.ml
engine/ctlcocci_integration.ml
engine/pattern_c.ml
engine/postprocess_transinfo.ml
engine/transformation_c.ml
extra/.depend [deleted file]
extra/Makefile
extra/kbuild.ml
extra/maintainers.ml
flag_cocci.ml
globals/.depend [deleted file]
globals/Makefile
globals/config.ml.in [moved from globals/config.ml with 90% similarity]
install.txt
main.ml
menhirlib/.depend [deleted file]
menhirlib/Makefile
ocamlsexp/Makefile [new file with mode: 0644]
ocamlsexp/conv.ml [new file with mode: 0644]
ocamlsexp/conv.mli [new file with mode: 0644]
ocamlsexp/conv_error.ml [new file with mode: 0644]
ocamlsexp/copyright.txt [new file with mode: 0644]
ocamlsexp/lexer.mll [new file with mode: 0644]
ocamlsexp/license-tywith.txt [new file with mode: 0644]
ocamlsexp/license.txt [new file with mode: 0644]
ocamlsexp/modif-orig.txt [new file with mode: 0644]
ocamlsexp/parser.mly [new file with mode: 0644]
ocamlsexp/path.ml [new file with mode: 0644]
ocamlsexp/path.mli [new file with mode: 0644]
ocamlsexp/pre_sexp.ml [new file with mode: 0644]
ocamlsexp/sexp.ml [new file with mode: 0644]
ocamlsexp/sexp.mli [new file with mode: 0644]
ocamlsexp/sexp_intf.ml [new file with mode: 0644]
ocamlsexp/type.ml [new file with mode: 0644]
parsing_c/.depend [deleted file]
parsing_c/Makefile
parsing_c/ast_c.ml
parsing_c/ast_to_flow.ml
parsing_c/comment_annotater_c.ml
parsing_c/compare_c.ml
parsing_c/control_flow_c.ml
parsing_c/control_flow_c.mli
parsing_c/cpp_ast_c.ml
parsing_c/lexer_c.mll
parsing_c/lib_parsing_c.ml
parsing_c/parse_c.ml
parsing_c/parser_c.mly
parsing_c/parsing_hacks.ml
parsing_c/parsing_hacks.mli
parsing_c/pretty_print_c.ml
parsing_c/test_parsing_c.ml
parsing_c/token_helpers.ml
parsing_c/type_annoter_c.ml
parsing_c/type_annoter_c.mli
parsing_c/type_c.ml
parsing_c/unparse_c.ml
parsing_c/unparse_cocci.ml
parsing_c/unparse_hrule.ml
parsing_c/visitor_c.ml
parsing_c/visitor_c.mli
parsing_cocci/.depend
parsing_cocci/Makefile
parsing_cocci/adjust_pragmas.ml
parsing_cocci/ast0_cocci.ml
parsing_cocci/ast0_cocci.mli
parsing_cocci/ast0toast.ml
parsing_cocci/ast_cocci.ml
parsing_cocci/ast_cocci.mli
parsing_cocci/check_meta.ml
parsing_cocci/comm_assoc.ml
parsing_cocci/context_neg.ml
parsing_cocci/data.ml
parsing_cocci/data.mli
parsing_cocci/disjdistr.ml
parsing_cocci/flag_parsing_cocci.ml
parsing_cocci/free_vars.ml
parsing_cocci/function_prototypes.ml
parsing_cocci/get_constants.ml
parsing_cocci/get_constants2.ml
parsing_cocci/insert_plus.ml
parsing_cocci/iso_compile.ml
parsing_cocci/iso_pattern.ml
parsing_cocci/iso_pattern.mli
parsing_cocci/lexer_cocci.mll
parsing_cocci/parse_aux.ml
parsing_cocci/parse_cocci.ml
parsing_cocci/parser_cocci_menhir.ml
parsing_cocci/parser_cocci_menhir.mli
parsing_cocci/parser_cocci_menhir.mly
parsing_cocci/pretty_print_cocci.ml
parsing_cocci/simple_assignments.ml
parsing_cocci/single_statement.ml
parsing_cocci/test_exps.ml
parsing_cocci/type_infer.ml
parsing_cocci/unitary_ast0.ml
parsing_cocci/visitor_ast.ml
parsing_cocci/visitor_ast0.ml
parsing_cocci/visitor_ast0.mli
parsing_cocci/visitor_ast0_types.ml [new file with mode: 0644]
popl/Makefile [deleted file]
popl/ast_popl.ml [deleted file]
popl/asttopopl.ml [deleted file]
popl/asttopopl.mli [deleted file]
popl/insert_befaft.ml [deleted file]
popl/insert_befaft.mli [deleted file]
popl/insert_quantifiers.ml [deleted file]
popl/insert_quantifiers.mli [deleted file]
popl/popl.ml [deleted file]
popl/popl.mli [deleted file]
popl/popltoctl.ml [deleted file]
popl/popltoctl.mli [deleted file]
popl/pretty_print_popl.ml [deleted file]
popl/pretty_print_popl.mli [deleted file]
popl09/.depend [deleted file]
popl09/Makefile [deleted file]
popl09/ast_popl.ml [deleted file]
popl09/asttopopl.ml [deleted file]
popl09/asttopopl.mli [deleted file]
popl09/flag_popl.ml [deleted file]
popl09/insert_quantifiers.ml [deleted file]
popl09/insert_quantifiers.mli [deleted file]
popl09/popl.ml [deleted file]
popl09/popl.mli [deleted file]
popl09/popltoctl.ml [deleted file]
popl09/popltoctl.mli [deleted file]
popl09/pretty_print_popl.ml [deleted file]
popl09/pretty_print_popl.mli [deleted file]
pycaml/Makefile
python/.depend
python/Makefile
python/coccilib/Makefile
python/coccilib/output.py [deleted symlink]
python/coccilib/output_base.py
python/coccilib/output_gui.py [new file with mode: 0644]
python/no_pycocci_aux.ml
python/pycocci.ml [deleted symlink]
python/pycocci_aux.ml [deleted symlink]
python/yes_pycocci.ml
readme.txt
scripts/spatch.sh
standard.h
testing.ml
tests/SCORE_expected.sexp [new file with mode: 0644]
tests/a_and_e.c [moved from tests/A_and_E.c with 100% similarity]
tests/a_and_e.cocci [moved from tests/A_and_E.cocci with 100% similarity]
tests/a_and_e.res [moved from tests/A_and_E.res with 100% similarity]
tests/a_and_e_ver1.c [moved from tests/A_and_E_ver1.c with 100% similarity]
tests/a_and_e_ver1.res [moved from tests/A_and_E_ver1.res with 100% similarity]
tests/bugon.cocci
tests/bugon.res
tests/double_switch.c [new file with mode: 0644]
tests/double_switch.cocci [new file with mode: 0644]
tests/double_switch.res [new file with mode: 0644]
tests/longlongint.c [new file with mode: 0644]
tests/longlongint.cocci [new file with mode: 0644]
tests/longlongint.res [moved from tests/hex2.res with 55% similarity]
tests/not_converted.c [new file with mode: 0644]
tests/not_converted.cocci [new file with mode: 0644]
tests/not_converted_ver1.c [new file with mode: 0644]
tests/pb_parsing_macro.c [new file with mode: 0644]
tests/pb_parsing_macro.cocci [new file with mode: 0644]
tests/pb_parsing_macro.res [new file with mode: 0644]
tools/Makefile

diff --git a/.depend b/.depend
deleted file mode 100644 (file)
index 9fe1035..0000000
--- a/.depend
+++ /dev/null
@@ -1,48 +0,0 @@
-cocci.cmi: commons/common.cmi parsing_cocci/ast_cocci.cmi 
-testing.cmi: commons/common.cmi parsing_cocci/ast_cocci.cmi 
-cocci.cmo: parsing_cocci/visitor_ast.cmi parsing_c/unparse_hrule.cmi \
-    parsing_c/unparse_c.cmi parsing_c/type_annoter_c.cmi \
-    engine/transformation_c.cmi python/pycocci.cmo \
-    engine/pretty_print_engine.cmi parsing_cocci/pretty_print_cocci.cmi \
-    popl09/popl.cmi parsing_c/parsing_hacks.cmi parsing_cocci/parse_cocci.cmi \
-    parsing_c/parse_c.cmi commons/ograph_extended.cmi engine/lib_engine.cmo \
-    parsing_c/flag_parsing_c.cmo ctl/flag_ctl.cmo flag_cocci.cmo \
-    globals/flag.cmo engine/ctltotex.cmi engine/ctlcocci_integration.cmi \
-    ctl/ctl_engine.cmi parsing_c/cpp_ast_c.cmi parsing_c/control_flow_c.cmi \
-    parsing_c/compare_c.cmi commons/common.cmi \
-    parsing_c/comment_annotater_c.cmi engine/asttomember.cmi \
-    engine/asttoctl2.cmi parsing_c/ast_to_flow.cmi \
-    parsing_cocci/ast_cocci.cmi parsing_c/ast_c.cmo cocci.cmi 
-cocci.cmx: parsing_cocci/visitor_ast.cmx parsing_c/unparse_hrule.cmx \
-    parsing_c/unparse_c.cmx parsing_c/type_annoter_c.cmx \
-    engine/transformation_c.cmx python/pycocci.cmx \
-    engine/pretty_print_engine.cmx parsing_cocci/pretty_print_cocci.cmx \
-    popl09/popl.cmx parsing_c/parsing_hacks.cmx parsing_cocci/parse_cocci.cmx \
-    parsing_c/parse_c.cmx commons/ograph_extended.cmx engine/lib_engine.cmx \
-    parsing_c/flag_parsing_c.cmx ctl/flag_ctl.cmx flag_cocci.cmx \
-    globals/flag.cmx engine/ctltotex.cmx engine/ctlcocci_integration.cmx \
-    ctl/ctl_engine.cmx parsing_c/cpp_ast_c.cmx parsing_c/control_flow_c.cmx \
-    parsing_c/compare_c.cmx commons/common.cmx \
-    parsing_c/comment_annotater_c.cmx engine/asttomember.cmx \
-    engine/asttoctl2.cmx parsing_c/ast_to_flow.cmx \
-    parsing_cocci/ast_cocci.cmx parsing_c/ast_c.cmx cocci.cmi 
-main.cmo: testing.cmi parsing_c/test_parsing_c.cmi python/pycocci.cmo \
-    parsing_c/parse_c.cmi extra/kbuild.cmi popl09/flag_popl.cmo \
-    parsing_cocci/flag_parsing_cocci.cmo parsing_c/flag_parsing_c.cmo \
-    engine/flag_matcher.cmo ctl/flag_ctl.cmo flag_cocci.cmo globals/flag.cmo \
-    engine/ctlcocci_integration.cmi globals/config.cmo commons/common.cmi \
-    cocci.cmi 
-main.cmx: testing.cmx parsing_c/test_parsing_c.cmx python/pycocci.cmx \
-    parsing_c/parse_c.cmx extra/kbuild.cmx popl09/flag_popl.cmx \
-    parsing_cocci/flag_parsing_cocci.cmx parsing_c/flag_parsing_c.cmx \
-    engine/flag_matcher.cmx ctl/flag_ctl.cmx flag_cocci.cmx globals/flag.cmx \
-    engine/ctlcocci_integration.cmx globals/config.cmx commons/common.cmx \
-    cocci.cmx 
-testing.cmo: parsing_cocci/pretty_print_cocci.cmi \
-    parsing_cocci/parse_cocci.cmi flag_cocci.cmo globals/flag.cmo \
-    globals/config.cmo parsing_c/compare_c.cmi commons/common.cmi cocci.cmi \
-    testing.cmi 
-testing.cmx: parsing_cocci/pretty_print_cocci.cmx \
-    parsing_cocci/parse_cocci.cmx flag_cocci.cmx globals/flag.cmx \
-    globals/config.cmx parsing_c/compare_c.cmx commons/common.cmx cocci.cmx \
-    testing.cmi 
index f516238..2a49292 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -24,7 +24,7 @@
 
 -include Makefile.config
 
-VERSION=$(shell cat globals/config.ml |grep version |perl -p -e 's/.*"(.*)".*/$$1/;')
+VERSION=$(shell cat globals/config.ml.in |grep version |perl -p -e 's/.*"(.*)".*/$$1/;')
 
 ##############################################################################
 # Variables
@@ -33,12 +33,11 @@ TARGET=spatch
 
 SRC=flag_cocci.ml cocci.ml testing.ml test.ml main.ml
 
-
 ifeq ($(FEATURE_PYTHON),1)
 PYCMA=pycaml/pycaml.cma
 PYDIR=pycaml
 PYLIB=dllpycaml_stubs.so
-# the following is essential for Coccinelle to compile under gentoo (wierd)
+# the following is essential for Coccinelle to compile under gentoo (weird)
 OPTLIBFLAGS=-cclib dllpycaml_stubs.so
 else
 PYCMA=
@@ -47,18 +46,24 @@ PYLIB=
 OPTLIBFLAGS=
 endif
 
+SEXPSYSCMA=bigarray.cma nums.cma
 
-SYSLIBS=str.cma unix.cma
-LIBS=commons/commons.cma globals/globals.cma\
+SYSLIBS=str.cma unix.cma $(SEXPSYSCMA)
+LIBS=commons/commons.cma \
+     ocamlsexp/sexplib1.cma commons/commons_sexp.cma \
+     globals/globals.cma \
      ctl/ctl.cma \
      parsing_cocci/cocci_parser.cma parsing_c/parsing_c.cma \
-     engine/cocciengine.cma popl09/popl.cma \
+     engine/cocciengine.cma \
      extra/extra.cma $(PYCMA) python/coccipython.cma
 
-MAKESUBDIRS=commons globals menhirlib $(PYDIR) ctl parsing_cocci parsing_c \
- engine popl09 extra python
-INCLUDEDIRS=commons commons/ocamlextra globals menhirlib $(PYDIR) ctl \
- parsing_cocci parsing_c engine popl09 extra python
+#used for clean: and depend: and a little for rec & rec.opt
+MAKESUBDIRS=commons ocamlsexp \
+ globals menhirlib $(PYDIR) ctl parsing_cocci parsing_c \
+ engine extra python
+INCLUDEDIRS=commons commons/ocamlextra ocamlsexp \
+ globals menhirlib $(PYDIR) ctl \
+ parsing_cocci parsing_c engine extra python
 
 ##############################################################################
 # Generic variables
@@ -101,25 +106,42 @@ BYTECODE_STATIC=-custom
 ##############################################################################
 # Top rules
 ##############################################################################
-.PHONY: all all.opt opt top clean configure
-.PHONY: $(MAKESUBDIRS) $(MAKESUBDIRS:%=%.opt) subdirs subdirs.opt
+.PHONY:: all all.opt byte opt top clean distclean configure
+.PHONY:: $(MAKESUBDIRS) $(MAKESUBDIRS:%=%.opt) subdirs subdirs.opt
+
+all: byte
+       $(MAKE) preinstall
+
+opt: all.opt
+all.opt: opt-compil
+       $(MAKE) preinstall
 
-all:
+world: 
+       $(MAKE) byte
+       $(MAKE) opt
+       $(MAKE) preinstall
+
+byte: .depend
        $(MAKE) subdirs
        $(MAKE) $(EXEC)
 
-opt:
+opt-compil: .depend
        $(MAKE) subdirs.opt
        $(MAKE) $(EXEC).opt
 
-all.opt: opt
 top: $(EXEC).top
 
 subdirs:
-       +for D in $(MAKESUBDIRS); do $(MAKE) $$D ; done
+       $(MAKE) -C commons OCAMLCFLAGS="$(OCAMLCFLAGS)"
+       $(MAKE) -C ocamlsexp OCAMLCFLAGS="$(OCAMLCFLAGS)"
+       $(MAKE) -C commons sexp OCAMLCFLAGS="$(OCAMLCFLAGS)"
+       +for D in $(MAKESUBDIRS); do $(MAKE) $$D || exit 1 ; done
 
 subdirs.opt:
-       +for D in $(MAKESUBDIRS); do $(MAKE) $$D.opt ; done
+       $(MAKE) -C commons all.opt OCAMLCFLAGS="$(OCAMLCFLAGS)"
+       $(MAKE) -C ocamlsexp all.opt OCAMLCFLAGS="$(OCAMLCFLAGS)"
+       $(MAKE) -C commons sexp.opt OCAMLCFLAGS="$(OCAMLCFLAGS)"
+       +for D in $(MAKESUBDIRS); do $(MAKE) $$D.opt || exit 1 ; done
 
 $(MAKESUBDIRS):
        $(MAKE) -C $@ OCAMLCFLAGS="$(OCAMLCFLAGS)" all
@@ -127,6 +149,7 @@ $(MAKESUBDIRS):
 $(MAKESUBDIRS:%=%.opt):
        $(MAKE) -C $(@:%.opt=%) OCAMLCFLAGS="$(OCAMLCFLAGS)" all.opt
 
+#dependencies:
 # commons:
 # globals:
 # menhirlib:
@@ -134,28 +157,12 @@ $(MAKESUBDIRS:%=%.opt):
 # parsing_c:parsing_cocci
 # ctl:globals commons
 # engine: parsing_cocci parsing_c ctl
-# popl09:engine
 # extra: parsing_cocci parsing_c ctl
 # pycaml:
 # python:pycaml parsing_cocci parsing_c
-#
-# commons.opt:
-# globals.opt:
-# menhirlib.opt:
-# parsing_cocci.opt: commons.opt globals.opt menhirlib.opt
-# parsing_c.opt:parsing_cocci.opt
-# ctl.opt:globals.opt commons.opt
-# engine.opt: parsing_cocci.opt parsing_c.opt ctl.opt
-# popl09.opt:engine.opt
-# extra.opt: parsing_cocci.opt parsing_c.opt ctl.opt
-# pycaml.opt:
-# python.opt:pycaml.opt parsing_cocci.opt parsing_c.opt
 
 clean::
-       set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i clean; done
-
-configure:
-       ./configure
+       set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i $@; done
 
 $(LIBS): $(MAKESUBDIRS)
 $(LIBS:.cma=.cmxa): $(MAKESUBDIRS:%=%.opt)
@@ -179,14 +186,17 @@ clean::
        rm -f dllpycaml_stubs.so
 
 
-.PHONY: tools all configure
+.PHONY:: tools configure
+
+configure:
+       ./configure
 
 tools:
        $(MAKE) -C tools
+
 clean::
        $(MAKE) -C tools clean
 
-
 static:
        rm -f spatch.opt spatch
        $(MAKE) STATIC="-ccopt -static" spatch.opt
@@ -197,6 +207,52 @@ purebytecode:
        $(MAKE) BYTECODE_STATIC="" spatch
 
 
+##############################################################################
+# Build documentation
+##############################################################################
+.PHONY:: docs
+
+docs:
+       make -C docs
+
+clean::
+       make -C docs clean
+
+distclean::
+       make -C docs distclean
+
+##############################################################################
+# Pre-Install (customization of spatch frontend script)
+##############################################################################
+.PHONY:: preinstall preinstall-def preinstall-byte preinstall-opt
+
+preinstall: preinstall-def preinstall-byte preinstall-opt
+
+# user will use spatch to run spatch.opt (native)
+preinstall-def:
+       cp scripts/spatch.sh scripts/spatch.tmp2
+       sed "s|SHAREDIR|$(SHAREDIR)|g" scripts/spatch.tmp2 > scripts/spatch.tmp
+       sed "s|LIBDIR|$(LIBDIR)|g" scripts/spatch.tmp > scripts/spatch
+       rm -f scripts/spatch.tmp2 scripts/spatch.tmp
+
+# user will use spatch to run spatch (bytecode)
+preinstall-byte:
+       cp scripts/spatch.sh scripts/spatch.tmp3
+       sed "s|\.opt||" scripts/spatch.tmp3 > scripts/spatch.tmp2
+       sed "s|SHAREDIR|$(SHAREDIR)|g" scripts/spatch.tmp2 > scripts/spatch.tmp
+       sed "s|LIBDIR|$(LIBDIR)|g" scripts/spatch.tmp > scripts/spatch.byte
+       rm -f scripts/spatch.tmp3 scripts/spatch.tmp2 scripts/spatch.tmp
+
+# user will use spatch.opt to run spatch.opt (native)
+preinstall-opt:
+       cp scripts/spatch.sh scripts/spatch.opt.tmp2
+       sed "s|SHAREDIR|$(SHAREDIR)|g" scripts/spatch.opt.tmp2 > scripts/spatch.opt.tmp
+       sed "s|LIBDIR|$(LIBDIR)|g" scripts/spatch.opt.tmp > scripts/spatch.opt
+       rm -f scripts/spatch.opt.tmp scripts/spatch.opt.tmp2
+
+clean::
+       rm -f scripts/spatch scripts/spatch.byte scripts/spatch.opt
+
 ##############################################################################
 # Install
 ##############################################################################
@@ -224,25 +280,36 @@ install-python:
                $(DESTDIR)$(SHAREDIR)/python/coccilib
        $(INSTALL_DATA) python/coccilib/coccigui/*.py \
                $(DESTDIR)$(SHAREDIR)/python/coccilib/coccigui
+       $(INSTALL_DATA) python/coccilib/coccigui/pygui.glade \
+               $(DESTDIR)$(SHAREDIR)/python/coccilib/coccigui
+       $(INSTALL_DATA) python/coccilib/coccigui/pygui.gladep \
+               $(DESTDIR)$(SHAREDIR)/python/coccilib/coccigui
        $(INSTALL_LIB) dllpycaml_stubs.so $(DESTDIR)$(LIBDIR)
 
+install:
+       @if test -x spatch -a ! -x spatch.opt ; then \
+               $(MAKE) install-byte;fi
+       @if test ! -x spatch -a -x spatch.opt ; then \
+               $(MAKE) install-def; $(MAKE) install-opt;fi
+       @if test -x spatch -a -x spatch.opt ; then \
+               $(MAKE) install-byte; $(MAKE) install-opt;fi
+       @if test ! -x spatch -a ! -x spatch.opt ; then \
+               echo "\n\n\t==> Run 'make', 'make opt', or both first. <==\n\n";fi
+
 # user will use spatch to run spatch.opt (native)
-install: all.opt install-common
+install-def: install-common
        $(INSTALL_PROGRAM) spatch.opt $(DESTDIR)$(SHAREDIR)
-       cat scripts/spatch.sh | sed "s|SHAREDIR|$(SHAREDIR)|g" > $(DESTDIR)$(BINDIR)/spatch
-       chmod 755 $(DESTDIR)$(BINDIR)/spatch
+       $(INSTALL_PROGRAM) scripts/spatch $(DESTDIR)$(BINDIR)/spatch
 
 # user will use spatch to run spatch (bytecode)
-install-byte: all install-common
+install-byte: install-common
        $(INSTALL_PROGRAM) spatch $(DESTDIR)$(SHAREDIR)
-       cat scripts/spatch.sh | sed "s|\.opt||" | sed "s|SHAREDIR|$(SHAREDIR)|g" > $(DESTDIR)$(BINDIR)/spatch
-       chmod 755 $(DESTDIR)$(BINDIR)/spatch
+       $(INSTALL_PROGRAM) scripts/spatch.byte $(DESTDIR)$(BINDIR)/spatch
 
 # user will use spatch.opt to run spatch.opt (native)
-install-opt: all.opt install-common
+install-opt: install-common
        $(INSTALL_PROGRAM) spatch.opt $(DESTDIR)$(SHAREDIR)
-       cat scripts/spatch.sh | sed "s|SHAREDIR|$(SHAREDIR)|g" > $(DESTDIR)$(BINDIR)/spatch.opt
-       chmod 755 $(DESTDIR)$(BINDIR)/spatch.opt
+       $(INSTALL_PROGRAM) scripts/spatch.opt $(DESTDIR)$(BINDIR)/spatch.opt
 
 uninstall:
        rm -f $(DESTDIR)$(BINDIR)/spatch
@@ -253,8 +320,6 @@ uninstall:
        rm -rf $(DESTDIR)$(SHAREDIR)/python/coccilib
        rm -f $(DESTDIR)$(MANDIR)/man1/spatch.1
 
-
-
 version:
        @echo $(VERSION)
 
@@ -266,7 +331,9 @@ version:
 PACKAGE=coccinelle-$(VERSION)
 
 BINSRC=spatch env.sh env.csh standard.h standard.iso \
-       *.txt docs/* \
+       *.txt \
+       docs/options.pdf docs/grammar/cocci_syntax.pdf docs/spatch.1 \
+       docs/cocci-python.txt \
        demos/foo.* demos/simple.*
 #      $(PYLIB) python/coccilib/ demos/printloc.*
 BINSRC2=$(BINSRC:%=$(PACKAGE)/%)
@@ -282,6 +349,8 @@ OCAMLVERSION=$(shell ocaml -version |perl -p -e 's/.*version (.*)/$$1/;')
 #  touch **/*
 #  make licensify
 #  remember to comment the -g -dtypes in this Makefile
+#  You can also remove a few things, for instance I removed in this
+#   Makefile things related to popl/ and popl09/
 
 # Procedure to do each time:
 #  cvs update
@@ -305,18 +374,25 @@ OCAMLVERSION=$(shell ocaml -version |perl -p -e 's/.*version (.*)/$$1/;')
 
 package:
        make srctar
+       ./configure --without-python
+       make docs
        make bintar
        make staticbintar
        make bytecodetar
 
 # I currently pre-generate the parser so the user does not have to
-# install menhir on his machine. I also do a few cleanups like 'rm todo_pos'.
+# install menhir on his machine. We could also do a few cleanups.
 # You may have first to do a 'make licensify'.
+#
+# update: make docs generates pdf but also some ugly .log files, so 
+# make clean is there to remove them while not removing the pdf
+# (only distclean remove the pdfs).
 srctar:
+       make distclean
+       make docs
        make clean
        cp -a .  $(TMP)/$(PACKAGE)
        cd $(TMP)/$(PACKAGE); cd parsing_cocci/; make parser_cocci_menhir.ml
-       cd $(TMP)/$(PACKAGE); rm -f todo_pos
        cd $(TMP); tar cvfz $(PACKAGE).tgz --exclude-vcs $(PACKAGE)
        rm -rf  $(TMP)/$(PACKAGE)
 
@@ -350,7 +426,7 @@ clean::
 
 
 
-TOLICENSIFY=ctl engine parsing_cocci popl popl09 python
+TOLICENSIFY=ctl engine parsing_cocci python
 licensify:
        ocaml tools/licensify.ml
        set -e; for i in $(TOLICENSIFY); do cd $$i; ocaml ../tools/licensify.ml; cd ..; done
@@ -381,6 +457,7 @@ website:
        cp $(TMP)/$(PACKAGE)-bin-x86-static.tgz $(WEBSITE)
        cp $(TMP)/$(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz   $(WEBSITE)
        rm -f $(WEBSITE)/LATEST* $(WEBSITE)/coccinelle-latest.tgz
+       cp changes.txt $(WEBSITE)/changes-$(VERSION).txt
        cd $(WEBSITE); touch LATEST_IS_$(VERSION); ln -s $(PACKAGE).tgz coccinelle-latest.tgz
 
 
@@ -403,6 +480,11 @@ update_darcs:
 diff_darcs:
        set -e; for i in $(DARCSFORESTS); do cd $$i; darcs diff -u; cd ..; done
 
+##############################################################################
+# Git Developer rules
+##############################################################################
+gitupdate:
+       git cvsimport -d :ext:topps:/var/cvs/cocci  coccinelle
 
 ##############################################################################
 # Developer rules
@@ -429,7 +511,7 @@ tags:
        otags -no-mli-tags -r  .
 
 dependencygraph:
-       find  -name "*.ml" |grep -v "scripts" | xargs ocamldep -I commons -I globals -I ctl -I parsing_cocci -I parsing_c -I engine -I popl09 -I extra > /tmp/dependfull.depend
+       find  -name "*.ml" |grep -v "scripts" | xargs ocamldep -I commons -I globals -I ctl -I parsing_cocci -I parsing_c -I engine -I extra > /tmp/dependfull.depend
        ocamldot -lr /tmp/dependfull.depend > /tmp/dependfull.dot
        dot -Tps /tmp/dependfull.dot > /tmp/dependfull.ps
        ps2pdf /tmp/dependfull.ps /tmp/dependfull.pdf
@@ -474,14 +556,28 @@ beforedepend:: test.ml
 
 clean::
        rm -f *.cm[iox] *.o *.annot
-
-clean::
        rm -f *~ .*~ *.exe #*#
 
+distclean:: clean
+       set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i $@; done
+       rm -f .depend
+       rm -f Makefile.config
+       rm -f python/coccilib/output.py
+       rm -f python/pycocci.ml
+       rm -f python/pycocci_aux.ml
+       rm -f globals/config.ml
+       rm -f TAGS
+       rm -f tests/SCORE_actual.sexp
+       rm -f tests/SCORE_best_of_both.sexp
+       find -name ".#*1.*" | xargs rm -f
+
 beforedepend::
 
 depend:: beforedepend
        $(OCAMLDEP) *.mli *.ml > .depend
-       set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i depend; done
+       set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i $@; done
+
+.depend::
+       @if [ ! -f .depend ] ; then $(MAKE) depend ; fi
 
 -include .depend
index be2f557..e16be60 100644 (file)
--- a/bugs.txt
+++ b/bugs.txt
@@ -1,2 +1,2 @@
-Send a mail to julia@diku.dk or yoann.padioleau@gmail.com with [Bug-Cocci] as
-a prefix in the subject of your mail.
+Send a mail to cocci@diku.dk, or julia@diku.dk or yoann.padioleau@gmail.com
+with [Bug-Cocci] as a prefix in the subject of your mail.
index 88141ff..130a473 100644 (file)
@@ -1,7 +1,50 @@
 -*- org -*-
 
+* 0.1.7
+
+** Language: 
+- initialize and finalize script code, cf demos/initial_final.cocci
+
+** Features:
+- -iso_limit option to limit the depth of isomorphism application
+- with the dir option, the include path is implicitly set to the "include"
+  subdirectory of the specified directory, if the option -I is not used.
+- give a seed for the name of a fresh identifier
+- better handling of cpp "constructed" identifiers as in a##b, that in
+  the futur will make it easier to match over those idents. 
+  cf tests/pb_parsing_macro.c. Thanks to Ali-Erdem Ozcan for pointing
+  out the problem. A new "parsing hack hint" is also available:
+  YACFE_IDENT_BUILDER, cf standard.h.
+
+** Bugfix:
+- drop excessive "optimization" in ctl generation for while and for loops
+- allow . as the name of the directory
+- for type inference for an assignment, take the type of the right-hand
+  side expression, not the type of the assigned variable
+- allow for with a declartion in the first header element, as in C++
+  (partial support)
+- allow for matching against variable declarations that include only
+  storage, eg static, but no type at all.
+- allow for matching against types that contain both short/long and int
+- allow the type metavariable in the SmPL code "unsigned T" to match a T
+  that is a type consisting of more than one word, eg long int.
+- -ifdef_to_if option made to process nested ifdefs
+  (partial support)
+
+** Internals: 
+- improve and fix installation process (usable on BSD)
+- improve and fix testing process
+- apply patches from Eugeniy Meshcheryakov
+- reorganize the way we parse C identifiers, especially concatenated cpp 
+  identifiers as in a##b. This may lead to some regressions as we may
+  not parse as much code as before.
+- removed popl/ and popl09/ and popl related stuff from official distrib.
+
 * 0.1.6
 
+** Language:
+- the ability to add comments
+
 ** Features: 
 - grouping of generated rules with -hrule option
 - handling of special coccinelle comments 
@@ -9,7 +52,6 @@
   /* {{coccinelle:skip_end}} */
   allowing to give more hints to the C parser.
   Thanks to Flavien@lebarbe.net for the idea.
-- the ability to add comments
 - the ability to print the values of more (but not all) kinds of
   metavariables from python
 - new vim SmPL mode.
index 32bb774..337a491 100644 (file)
--- a/cocci.ml
+++ b/cocci.ml
@@ -101,12 +101,13 @@ let ast_to_flow_with_error_messages a =
 (* --------------------------------------------------------------------- *)
 (* Ctl related *)
 (* --------------------------------------------------------------------- *)
+
 let ctls_of_ast2 ast ua pos =
   List.map2
     (function ast -> function (ua,pos) ->
       List.combine
        (if !Flag_cocci.popl
-       then Popl.popl ast
+       then failwith "no popl here" (* Popl.popl ast *)
        else Asttoctl2.asttoctl ast ua pos)
        (Asttomember.asttomember ast ua))
     ast (List.combine ua pos)
@@ -145,7 +146,6 @@ let show_or_not_cocci2 coccifile isofile =
 let show_or_not_cocci a b = 
   Common.profile_code "show_xxx" (fun () -> show_or_not_cocci2 a b)
 
-
 (* the output *)
 
 let show_or_not_diff2 cfile outfile show_only_minus = 
@@ -166,12 +166,11 @@ let show_or_not_diff2 cfile outfile show_only_minus =
        (* create something that looks like the output of patch *)
            (Some prefix,minus_file::plus_file::rest) ->
              let drop_prefix file =
-               if prefix = ""
+               if prefix =$= ""
                then "/"^file
                else
-                 (match Str.split (Str.regexp prefix) file with
-                   [base_file] -> base_file
-                 | _ -> failwith "prefix not found in the old file name") in
+                 let lp = String.length prefix in
+                 String.sub file lp ((String.length file) - lp) in
              let diff_line =
                match List.rev(Str.split (Str.regexp " ") line) with
                  new_file::old_file::cmdrev ->
@@ -202,7 +201,7 @@ let show_or_not_diff2 cfile outfile show_only_minus =
                        (Printf.sprintf "bad diff header lines: %s %s"
                           (String.concat ":" l1) (String.concat ":" l2)) in
              diff_line::minus_line::plus_line::rest
-         |     _ -> res in
+         | _ -> res in
        xs +> List.iter (fun s -> 
          if s =~ "^\\+" && show_only_minus
          then ()
@@ -278,19 +277,23 @@ let show_or_not_ctl_text a b c =
 (* running information *)
 let get_celem celem : string = 
   match celem with 
-      Ast_c.Definition ({Ast_c.f_name = funcs;},_) -> funcs
+      Ast_c.Definition ({Ast_c.f_name = namefuncs;},_) -> 
+        Ast_c.str_of_name namefuncs
     | Ast_c.Declaration
-       (Ast_c.DeclList ([{Ast_c.v_namei = Some ((s, _),_);}, _], _)) -> s
+       (Ast_c.DeclList ([{Ast_c.v_namei = Some (name, _);}, _], _)) -> 
+        Ast_c.str_of_name name
     | _ -> ""
 
 let show_or_not_celem2 prelude celem = 
   let (tag,trying) =
   (match celem with 
-  | Ast_c.Definition ({Ast_c.f_name = funcs;},_) -> 
+  | Ast_c.Definition ({Ast_c.f_name = namefuncs},_) -> 
+      let funcs = Ast_c.str_of_name namefuncs in
       Flag.current_element := funcs;
       (" function: ",funcs)
   | Ast_c.Declaration
-      (Ast_c.DeclList ([{Ast_c.v_namei = Some ((s, _),_);}, _], _)) ->
+      (Ast_c.DeclList ([{Ast_c.v_namei = Some (name,_)}, _], _)) ->
+      let s = Ast_c.str_of_name name in
       Flag.current_element := s;
       (" variable ",s);
   | _ ->
@@ -453,6 +456,11 @@ let sp_contain_typed_metavar rules =
  * serio.c is related we think to #include <linux/serio.h> 
  *)
 
+let interpret_include_path _ =
+  match !Flag_cocci.include_path with
+    None -> "include"
+  | Some x -> x
+
 let (includes_to_parse:
        (Common.filename * Parse_c.program2) list ->
         Flag_cocci.include_options -> 'a) = fun xs choose_includes ->
@@ -460,7 +468,7 @@ let (includes_to_parse:
     Flag_cocci.I_UNSPECIFIED -> failwith "not possible"
   | Flag_cocci.I_NO_INCLUDES -> []
   | x ->
-      let all_includes = x = Flag_cocci.I_ALL_INCLUDES in
+      let all_includes = x =*= Flag_cocci.I_ALL_INCLUDES in
       xs +> List.map (fun (file, cs) -> 
        let dir = Common.dirname file in
        
@@ -477,16 +485,16 @@ let (includes_to_parse:
                then
                  let attempt2 = Filename.concat dir (Common.last xs) in
                  if not (Sys.file_exists f) && all_includes
-                 then Some (Filename.concat !Flag_cocci.include_path 
+                 then Some (Filename.concat (interpret_include_path())
                                (Common.join "/" xs))
                  else Some attempt2
                else Some f
 
             | Ast_c.NonLocal xs -> 
                if all_includes ||
-               Common.fileprefix (Common.last xs) = Common.fileprefix file
+               Common.fileprefix (Common.last xs) =$= Common.fileprefix file
                then 
-                  Some (Filename.concat !Flag_cocci.include_path 
+                  Some (Filename.concat (interpret_include_path())
                           (Common.join "/" xs))
                else None
             | Ast_c.Weird _ -> None
@@ -682,8 +690,12 @@ type toplevel_cocci_info_cocci_rule = {
 
 type toplevel_cocci_info = 
     ScriptRuleCocciInfo of toplevel_cocci_info_script_rule
+  | InitialScriptRuleCocciInfo of toplevel_cocci_info_script_rule
+  | FinalScriptRuleCocciInfo of toplevel_cocci_info_script_rule
   | CocciRuleCocciInfo of toplevel_cocci_info_cocci_rule
 
+type cocci_info = toplevel_cocci_info list * string list list (* tokens *)
+
 type kind_file = Header | Source 
 type file_info = { 
   fname : string;
@@ -744,9 +756,12 @@ let prepare_cocci ctls free_var_lists negated_pos_lists
             negated_pos_list),used_after_list),positions_list),rulenb) -> 
       
       let is_script_rule r =
-        match r with Ast_cocci.ScriptRule _ -> true | _ -> false in
+        match r with
+         Ast_cocci.ScriptRule _
+       | Ast_cocci.InitialScriptRule _ | Ast_cocci.FinalScriptRule _ -> true
+       | _ -> false in
 
-      if not (List.length ctl_toplevel_list = 1) && not (is_script_rule ast)
+      if not (List.length ctl_toplevel_list =|= 1) && not (is_script_rule ast)
       then failwith "not handling multiple minirules";
 
       match ast with
@@ -760,6 +775,30 @@ let prepare_cocci ctls free_var_lists negated_pos_lists
             script_code = code;
           }
           in ScriptRuleCocciInfo r
+      | Ast_cocci.InitialScriptRule (lang,code) ->
+         let mv = [] in
+         let deps = Ast_cocci.NoDep in
+          let r =
+          {
+            scr_ast_rule = (lang, mv, code);
+            language = lang;
+            scr_dependencies = deps;
+            scr_ruleid = rulenb;
+            script_code = code;
+          }
+          in InitialScriptRuleCocciInfo r
+      | Ast_cocci.FinalScriptRule (lang,code) ->
+         let mv = [] in
+         let deps = Ast_cocci.NoDep in
+          let r =
+          {
+            scr_ast_rule = (lang, mv, code);
+            language = lang;
+            scr_dependencies = deps;
+            scr_ruleid = rulenb;
+            script_code = code;
+          }
+          in FinalScriptRuleCocciInfo r
       | Ast_cocci.CocciRule
          (rulename,(dependencies,dropped_isos,z),restast,isexp,ruletype) ->
           CocciRuleCocciInfo (
@@ -980,7 +1019,18 @@ let prepare_c files choose_includes : file_info list =
 
 (* r(ule), c(element in C code), e(nvironment) *)
 
-let rec apply_python_rule r cache newes e rules_that_have_matched
+let merge_env new_e old_e =
+  List.fold_left
+    (function old_e ->
+      function (e,rules) as elem ->
+       let (same,diff) = List.partition (function (e1,_) -> e =*= e1) old_e in
+       match same with
+         [] -> elem :: old_e
+       | [(_,old_rules)] -> (e,Common.union_set rules old_rules) :: diff
+       | _ -> failwith "duplicate environment entries")
+    old_e new_e
+
+let apply_python_rule r cache newes e rules_that_have_matched
     rules_that_have_ever_matched =
   show_or_not_scr_rule_name r.scr_ruleid;
   if not(interpret_dependencies rules_that_have_matched
@@ -1002,7 +1052,7 @@ let rec apply_python_rule r cache newes e rules_that_have_matched
          let relevant_bindings =
            List.filter
              (function ((re,rm),_) ->
-               List.exists (function (_,(r,m)) -> r = re && m = rm) mv)
+               List.exists (function (_,(r,m)) -> r =$= re && m =$= rm) mv)
              e in
          let new_cache =
            if List.mem relevant_bindings cache
@@ -1028,7 +1078,8 @@ let rec apply_python_rule r cache newes e rules_that_have_matched
       else (cache, merge_env [(e, rules_that_have_matched)] newes)
     end
 
-and apply_cocci_rule r rules_that_have_ever_matched es (ccs:file_info list ref) =
+let rec apply_cocci_rule r rules_that_have_ever_matched es
+    (ccs:file_info list ref) =
   Common.profile_code r.rulename (fun () -> 
     show_or_not_rule_name r.ast_rule r.ruleid;
     show_or_not_ctl_text r.ctl r.ast_rule r.ruleid;
@@ -1144,82 +1195,7 @@ and apply_cocci_rule r rules_that_have_ever_matched es (ccs:file_info list ref)
 
     (* apply the tagged modifs and reparse *)
     if not !Flag.sgrep_mode2
-    then ccs := rebuild_info_c_and_headers !ccs r.isexp
-  )
-
-and merge_env new_e old_e =
-  List.fold_left
-    (function old_e ->
-      function (e,rules) as elem ->
-       let (same,diff) = List.partition (function (e1,_) -> e = e1) old_e in
-       match same with
-         [] -> elem :: old_e
-       | [(_,old_rules)] -> (e,Common.union_set rules old_rules) :: diff
-       | _ -> failwith "duplicate environment entries")
-    old_e new_e
-
-and bigloop2 rs (ccs: file_info list) = 
-  let es = ref [(Ast_c.emptyMetavarsBinding,[])] in
-  let ccs = ref ccs in
-  let rules_that_have_ever_matched = ref [] in
-
-  (* looping over the rules *)
-  rs +> List.iter (fun r -> 
-    match r with
-      ScriptRuleCocciInfo r -> 
-       if !Flag_cocci.show_ctl_text then begin
-          Common.pr_xxxxxxxxxxxxxxxxx ();
-          pr ("script: " ^ r.language);
-          Common.pr_xxxxxxxxxxxxxxxxx ();
-         
-          adjust_pp_with_indent (fun () -> 
-            Format.force_newline();
-            let (l,mv,code) = r.scr_ast_rule in
-           let deps = r.scr_dependencies in
-            Pretty_print_cocci.unparse
-             (Ast_cocci.ScriptRule (l,deps,mv,code)));
-       end;
-
-       if !Flag.show_misc then print_endline "RESULT =";
-
-        let (_, newes) =
-          List.fold_left
-            (function (cache, newes) ->
-              function (e, rules_that_have_matched) ->
-               match r.language with
-                  "python" ->
-                   apply_python_rule r cache newes e rules_that_have_matched
-                     rules_that_have_ever_matched
-               | "test" ->
-                   concat_headers_and_c !ccs +> List.iter (fun (c,_) -> 
-                     if c.flow <> None 
-                     then
-                       Printf.printf "Flow: %s\r\nFlow!\r\n%!" c.fullstring);
-                   (cache, newes)
-               | _ ->
-                    Printf.printf "Unknown language: %s\n" r.language;
-                    (cache, newes)
-                     )
-            ([],[]) !es in
-
-        es := newes;
-    | CocciRuleCocciInfo r ->
-       apply_cocci_rule r rules_that_have_ever_matched es ccs);
-
-  if !Flag.sgrep_mode2
-  then begin
-    (* sgrep can lead to code that is not parsable, but we must
-     * still call rebuild_info_c_and_headers to pretty print the 
-     * action (MINUS), so that later the diff will show what was
-     * matched by sgrep. But we don't want the parsing error message
-     * hence the following flag setting. So this code propably
-     * will generate a NotParsedCorrectly for the matched parts
-     * and the very final pretty print and diff will work
-     *)
-    Flag_parsing_c.verbose_parsing := false;
-    ccs := rebuild_info_c_and_headers !ccs false
-  end;
-  !ccs (* return final C asts *)
+    then ccs := rebuild_info_c_and_headers !ccs r.isexp)
 
 and reassociate_positions free_vars negated_pos_vars envs =
   (* issues: isolate the bindings that are relevant to a given rule.
@@ -1270,7 +1246,7 @@ and reassociate_positions free_vars negated_pos_vars envs =
             (function (other_non_pos,other_pos) ->
                (* do we want equal? or just somehow compatible? eg non_pos
               binds only E, but other_non_pos binds both E and E1 *)
-              non_pos = other_non_pos)
+              non_pos =*= other_non_pos)
             splitted_relevant in
         (non_pos,
          List.sort compare
@@ -1300,12 +1276,29 @@ and combine_pos negated_pos_vars others =
               [] others))))
     negated_pos_vars
 
-and bigloop a b = 
-  Common.profile_code "bigloop" (fun () -> bigloop2 a b)
-
-
-
+and process_a_generated_a_env_a_toplevel2 r env = function
+    [cfile] ->
+      let free_vars =
+       List.filter
+         (function
+             (rule,_) when rule =$= r.rulename -> false
+           | (_,"ARGS") -> false
+           | _ -> true)
+         r.free_vars in
+      let env_domain = List.map (function (nm,vl) -> nm) env in
+      let metavars =
+       List.filter
+         (function md ->
+           let (rl,_) = Ast_cocci.get_meta_name md in
+           rl =$= r.rulename)
+         r.metavars in
+      if Common.include_set free_vars env_domain
+      then Unparse_hrule.pp_rule metavars r.ast_rule env cfile.full_fname
+  | _ -> failwith "multiple files not supported"
 
+and process_a_generated_a_env_a_toplevel rule env ccs = 
+  Common.profile_code "process_a_ctl_a_env_a_toplevel" 
+    (fun () -> process_a_generated_a_env_a_toplevel2 rule env ccs)
 
 (* does side effects on C ast and on Cocci info rule *)
 and process_a_ctl_a_env_a_toplevel2 r e c f = 
@@ -1355,40 +1348,105 @@ and process_a_ctl_a_env_a_toplevel  a b c f=
   Common.profile_code "process_a_ctl_a_env_a_toplevel" 
     (fun () -> process_a_ctl_a_env_a_toplevel2 a b c f)
 
-and process_a_generated_a_env_a_toplevel2 r env = function
-    [cfile] ->
-      let free_vars =
-       List.filter
-         (function
-             (rule,_) when rule = r.rulename -> false
-           | (_,"ARGS") -> false
-           | _ -> true)
-         r.free_vars in
-      let env_domain = List.map (function (nm,vl) -> nm) env in
-      let metavars =
-       List.filter
-         (function md ->
-           let (rl,_) = Ast_cocci.get_meta_name md in
-           rl = r.rulename)
-         r.metavars in
-      if Common.include_set free_vars env_domain
-      then Unparse_hrule.pp_rule metavars r.ast_rule env cfile.full_fname
-  | _ -> failwith "multiple files not supported"
-   
-and process_a_generated_a_env_a_toplevel rule env ccs = 
-  Common.profile_code "process_a_ctl_a_env_a_toplevel" 
-    (fun () -> process_a_generated_a_env_a_toplevel2 rule env ccs)
-   
 
+let rec bigloop2 rs (ccs: file_info list) = 
+  let es = ref [(Ast_c.emptyMetavarsBinding,[])] in
+  let ccs = ref ccs in
+  let rules_that_have_ever_matched = ref [] in
+
+  (* looping over the rules *)
+  rs +> List.iter (fun r -> 
+    match r with
+      InitialScriptRuleCocciInfo r | FinalScriptRuleCocciInfo r -> ()
+    | ScriptRuleCocciInfo r -> 
+       if !Flag_cocci.show_ctl_text then begin
+          Common.pr_xxxxxxxxxxxxxxxxx ();
+          pr ("script: " ^ r.language);
+          Common.pr_xxxxxxxxxxxxxxxxx ();
+         
+          adjust_pp_with_indent (fun () -> 
+            Format.force_newline();
+            let (l,mv,code) = r.scr_ast_rule in
+           let deps = r.scr_dependencies in
+            Pretty_print_cocci.unparse
+             (Ast_cocci.ScriptRule (l,deps,mv,code)));
+       end;
+
+       if !Flag.show_misc then print_endline "RESULT =";
+
+        let (_, newes) =
+          List.fold_left
+            (function (cache, newes) ->
+              function (e, rules_that_have_matched) ->
+               match r.language with
+                  "python" ->
+                   apply_python_rule r cache newes e rules_that_have_matched
+                     rules_that_have_ever_matched
+               | "test" ->
+                   concat_headers_and_c !ccs +> List.iter (fun (c,_) -> 
+                     if c.flow <> None 
+                     then
+                       Printf.printf "Flow: %s\r\nFlow!\r\n%!" c.fullstring);
+                   (cache, newes)
+               | _ ->
+                    Printf.printf "Unknown language: %s\n" r.language;
+                    (cache, newes)
+                     )
+            ([],[]) !es in
+
+        es := newes;
+    | CocciRuleCocciInfo r ->
+       apply_cocci_rule r rules_that_have_ever_matched es ccs);
+
+  if !Flag.sgrep_mode2
+  then begin
+    (* sgrep can lead to code that is not parsable, but we must
+     * still call rebuild_info_c_and_headers to pretty print the 
+     * action (MINUS), so that later the diff will show what was
+     * matched by sgrep. But we don't want the parsing error message
+     * hence the following flag setting. So this code propably
+     * will generate a NotParsedCorrectly for the matched parts
+     * and the very final pretty print and diff will work
+     *)
+    Flag_parsing_c.verbose_parsing := false;
+    ccs := rebuild_info_c_and_headers !ccs false
+  end;
+  !ccs (* return final C asts *)
+
+let bigloop a b = 
+  Common.profile_code "bigloop" (fun () -> bigloop2 a b)
+
+let initial_final_bigloop2 ty rebuild r = 
+  if !Flag_cocci.show_ctl_text then
+    begin
+      Common.pr_xxxxxxxxxxxxxxxxx ();
+      pr (ty ^ ": " ^ r.language);
+      Common.pr_xxxxxxxxxxxxxxxxx ();
+
+      adjust_pp_with_indent (fun () -> 
+       Format.force_newline();
+       Pretty_print_cocci.unparse(rebuild r.scr_ast_rule));
+    end;
+
+  match r.language with
+    "python" ->
+      (* include_match makes no sense in an initial or final rule, although
+        er have no way to prevent it *)
+      let _ = apply_python_rule r [] [] [] [] (ref []) in ()
+  | _ ->
+      Printf.printf "Unknown language for initial/final script: %s\n"
+       r.language
+
+let initial_final_bigloop a b c = 
+  Common.profile_code "initial_final_bigloop"
+    (fun () -> initial_final_bigloop2 a b c)
 
 (*****************************************************************************)
-(* The main function *)
+(* The main functions *)
 (*****************************************************************************)
 
-let full_engine2 (coccifile, isofile) cfiles = 
-
-  show_or_not_cfiles  cfiles;
-  show_or_not_cocci   coccifile isofile;
+let pre_engine2 (coccifile, isofile) =
+  show_or_not_cocci coccifile isofile;
   Pycocci.set_coccifile coccifile;
 
   let isofile = 
@@ -1397,88 +1455,120 @@ let full_engine2 (coccifile, isofile) cfiles =
       pr2 ("warning: Can't find default iso file: " ^ isofile);
       None
     end
-    else Some isofile
-  in
+    else Some isofile in
 
   (* useful opti when use -dir *)
   let (metavars,astcocci,free_var_lists,negated_pos_lists,used_after_lists,
        positions_lists,toks,_) = 
-      sp_of_file coccifile isofile
-  in
-  let ctls = 
-    Common.memoized _hctl (coccifile, isofile) (fun () -> 
-      ctls_of_ast astcocci used_after_lists positions_lists)
-  in
+      sp_of_file coccifile isofile in
+  let ctls = ctls_of_ast astcocci used_after_lists positions_lists in
 
-  let contain_typedmetavar = sp_contain_typed_metavar astcocci in
+  g_contain_typedmetavar := sp_contain_typed_metavar astcocci;
 
-  (* optimisation allowing to launch coccinelle on all the drivers *)
-  if !Flag_cocci.worth_trying_opt && not (worth_trying cfiles toks)
-  then begin 
-    pr2 ("not worth trying:" ^ Common.join " " cfiles);
-    cfiles +> List.map (fun s -> s, None)
-  end
-  else begin
+  check_macro_in_sp_and_adjust toks;
 
-    if !Flag.show_misc then Common.pr_xxxxxxxxxxxxxxxxx();
-    if !Flag.show_misc then pr "let's go";
-    if !Flag.show_misc then Common.pr_xxxxxxxxxxxxxxxxx();
+  show_or_not_ctl_tex astcocci ctls;
 
-    g_contain_typedmetavar := contain_typedmetavar;
+  let cocci_infos =
+    prepare_cocci ctls free_var_lists negated_pos_lists
+      used_after_lists positions_lists metavars astcocci in
 
-    check_macro_in_sp_and_adjust toks;
+  let _ =
+    List.fold_left
+      (function languages ->
+       function
+           InitialScriptRuleCocciInfo(r) ->
+             (if List.mem r.language languages
+             then failwith ("double initializer found for "^r.language));
+             initial_final_bigloop "initial"
+               (function(x,_,y) -> Ast_cocci.InitialScriptRule(x,y))
+               r;
+             r.language::languages
+         | _ -> languages)
+      [] cocci_infos in
+  (cocci_infos,toks)
 
-    
+let pre_engine a = 
+  Common.profile_code "pre_engine" (fun () -> pre_engine2 a)
 
-    let cocci_infos =
-      prepare_cocci ctls free_var_lists negated_pos_lists
-       used_after_lists positions_lists metavars astcocci in
-    let choose_includes =
-      match !Flag_cocci.include_options with
-       Flag_cocci.I_UNSPECIFIED ->
-         if contain_typedmetavar
-         then Flag_cocci.I_NORMAL_INCLUDES
-         else Flag_cocci.I_NO_INCLUDES
-      |        x -> x in
-    let c_infos  = prepare_c cfiles choose_includes in
-
-    show_or_not_ctl_tex astcocci ctls;
-
-    (* ! the big loop ! *)
-    let c_infos' = bigloop cocci_infos c_infos in
-
-    if !Flag.show_misc then Common.pr_xxxxxxxxxxxxxxxxx ();
-    if !Flag.show_misc then pr "Finished";
-    if !Flag_ctl.graphical_trace then gen_pdf_graph ();
-    if !Flag.show_misc then Common.pr_xxxxxxxxxxxxxxxxx();
-
-    c_infos' +> List.map (fun c_or_h -> 
-      if !(c_or_h.was_modified_once)
-      then begin
-        let outfile = Common.new_temp_file "cocci-output" ("-" ^ c_or_h.fname) 
-        in
-
-        if c_or_h.fkind = Header 
-        then pr2 ("a header file was modified: " ^ c_or_h.fname);
-
-        (* and now unparse everything *)
-        cfile_of_program (for_unparser c_or_h.asts) outfile;
-
-        let show_only_minus = !Flag.sgrep_mode2 in
-        show_or_not_diff c_or_h.fpath outfile show_only_minus;
-
-        (c_or_h.fpath, 
-        if !Flag.sgrep_mode2 then None else Some outfile
-        )
-      end
-      else 
-        (c_or_h.fpath, None)
-    );
-  end
+let full_engine2 (cocci_infos,toks) cfiles = 
+
+  show_or_not_cfiles  cfiles;
+
+  (* optimisation allowing to launch coccinelle on all the drivers *)
+  if !Flag_cocci.worth_trying_opt && not (worth_trying cfiles toks)
+  then
+    begin 
+      pr2 ("not worth trying:" ^ Common.join " " cfiles);
+      cfiles +> List.map (fun s -> s, None)
+    end
+  else
+    begin
+
+      if !Flag.show_misc then Common.pr_xxxxxxxxxxxxxxxxx();
+      if !Flag.show_misc then pr "let's go";
+      if !Flag.show_misc then Common.pr_xxxxxxxxxxxxxxxxx();
+
+      let choose_includes =
+       match !Flag_cocci.include_options with
+         Flag_cocci.I_UNSPECIFIED ->
+           if !g_contain_typedmetavar
+           then Flag_cocci.I_NORMAL_INCLUDES
+           else Flag_cocci.I_NO_INCLUDES
+       | x -> x in
+      let c_infos  = prepare_c cfiles choose_includes in
+
+      (* ! the big loop ! *)
+      let c_infos' = bigloop cocci_infos c_infos in
+
+      if !Flag.show_misc then Common.pr_xxxxxxxxxxxxxxxxx ();
+      if !Flag.show_misc then pr "Finished";
+      if !Flag.show_misc then Common.pr_xxxxxxxxxxxxxxxxx ();
+      if !Flag_ctl.graphical_trace then gen_pdf_graph ();
+
+      c_infos' +> List.map (fun c_or_h -> 
+       if !(c_or_h.was_modified_once)
+       then
+         begin
+            let outfile =
+             Common.new_temp_file "cocci-output" ("-" ^ c_or_h.fname) in
+
+            if c_or_h.fkind =*= Header
+            then pr2 ("a header file was modified: " ^ c_or_h.fname);
+
+            (* and now unparse everything *)
+            cfile_of_program (for_unparser c_or_h.asts) outfile;
+
+            let show_only_minus = !Flag.sgrep_mode2 in
+            show_or_not_diff c_or_h.fpath outfile show_only_minus;
+
+            (c_or_h.fpath,
+             if !Flag.sgrep_mode2 then None else Some outfile)
+         end
+       else (c_or_h.fpath, None))
+    end
 
 let full_engine a b = 
   Common.profile_code "full_engine" (fun () -> full_engine2 a b)
 
+let post_engine2 (cocci_infos,_) =
+  let _ =
+    List.fold_left
+      (function languages ->
+       function
+           FinalScriptRuleCocciInfo(r) ->
+             (if List.mem r.language languages
+             then failwith ("double finalizer found for "^r.language));
+             initial_final_bigloop "final"
+               (function(x,_,y) -> Ast_cocci.FinalScriptRule(x,y))
+               r;
+             r.language::languages
+         | _ -> languages)
+      [] cocci_infos in
+  ()
+
+let post_engine a = 
+  Common.profile_code "post_engine" (fun () -> post_engine2 a)
 
 (*****************************************************************************)
 (* check duplicate from result of full_engine *)
@@ -1495,7 +1585,7 @@ let check_duplicate_modif2 xs =
     | res::xs -> 
         match res with 
         | None -> 
-            if not (List.for_all (fun res2 -> res2 = None) xs)
+            if not (List.for_all (fun res2 -> res2 =*= None) xs)
             then begin
               pr2 ("different modification result for " ^ file);
               None
index 65934b5..c596fa7 100644 (file)
--- a/cocci.mli
+++ b/cocci.mli
@@ -4,13 +4,18 @@ open Common
  * returns a list associating to the input cfiles, and maybe header
  * files that was also required to be modified, the files containing the
  * result (in general files in /tmp).
+ * pre_engine does the compilation of the SmPL code and runs any initially
+ * scripts
+ * post_engine runs any finally scripts
  * 
- * This function use memoisation internally, which is useful when 
- * use -dir to not redo twice the same work. So take care!
+ * This function uses memoisation internally, which is useful when 
+ * using -dir to not redo twice the same work. So take care!
  *)
-val full_engine : 
-  (filename * filename) -> filename list -> 
-  (filename * filename option) list
+type cocci_info
+val pre_engine : (filename * filename) -> cocci_info
+val full_engine :
+  cocci_info -> filename list -> (filename * filename option) list
+val post_engine : cocci_info -> unit
 
 (* because of the #include "toto.c" and also because we may associate the 
  * same C file to multiple drivers because they share code, we can
dissimilarity index 97%
index a1ea097..8117a27 100644 (file)
--- a/commitmsg
+++ b/commitmsg
@@ -1,3 +1,39 @@
-Release coccinelle-0.1.6a
-
-Bugfix.
+Release coccinelle-0.1.7
+
+** Language:
+   - initialize and finalize script code, cf demos/initial_final.cocci
+
+** Features:
+   - -iso_limit option to limit the depth of isomorphism application
+   - with the dir option, the include path is implicitly set to the "include"
+     subdirectory of the specified directory, if the option -I is not used.
+   - give a seed for the name of a fresh identifier
+   - better handling of cpp "constructed" identifiers as in a##b, that in
+     the futur will make it easier to match over those idents.
+     cf tests/pb_parsing_macro.c. Thanks to Ali-Erdem Ozcan for pointing
+     out the problem. A new "parsing hack hint" is also available:
+     YACFE_IDENT_BUILDER, cf standard.h.
+
+** Bugfix:
+   - drop excessive "optimization" in ctl generation for while and for loops
+   - allow . as the name of the directory
+   - for type inference for an assignment, take the type of the right-hand
+     side expression, not the type of the assigned variable
+   - allow for with a declartion in the first header element, as in C++
+     (partial support)
+   - allow for matching against variable declarations that include only
+     storage, eg static, but no type at all.
+   - allow for matching against types that contain both short/long and int
+   - allow the type metavariable in the SmPL code "unsigned T" to match a T
+     that is a type consisting of more than one word, eg long int.
+   - -ifdef_to_if option made to process nested ifdefs
+     (partial support)
+
+** Internals:
+   - improve and fix installation process (usable on BSD)
+   - improve and fix testing process
+   - apply patches from Eugeniy Meshcheryakov
+   - reorganize the way we parse C identifiers, especially concatenated cpp
+     identifiers as in a##b. This may lead to some regressions as we may
+     not parse as much code as before.
+   - removed popl/ and popl09/ and popl related stuff from official distrib.
diff --git a/commons/.depend b/commons/.depend
deleted file mode 100644 (file)
index 5fbb959..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-oarray.cmi: osequence.cmi ocollection.cmi 
-oassoc.cmi: ocollection.cmi 
-ocollection.cmi: objet.cmi 
-ograph.cmi: oset.cmi 
-ograph_extended.cmi: oset.cmi oassoc.cmi common.cmi 
-osequence.cmi: oassoc.cmi 
-oset.cmi: seti.cmo ocamlextra/setb.cmi ocamlextra/setPt.cmo ocollection.cmi 
-backtrace.cmo: common.cmi 
-backtrace.cmx: common.cmx 
-common.cmo: common.cmi 
-common.cmx: common.cmi 
-common_extra.cmo: common.cmi ocamlextra/ANSITerminal.cmi 
-common_extra.cmx: common.cmx ocamlextra/ANSITerminal.cmx 
-glimpse.cmo: common.cmi 
-glimpse.cmx: common.cmx 
-interfaces.cmo: common.cmi 
-interfaces.cmx: common.cmx 
-oarray.cmo: osequence.cmi common.cmi oarray.cmi 
-oarray.cmx: osequence.cmx common.cmx oarray.cmi 
-oassoc.cmo: ocollection.cmi common.cmi oassoc.cmi 
-oassoc.cmx: ocollection.cmx common.cmx oassoc.cmi 
-objet.cmo: common.cmi objet.cmi 
-objet.cmx: common.cmx objet.cmi 
-ocollection.cmo: objet.cmi common.cmi ocollection.cmi 
-ocollection.cmx: objet.cmx common.cmx ocollection.cmi 
-ofullcommon.cmo: ocollection/oseti.cmo ocollection/osetb.cmo oset.cmi \
-    ocollection/ograph2way.cmi ograph.cmi ocollection/oassoch.cmo \
-    ocollection/oassocb.cmo ocollection/oassoc_buffer.cmi oassoc.cmi \
-    oarray.cmi common.cmi 
-ofullcommon.cmx: ocollection/oseti.cmx ocollection/osetb.cmx oset.cmx \
-    ocollection/ograph2way.cmx ograph.cmx ocollection/oassoch.cmx \
-    ocollection/oassocb.cmx ocollection/oassoc_buffer.cmx oassoc.cmx \
-    oarray.cmx common.cmx 
-ograph.cmo: oset.cmi common.cmi ograph.cmi 
-ograph.cmx: oset.cmx common.cmx ograph.cmi 
-ograph_extended.cmo: ocamlextra/setb.cmi ocollection/osetb.cmo oset.cmi \
-    ocollection.cmi ocollection/oassocb.cmo oassoc.cmi common.cmi \
-    ograph_extended.cmi 
-ograph_extended.cmx: ocamlextra/setb.cmx ocollection/osetb.cmx oset.cmx \
-    ocollection.cmx ocollection/oassocb.cmx oassoc.cmx common.cmx \
-    ograph_extended.cmi 
-osequence.cmo: oassoc.cmi osequence.cmi 
-osequence.cmx: oassoc.cmx osequence.cmi 
-oset.cmo: seti.cmo ocamlextra/setb.cmi ocamlextra/setPt.cmo ocollection.cmi \
-    common.cmi oset.cmi 
-oset.cmx: seti.cmx ocamlextra/setb.cmx ocamlextra/setPt.cmx ocollection.cmx \
-    common.cmx oset.cmi 
-parser_combinators.cmo: common.cmi parser_combinators.cmi 
-parser_combinators.cmx: common.cmx parser_combinators.cmi 
-seti.cmo: common.cmi 
-seti.cmx: common.cmx 
-ocamlextra/ANSITerminal.cmo: ocamlextra/ANSITerminal.cmi 
-ocamlextra/ANSITerminal.cmx: ocamlextra/ANSITerminal.cmi 
-ocamlextra/dumper.cmo: ocamlextra/dumper.cmi 
-ocamlextra/dumper.cmx: ocamlextra/dumper.cmi 
-ocamlextra/dynArray.cmo: ocamlextra/enum.cmi ocamlextra/dynArray.cmi 
-ocamlextra/dynArray.cmx: ocamlextra/enum.cmx ocamlextra/dynArray.cmi 
-ocamlextra/enum.cmo: ocamlextra/enum.cmi 
-ocamlextra/enum.cmx: ocamlextra/enum.cmi 
-ocamlextra/setb.cmo: ocamlextra/setb.cmi 
-ocamlextra/setb.cmx: ocamlextra/setb.cmi 
-ocamlextra/suffix_tree.cmo: ocamlextra/suffix_tree.cmi 
-ocamlextra/suffix_tree.cmx: ocamlextra/suffix_tree.cmi 
-ocamlextra/suffix_tree_ext.cmo: ocamlextra/dynArray.cmi \
-    ocamlextra/suffix_tree_ext.cmi 
-ocamlextra/suffix_tree_ext.cmx: ocamlextra/dynArray.cmx \
-    ocamlextra/suffix_tree_ext.cmi 
-ocamlextra/dynArray.cmi: ocamlextra/enum.cmi 
-ocollection/oassoc_buffer.cmo: ocamlextra/setb.cmi ocollection/osetb.cmo \
-    ocollection/oassocb.cmo oassoc.cmi common.cmi \
-    ocollection/oassoc_buffer.cmi 
-ocollection/oassoc_buffer.cmx: ocamlextra/setb.cmx ocollection/osetb.cmx \
-    ocollection/oassocb.cmx oassoc.cmx common.cmx \
-    ocollection/oassoc_buffer.cmi 
-ocollection/oassoc_cache.cmo: ocamlextra/setb.cmi ocollection/osetb.cmo \
-    ocollection/oassocb.cmo oassoc.cmi common.cmi \
-    ocollection/oassoc_cache.cmi 
-ocollection/oassoc_cache.cmx: ocamlextra/setb.cmx ocollection/osetb.cmx \
-    ocollection/oassocb.cmx oassoc.cmx common.cmx \
-    ocollection/oassoc_cache.cmi 
-ocollection/oassocb.cmo: oassoc.cmi ocamlextra/mapb.cmo common.cmi 
-ocollection/oassocb.cmx: oassoc.cmx ocamlextra/mapb.cmx common.cmx 
-ocollection/oassocbdb.cmo: ocollection/oassoc_buffer.cmi oassoc.cmi \
-    ocamlextra/dumper.cmi common.cmi ocollection/oassocbdb.cmi 
-ocollection/oassocbdb.cmx: ocollection/oassoc_buffer.cmx oassoc.cmx \
-    ocamlextra/dumper.cmx common.cmx ocollection/oassocbdb.cmi 
-ocollection/oassocbdb_string.cmo: ocollection/oassoc_buffer.cmi oassoc.cmi \
-    common.cmi ocollection/oassocbdb_string.cmi 
-ocollection/oassocbdb_string.cmx: ocollection/oassoc_buffer.cmx oassoc.cmx \
-    common.cmx ocollection/oassocbdb_string.cmi 
-ocollection/oassocdbm.cmo: oassoc.cmi common.cmi ocollection/oassocdbm.cmi 
-ocollection/oassocdbm.cmx: oassoc.cmx common.cmx ocollection/oassocdbm.cmi 
-ocollection/oassoch.cmo: oassoc.cmi ocamlextra/dumper.cmi common.cmi 
-ocollection/oassoch.cmx: oassoc.cmx ocamlextra/dumper.cmx common.cmx 
-ocollection/oassocid.cmo: oassoc.cmi common.cmi 
-ocollection/oassocid.cmx: oassoc.cmx common.cmx 
-ocollection/ograph2way.cmo: ocamlextra/setb.cmi ocollection/osetb.cmo \
-    oset.cmi ograph.cmi ocollection.cmi common.cmi ocollection/ograph2way.cmi 
-ocollection/ograph2way.cmx: ocamlextra/setb.cmx ocollection/osetb.cmx \
-    oset.cmx ograph.cmx ocollection.cmx common.cmx ocollection/ograph2way.cmi 
-ocollection/osetb.cmo: ocamlextra/setb.cmi oset.cmi ocollection.cmi 
-ocollection/osetb.cmx: ocamlextra/setb.cmx oset.cmx ocollection.cmx 
-ocollection/oseth.cmo: oset.cmi common.cmi 
-ocollection/oseth.cmx: oset.cmx common.cmx 
-ocollection/oseti.cmo: seti.cmo oset.cmi ocollection.cmi 
-ocollection/oseti.cmx: seti.cmx oset.cmx ocollection.cmx 
-ocollection/osetpt.cmo: ocamlextra/setPt.cmo oset.cmi ocollection.cmi 
-ocollection/osetpt.cmx: ocamlextra/setPt.cmx oset.cmx ocollection.cmx 
-ocollection/oassoc_buffer.cmi: ocollection.cmi oassoc.cmi 
-ocollection/oassoc_cache.cmi: ocollection.cmi oassoc.cmi 
-ocollection/oassocbdb.cmi: ocollection.cmi ocollection/oassoc_buffer.cmi \
-    oassoc.cmi 
-ocollection/oassocbdb_string.cmi: ocollection.cmi \
-    ocollection/oassoc_buffer.cmi oassoc.cmi 
-ocollection/oassocdbm.cmi: ocollection.cmi oassoc.cmi common.cmi 
-ocollection/ograph2way.cmi: oset.cmi ograph.cmi 
index baba40d..4073a1f 100644 (file)
@@ -1,6 +1,8 @@
 ##############################################################################
 # Variables
 ##############################################################################
+
+# The main library
 -include ../Makefile.config
 
 TARGET=commons
@@ -19,15 +21,15 @@ MYSRC=common.ml common_extra.ml \
       glimpse.ml parser_combinators.ml
 
 # src from other authors, got from the web or caml hump
-SRC=ocamlextra/dumper.ml 
-SRC+=ocamlextra/ANSITerminal.ml 
+SRC=ocamlextra/dumper.ml
+SRC+=ocamlextra/ANSITerminal.ml
 SRC+=ocamlextra/setb.ml ocamlextra/mapb.ml # defunctorized version of standard set/map
 SRC+=ocamlextra/setPt.ml
 SRC+=$(MYSRC)
 SRC+=ocamlextra/enum.ml ocamlextra/dynArray.ml
-SRC+=ocamlextra/suffix_tree.ml ocamlextra/suffix_tree_ext.ml 
+SRC+=ocamlextra/suffix_tree.ml ocamlextra/suffix_tree_ext.ml
 
-SYSLIBS=str.cma unix.cma   
+SYSLIBS=str.cma unix.cma
 
 INCLUDEDIRS=ocamlextra ocollection
 SUBDIRS=ocamlextra ocollection
@@ -36,45 +38,53 @@ SUBDIRS=ocamlextra ocollection
 # Other common (thin wrapper) libraries
 #-----------------------------------------------------------------------------
 
+#format: XXXSRC, XXXINCLUDE, XXXSYSLIBS
+
 #gdbm
 MYGDBMSRC=ocollection/oassocdbm.ml
 GDBMSYSLIBS=dbm.cma
 
 #berkeley db (ocamlbdb)
-BDBINCLUDES=-I ../ocamlbdb
 MYBDBSRC=ocollection/oassocbdb.ml ocollection/oassocbdb_string.ml
+BDBINCLUDES=-I ../ocamlbdb
 BDBSYSLIBS=bdb.cma
 
 
 #lablgtk (ocamlgtk)
-GUIINCLUDES=-I +lablgtk2 -I +lablgtksourceview -I ../ocamlgtk/src
 MYGUISRC=gui.ml
+GUIINCLUDES=-I +lablgtk2 -I +lablgtksourceview -I ../ocamlgtk/src
 GUISYSLIBS=lablgtk.cma lablgtksourceview.cma
 
 #pycaml (ocamlpython)
-PYINCLUDES=-I ../ocamlpython -I ../../ocamlpython
 MYPYSRC=python.ml
+PYINCLUDES=-I ../ocamlpython -I ../../ocamlpython
 PYSYSLIBS=python.cma
 
 #ocamlmpi
-MPIINCLUDES=-I ../ocamlmpi -I ../../ocamlmpi -I +ocamlmpi 
 MYMPISRC=distribution.ml
+MPIINCLUDES=-I ../ocamlmpi -I ../../ocamlmpi -I +ocamlmpi 
 MPISYSLIBS=mpi.cma
 
-
-#-----------------------------------------------------------------------------
 #pcre 
 #REGEXPINCLUDES=-I +pcre
-REGEXPINCLUDES=-I ../ocamlpcre/lib
 MYREGEXPSRC=regexp.ml
+REGEXPINCLUDES=-I ../ocamlpcre/lib  -I ../../ocamlpcre/lib
+
+#sexplib 
+MYSEXPSRC=sexp_common.ml
+SEXPINCLUDES=-I ../ocamlsexp -I ../ocamltarzan/lib-sexp -I ../../ocamltarzan/lib-sexp
+#binprot
+MYBINSRC=bin_common.ml
+BININCLUDES=-I ../ocamltarzan/lib-binprot -I ../../ocamltarzan/lib-binprot
 
 #-----------------------------------------------------------------------------
 # Other stuff
 #-----------------------------------------------------------------------------
 
 #backtrace
-BACKTRACEINCLUDES=-I $(shell ocamlc -where)
 MYBACKTRACESRC=backtrace.ml
+BACKTRACEINCLUDES=-I $(shell ocamlc -where)
+
 
 ##############################################################################
 # Generic variables
@@ -88,9 +98,15 @@ INCLUDES=$(INCLUDEDIRS:%=-I %) $(INCLUDESEXTRA)
 
 # This flag can also be used in subdirectories so don't change its name here.
 # For profiling use:  -p -inline 0
-OPTFLAGS= 
+OPTFLAGS=
 #-thread
 
+# The OPTBIN variable is here to allow to use ocamlc.opt instead of 
+# ocaml, when it is available, which speeds up compilation. So
+# if you want the fast version of the ocaml chain tools, set this var 
+# or setenv it to ".opt" in your startup script.
+#OPTBIN= #.opt
+
 OCAMLCFLAGS ?= -g -dtypes
 
 # The OCaml tools.
@@ -103,7 +119,7 @@ OCAMLMKTOP=ocamlmktop -g -custom $(INCLUDES)
 
 # if need C code
 OCAMLMKLIB=ocamlmklib
-CC=gcc 
+CC=gcc
 
 ##############################################################################
 # Top rules
@@ -136,7 +152,7 @@ clean::
 # Other commons libs target
 ##############################################################################
 
-all_libs: gdbm bdb gui mpi backtrace
+all_libs: gdbm bdb gui mpi regexp backtrace
 
 #-----------------------------------------------------------------------------
 gdbm: commons_gdbm.cma
@@ -150,9 +166,9 @@ commons_gdbm.cmxa: $(MYGDBMSRC:.ml=.cmx)
 
 
 #-----------------------------------------------------------------------------
-bdb: 
+bdb:
        $(MAKE) INCLUDESEXTRA="$(BDBINCLUDES)" commons_bdb.cma
-bdb.opt: 
+bdb.opt:
        $(MAKE) INCLUDESEXTRA="$(BDBINCLUDES)" commons_bdb.cmxa
 
 commons_bdb.cma: $(MYBDBSRC:.ml=.cmo)
@@ -178,9 +194,9 @@ commons_gui.cmxa: $(MYGUISRC:.ml=.cmx)
 
 
 #-----------------------------------------------------------------------------
-mpi: 
+mpi:
        $(MAKE) INCLUDESEXTRA="$(MPIINCLUDES)" commons_mpi.cma
-mpi.opt: 
+mpi.opt:
        $(MAKE) INCLUDESEXTRA="$(MPIINCLUDES)" commons_mpi.cmxa
 
 commons_mpi.cma: $(MYMPISRC:.ml=.cmo)
@@ -196,9 +212,9 @@ distribution.opt: mpi.opt
 
 
 #-----------------------------------------------------------------------------
-python: 
+python:
        $(MAKE) INCLUDESEXTRA="$(PYINCLUDES)" commons_python.cma
-python.opt: 
+python.opt:
        $(MAKE) INCLUDESEXTRA="$(PYINCLUDES)" commons_python.cmxa
 
 
@@ -239,6 +255,44 @@ clean::
        rm -f dllcommons_backtrace.so
 
 
+
+#-----------------------------------------------------------------------------
+sexp:
+       $(MAKE) INCLUDESEXTRA="$(SEXPINCLUDES)" commons_sexp.cma
+sexp.opt:
+       $(MAKE) INCLUDESEXTRA="$(SEXPINCLUDES)" commons_sexp.cmxa
+
+commons_sexp.cma: $(MYSEXPSRC:.ml=.cmo)
+       $(OCAMLC) -a -o $@ $^
+
+commons_sexp.cmxa: $(MYSEXPSRC:.ml=.cmx)
+       $(OCAMLOPT) -a -o $@ $^
+
+binprot:
+       $(MAKE) INCLUDESEXTRA="$(BININCLUDES)" commons_bin.cma
+binprot.opt:
+       $(MAKE) INCLUDESEXTRA="$(BININCLUDES)" commons_bin.cmxa
+
+commons_bin.cma: $(MYBINSRC:.ml=.cmo)
+       $(OCAMLC) -a -o $@ $^
+
+commons_bin.cmxa: $(MYBINSRC:.ml=.cmx)
+       $(OCAMLOPT) -a -o $@ $^
+
+##############################################################################
+# The global "features" lib wrapper
+##############################################################################
+
+features: commons_features.cma
+features.opt: commons_features.cmxa
+
+commons_features.cma: features.cmo
+       $(OCAMLC) -a -o $@ $^
+
+commons_features.cmxa: features.cmx
+       $(OCAMLOPT) -a -o $@ $^
+
+
 ##############################################################################
 # Developer rules
 ##############################################################################
@@ -247,7 +301,7 @@ tags:
        otags -no-mli-tags -r  .
 
 clean::
-       rm -f gmon.out 
+       rm -f gmon.out
 
 forprofiling:
        $(MAKE) OPTFLAGS="-p -inline 0 " opt
@@ -278,7 +332,7 @@ dependencygraph2:
 
 clean::
        rm -f *.cm[iox] *.o *.a *.cma *.cmxa *.annot
-       rm -f *~ .*~ #*# 
+       rm -f *~ .*~ #*#
 
 clean::
        for i in $(SUBDIRS); do (cd $$i; \
@@ -286,7 +340,7 @@ clean::
         cd ..; ) \
        done
 
-depend: 
+depend:
        $(OCAMLDEP) *.mli *.ml  > .depend
        for i in $(SUBDIRS); do $(OCAMLDEP) $$i/*.ml $$i/*.mli >> .depend; done
 
index 985ce64..b0b4055 100644 (file)
@@ -1,5 +1,6 @@
 Yoann Padioleau
 
-Maybe a few code was borrowed from pixel (pascal rigaux).
+Maybe a few code was borrowed from Pixel (Pascal Rigaux)
+and Julia Lawall may have written a few helpers.
 
 See also credits.txt.
index d080f35..1d128a0 100644 (file)
@@ -1,4 +1,6 @@
-(* Copyright (C) 1998-2009 Yoann Padioleau
+(* Yoann Padioleau
+ *
+ * Copyright (C) 1998-2009 Yoann Padioleau
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -152,6 +154,7 @@ let (lines: string -> string list) = fun s ->
 let push2 v l =
   l := v :: !l
 
+let null xs = match xs with [] -> true | _ -> false
 
 
 
@@ -1359,6 +1362,14 @@ let (|||) a b = try a with _ -> b
  * let finalize f cleanup =  ...
  *)
 
+type error = Error of string
+
+(* sometimes to get help from ocaml compiler to tell me places where
+ * I should update, we sometimes need to change some type from pair
+ * to triple, hence this kind of fake type.
+ *)
+type evotype = unit
+let evoval = ()
 
 (*****************************************************************************)
 (* Environment *)
@@ -1687,6 +1698,7 @@ let (=*=) = (=)
 (* if really want to forbid to use '='
 let (=) = (=|=)
 *)
+let (=) () () = false
 
 
 
@@ -1706,9 +1718,11 @@ let (=) = (=|=)
 (*****************************************************************************)
 let (==>) b1 b2 = if b1 then b2 else true (* could use too => *)
 
-let (<=>) a b = if a = b then 0 else if a < b then -1 else 1
+(* superseded by another <=> below
+let (<=>) a b = if a =*= b then 0 else if a < b then -1 else 1
+*)
 
-let xor a b = not (a = b)
+let xor a b = not (a =*= b)
 
 
 (*****************************************************************************)
@@ -1737,7 +1751,7 @@ let string_of_chars cs = cs +> List.map (String.make 1) +> String.concat ""
 (*****************************************************************************)
 
 (* since 3.08, div by 0 raise Div_by_rezo, and not anymore a hardware trap :)*)
-let (/!) x y = if y = 0 then (log "common.ml: div by 0"; 0) else x / y
+let (/!) x y = if y =|= 0 then (log "common.ml: div by 0"; 0) else x / y
 
 (* now in prelude 
  * let rec (do_n: int -> (unit -> unit) -> unit) = fun i f ->
@@ -1767,7 +1781,7 @@ let clampf = function
 
 let square x = x *. x
 
-let rec power x n = if n = 0 then 1 else x * power x (n-1)
+let rec power x n = if n =|= 0 then 1 else x * power x (n-1)
 
 let between i min max = i > min && i < max
 
@@ -1780,18 +1794,18 @@ let bitrange x p = let v = power 2 p in between x (-v) v
 (* descendant *)
 let (prime1: int -> int option)  = fun x -> 
   let rec prime1_aux n = 
-    if n = 1 then None
+    if n =|= 1 then None
     else 
-      if (x / n) * n = x then Some n else prime1_aux (n-1)
-  in if x = 1 then None else if x < 0 then failwith "negative" else prime1_aux (x-1)
+      if (x / n) * n =|= x then Some n else prime1_aux (n-1)
+  in if x =|= 1 then None else if x < 0 then failwith "negative" else prime1_aux (x-1)
 
 (* montant, better *)
 let (prime: int -> int option)  = fun x -> 
   let rec prime_aux n = 
-    if n = x then None
+    if n =|= x then None
     else 
-      if (x / n) * n = x then Some n else prime_aux (n+1)
-  in if x = 1 then None else if x < 0 then failwith "negative" else prime_aux 2
+      if (x / n) * n =|= x then Some n else prime_aux (n+1)
+  in if x =|= 1 then None else if x < 0 then failwith "negative" else prime_aux 2
 
 let sum xs = List.fold_left (+) 0 xs
 let product = List.fold_left ( * ) 1
@@ -1799,21 +1813,21 @@ let product = List.fold_left ( * ) 1
 
 let decompose x = 
   let rec decompose x = 
-  if x = 1 then []
+  if x =|= 1 then []
   else 
     (match prime x with
     | None -> [x]
     | Some n -> n::decompose (x / n)
     ) 
-  in assert (product (decompose x) = x); decompose x
+  in assert (product (decompose x) =|= x); decompose x
 
 let mysquare x = x * x
 let sqr a = a *. a
 
 
 type compare = Equal | Inf | Sup
-let (<=>) a b = if a = b then Equal else if a < b then Inf else Sup
-let (<==>) a b = if a = b then 0 else if a < b then -1 else 1
+let (<=>) a b = if a =*= b then Equal else if a < b then Inf else Sup
+let (<==>) a b = if a =*= b then 0 else if a < b then -1 else 1
 
 type uint = int
 
@@ -1830,15 +1844,15 @@ let int_of_base s base =
     0  (List.rev (list_of_string s))
 
 let int_of_stringbits s = int_of_base s 2
-let _ = example (int_of_stringbits "1011" = 1*8 + 1*2 + 1*1)
+let _ = example (int_of_stringbits "1011" =|= 1*8 + 1*2 + 1*1)
 
 let int_of_octal s = int_of_base s 8
-let _ = example (int_of_octal "017" = 15)
+let _ = example (int_of_octal "017" =|= 15)
 
 (* let int_of_hex s = int_of_base s 16, NONONONO cos 'A' - '0' does not give 10 !! *)
 
 let int_of_all s = 
-  if String.length s >= 2 && (String.get s 0 = '0') && is_digit (String.get s 1)
+  if String.length s >= 2 && (String.get s 0 =<= '0') && is_digit (String.get s 1)
   then int_of_octal s else int_of_string s
 
 
@@ -1955,7 +1969,9 @@ let tuple_of_list6 = function [a;b;c;d;e;f] -> a,b,c,d,e,f | _ -> failwith "tupl
 (* type 'a maybe  = Just of 'a | None *)
 
 type ('a,'b) either = Left of 'a | Right of 'b
+  (* with sexp *)
 type ('a, 'b, 'c) either3 = Left3 of 'a | Middle3 of 'b | Right3 of 'c
+  (* with sexp *)
 
 let just = function
   | (Some x) -> x
@@ -2116,9 +2132,9 @@ let (regexp_match: string -> string -> string) = fun s re ->
 
 
 let split sep s = Str.split (Str.regexp sep) s
-let _ = example (split "/" "" = [])
+let _ = example (split "/" "" =*= [])
 let join  sep xs = String.concat sep xs
-let _ = example (join "/" ["toto"; "titi"; "tata"] = "toto/titi/tata")
+let _ = example (join "/" ["toto"; "titi"; "tata"] =$= "toto/titi/tata")
 (*
 let rec join str = function
   | [] -> ""
@@ -2137,7 +2153,7 @@ let (split_list_regexp: string -> string list -> (string * string list) list) =
         else split_lr_aux (heading, x::accu) xs
   in
   split_lr_aux ("__noheading__", []) xs 
-  +> (fun xs -> if (List.hd xs) = ("__noheading__",[]) then List.tl xs else xs)
+  +> (fun xs -> if (List.hd xs) =*= ("__noheading__",[]) then List.tl xs else xs)
 
 
 
@@ -2158,7 +2174,7 @@ let all_match re s =
   List.rev !res
 
 let _ = example (all_match "\\(@[A-Za-z]+\\)" "ca va @Et toi @Comment" 
-                  = ["@Et";"@Comment"])
+                  =*= ["@Et";"@Comment"])
 
 
 let global_replace_regexp re f_on_substr s = 
@@ -2235,17 +2251,18 @@ let quote s = "\"" ^ s ^ "\""
  * haskell "section" operators
  *)
 let null_string s = 
-  s = "" 
+  s =$= "" 
 
 let is_blank_string s = 
   s =~ "^\\([ \t]\\)*$"
 
 (* src: lablgtk2/examples/entrycompletion.ml *)
 let is_string_prefix s1 s2 =
-  (String.length s1 <= String.length s2) && (String.sub s2 0 (String.length s1) = s1)
+  (String.length s1 <= String.length s2) && 
+  (String.sub s2 0 (String.length s1) =$= s1)
 
 let plural i s = 
-  if i=1 
+  if i =|= 1
   then Printf.sprintf "%d %s" i s 
   else Printf.sprintf "%d %ss" i s
 
@@ -2307,7 +2324,7 @@ let matrix_distance s1 s2 =
   let m = (String.length s2) in 
   let mat = Array.make_matrix (n+1) (m+1) 0 in
   let t i j = 
-    if String.get s1 (i-1) = String.get s2 (j-1)
+    if String.get s1 (i-1) =<= String.get s2 (j-1)
     then 0
     else 1 
   in
@@ -2333,8 +2350,8 @@ let edit_distance s1 s2 =
 
 
 let test = edit_distance "vintner" "writers"
-let _ = assert (edit_distance "winter" "winter" = 0)
-let _ = assert (edit_distance "vintner" "writers" = 5)
+let _ = assert (edit_distance "winter" "winter" =|= 0)
+let _ = assert (edit_distance "vintner" "writers" =|= 5)
 
 
 (*****************************************************************************)
@@ -2345,7 +2362,9 @@ let dirname = Filename.dirname
 let basename = Filename.basename
 
 type filename = string (* TODO could check that exist :) type sux *)
+  (* with sexp *)
 type dirname = string (* TODO could check that exist :) type sux *)
+  (* with sexp *)
 
 module BasicType = struct
   type filename = string
@@ -2357,8 +2376,8 @@ let (filesuffix: filename -> string) = fun s ->
 let (fileprefix: filename -> string) = fun s -> 
   (try regexp_match s "\\(.+\\)\\.\\([a-zA-Z0-9_]+\\)?$" with _ ->  s)
 
-let _ = example (filesuffix "toto.c" = "c")
-let _ = example (fileprefix "toto.c" = "toto")
+let _ = example (filesuffix "toto.c" =$= "c")
+let _ = example (fileprefix "toto.c" =$= "toto")
 
 (*
 assert (s = fileprefix s ^ filesuffix s)
@@ -2407,7 +2426,7 @@ let dbe_of_filename_safe file =
 
 let dbe_of_filename_nodot file = 
   let (d,b,e) = dbe_of_filename file in
-  let d = if d = "." then "" else d in
+  let d = if d =$= "." then "" else d in
   d,b,e
 
 
@@ -2416,7 +2435,7 @@ let dbe_of_filename_nodot file =
 
 let replace_ext file oldext newext = 
   let (d,b,e) = dbe_of_filename file in
-  assert(e = oldext);
+  assert(e =$= oldext);
   filename_of_dbe (d,b,newext)
 
 
@@ -2722,7 +2741,7 @@ let days_in_week_of_day day =
   let tm = Unix.localtime day in 
   
   let wday = tm.Unix.tm_wday in
-  let wday = if wday = 0 then 6 else wday -1 in
+  let wday = if wday =|= 0 then 6 else wday -1 in
 
   let mday = tm.Unix.tm_mday in
 
@@ -2790,7 +2809,7 @@ let rough_days_between_dates d1 d2 =
 let _ = example 
   (rough_days_between_dates 
       (DMY (Day 7, Jan, Year 1977))
-      (DMY (Day 13, Jan, Year 1977)) = Days 6)
+      (DMY (Day 13, Jan, Year 1977)) =*= Days 6)
 
 (* because of rough days, it is a bit buggy, here it should return 1 *)
 (*
@@ -2935,7 +2954,7 @@ let week_after  : float_time -> float_time = fun d ->
  * (enum 0 ((String.length s) - 1) +> List.map (String.get s))
  *)
 
-let _ = example (list_of_string "abcd" = ['a';'b';'c';'d'])
+let _ = example (list_of_string "abcd" =*= ['a';'b';'c';'d'])
 
 (*
 let rec (list_of_stream: ('a Stream.t) -> 'a list) = 
@@ -2954,7 +2973,7 @@ let (list_of_string: string -> char list) =
 let (lines_with_nl: string -> string list) = fun s -> 
   let rec lines_aux = function
     | [] -> []
-    | [x] -> if x = "" then [] else [x ^ "\n"] (* old: [x] *)
+    | [x] -> if x =$= "" then [] else [x ^ "\n"] (* old: [x] *)
     | x::xs -> 
         let e = x ^ "\n" in
         e::lines_aux xs 
@@ -2990,11 +3009,11 @@ let (split_space: string -> string list)   = fun s ->
 (* todo opti ? *)
 let nblines s = 
   lines s +> List.length
-let _ = example (nblines "" = 0)
-let _ = example (nblines "toto" = 1)
-let _ = example (nblines "toto\n" = 1)
-let _ = example (nblines "toto\ntata" = 2)
-let _ = example (nblines "toto\ntata\n" = 2)
+let _ = example (nblines "" =|= 0)
+let _ = example (nblines "toto" =|= 1)
+let _ = example (nblines "toto\n" =|= 1)
+let _ = example (nblines "toto\ntata" =|= 2)
+let _ = example (nblines "toto\ntata\n" =|= 2)
 
 (*****************************************************************************)
 (* Process/Files *)
@@ -3048,7 +3067,7 @@ let sleep_little () =
 
 let do_in_fork f = 
   let pid = Unix.fork () in
-  if pid = 0
+  if pid =|= 0
   then 
     begin 
       (* Unix.setsid(); *)
@@ -3139,7 +3158,7 @@ let lfile_exists filename =
   with Unix.Unix_error (Unix.ENOENT, _, _) -> false
 
 let is_directory file = 
-  (Unix.stat file).Unix.st_kind = Unix.S_DIR
+  (Unix.stat file).Unix.st_kind =*= Unix.S_DIR
     
       
 (* src: from chailloux et al book *)
@@ -3156,7 +3175,7 @@ let (readdir_to_kind_list: string -> Unix.file_kind -> string list) =
   +> List.filter (fun s -> 
     try 
       let stat = Unix.lstat (path ^ "/" ^  s) in
-      stat.Unix.st_kind = kind
+      stat.Unix.st_kind =*= kind
     with e -> 
       pr2 ("EXN pb stating file: " ^ s);
       false
@@ -3177,7 +3196,7 @@ let (readdir_to_dir_size_list: string -> (string * int) list) = fun path ->
   +> Array.to_list 
   +> map_filter (fun s -> 
     let stat = Unix.lstat (path ^ "/" ^  s) in
-    if stat.Unix.st_kind = Unix.S_DIR 
+    if stat.Unix.st_kind =*= Unix.S_DIR 
     then Some (s, stat.Unix.st_size) 
     else None
     )
@@ -3229,7 +3248,7 @@ let cache_computation_robust2
   in
 
   if Sys.file_exists dependencies_cache && 
-     get_value dependencies_cache = dependencies
+     get_value dependencies_cache =*= dependencies
   then get_value file_cache
   else begin 
     pr2 ("cache computation recompute " ^ file);
@@ -3511,7 +3530,7 @@ let take_while p = take_until (p $ not)
 
 
 (* now in prelude: let rec drop n xs = ... *)
-let _ = example (drop 3 [1;2;3;4] = [4])
+let _ = example (drop 3 [1;2;3;4] =*= [4])
 
 let rec drop_while p = function
   | [] -> []
@@ -3520,7 +3539,7 @@ let rec drop_while p = function
 
 let rec drop_until p xs = 
   drop_while (fun x -> not (p x)) xs
-let _ = example (drop_until (fun x -> x = 3) [1;2;3;4;5] = [3;4;5])
+let _ = example (drop_until (fun x -> x =|= 3) [1;2;3;4;5] =*= [3;4;5])
 
 
 let span p xs = (take_while p xs, drop_while p xs)
@@ -3534,7 +3553,7 @@ let rec (span: ('a -> bool) -> 'a list -> 'a list * 'a list) =
        let (l1, l2) = span p xs in
        (x::l1, l2)
       else ([], x::xs)
-let _ = example ((span (fun x -> x <= 3) [1;2;3;4;1;2] = ([1;2;3],[4;1;2])))
+let _ = example ((span (fun x -> x <= 3) [1;2;3;4;1;2] =*= ([1;2;3],[4;1;2])))
 
 let rec groupBy eq l =
   match l with
@@ -3548,7 +3567,8 @@ let rec group_by_mapped_key fkey l =
   | [] -> []
   | x::xs -> 
       let k = fkey x in 
-      let (xs1,xs2) = List.partition (fun x' -> let k2 = fkey x' in k=k2) xs in
+      let (xs1,xs2) = List.partition (fun x' -> let k2 = fkey x' in k=*=k2) xs 
+      in
       (k, (x::xs1))::(group_by_mapped_key fkey xs2)
 
 
@@ -3565,7 +3585,7 @@ let (exclude_but_keep_attached: ('a -> bool) -> 'a list -> ('a * 'a list) list)=
    in
    aux_filter [] xs
 let _ = example
-  (exclude_but_keep_attached (fun x -> x = 3) [3;3;1;3;2;3;3;3] = 
+  (exclude_but_keep_attached (fun x -> x =|= 3) [3;3;1;3;2;3;3;3] =*=
       [(1,[3;3]);(2,[3])])
 
 let (group_by_post: ('a -> bool) -> 'a list -> ('a list * 'a) list * 'a list)=
@@ -3583,9 +3603,19 @@ let (group_by_post: ('a -> bool) -> 'a list -> ('a list * 'a) list * 'a list)=
    aux_filter [] [] xs
 
 let _ = example
-  (group_by_post (fun x -> x = 3) [1;1;3;2;3;4;5;3;6;6;6] 
+  (group_by_post (fun x -> x =|= 3) [1;1;3;2;3;4;5;3;6;6;6] =*
       ([([1;1],3);([2],3);[4;5],3], [6;6;6]))
 
+let (group_by_pre: ('a -> bool) -> 'a list -> 'a list * ('a * 'a list) list)=
+  fun f xs -> 
+    let xs' = List.rev xs in
+    let (ys, unclassified) = group_by_post f xs' in
+    List.rev unclassified,
+    ys +> List.rev +> List.map (fun (xs, x) -> x, List.rev xs )
+
+let _ = example
+  (group_by_pre (fun x -> x =|= 3) [1;1;3;2;3;4;5;3;6;6;6] =*= 
+      ([1;1], [(3,[2]); (3,[4;5]); (3,[6;6;6])]))
                                            
 
 let rec (split_when: ('a -> bool) -> 'a list -> 'a list * 'a * 'a list) = 
@@ -3597,14 +3627,15 @@ let rec (split_when: ('a -> bool) -> 'a list -> 'a list * 'a * 'a list) =
       else 
         let (l1, a, l2) = split_when p xs in
         (x::l1, a, l2)
-let _ = example (split_when (fun x -> x = 3) [1;2;3;4;1;2] = ([1;2],3,[4;1;2]))
+let _ = example (split_when (fun x -> x =|= 3) 
+                    [1;2;3;4;1;2] =*= ([1;2],3,[4;1;2]))
 
 
 (* not so easy to come up with ... used in aComment for split_paragraph *)
 let rec split_gen_when_aux f acc xs = 
   match xs with
   | [] -> 
-      if acc = []
+      if null acc
       then []
       else [List.rev acc]
   | (x::xs) -> 
@@ -3613,7 +3644,7 @@ let rec split_gen_when_aux f acc xs =
           split_gen_when_aux f (x::acc) xs 
       | Some (rest) -> 
           let before = List.rev acc in
-          if before = []
+          if null before
           then split_gen_when_aux f [] rest
           else before::split_gen_when_aux f [] rest
       )
@@ -3626,11 +3657,13 @@ let split_gen_when f xs =
 (* generate exception (Failure "tl") if there is no element satisfying p *)
 let rec (skip_until: ('a list -> bool) -> 'a list -> 'a list) = fun p xs ->
   if p xs then xs else skip_until p (List.tl xs)
-let _ = example (skip_until (function 1::2::xs -> true | _ -> false) [1;3;4;1;2;4;5] = [1;2;4;5])
+let _ = example 
+  (skip_until (function 1::2::xs -> true | _ -> false) 
+      [1;3;4;1;2;4;5] =*= [1;2;4;5])
 
 let rec skipfirst e = function
   | [] -> []
-  | e'::l when e = e' -> skipfirst e l
+  | e'::l when e =*= e' -> skipfirst e l
   | l -> l
 
 
@@ -3640,12 +3673,12 @@ let rec skipfirst e = function
 
 
 let index_list xs = 
-  if xs = [] then [] (* enum 0 (-1) generate an exception *)
+  if null xs then [] (* enum 0 (-1) generate an exception *)
   else zip xs (enum 0 ((List.length xs) -1))
 
 let index_list_and_total xs = 
   let total = List.length xs in
-  if xs = [] then [] (* enum 0 (-1) generate an exception *)
+  if null xs then [] (* enum 0 (-1) generate an exception *)
   else zip xs (enum 0 ((List.length xs) -1)) 
     +> List.map (fun (a,b) -> (a,b,total))
 
@@ -3684,7 +3717,7 @@ let _ = assert_equal (head_middle_tail [1;3]) (1, [], 3)
 
 let remove x xs = 
   let newxs = List.filter (fun y -> y <> x) xs in
-  assert (List.length newxs = List.length xs - 1);
+  assert (List.length newxs =|= List.length xs - 1);
   newxs
 
 
@@ -3789,7 +3822,7 @@ let rec removelast = function
   | e::l -> e :: removelast l
 
 let remove x = List.filter (fun y -> y != x)
-let empty list = list = []
+let empty list = null list
 
 
 let rec inits = function
@@ -3834,7 +3867,7 @@ let acc_map f l =
 
 
 let rec (generate: int -> 'a -> 'a list) = fun i el ->
-  if i = 0 then []
+  if i =|= 0 then []
   else el::(generate (i-1) el)
 
 let rec uniq = function
@@ -3842,7 +3875,7 @@ let rec uniq = function
   | e::l -> if List.mem e l then uniq l else e :: uniq l
 
 let has_no_duplicate xs = 
-  List.length xs = List.length (uniq xs)
+  List.length xs =|= List.length (uniq xs)
 let is_set_as_list = has_no_duplicate
 
 
@@ -3856,7 +3889,7 @@ let rec get_duplicates xs =
 
 let rec all_assoc e = function
   | [] -> []
-  | (e',v) :: l when e=e' -> v :: all_assoc e l
+  | (e',v) :: l when e=*=e' -> v :: all_assoc e l
   | _ :: l -> all_assoc e l
 
 let prepare_want_all_assoc l =
@@ -3872,7 +3905,7 @@ let rec (return_when: ('a -> 'b option) -> 'a list -> 'b) = fun p -> function
   | x::xs -> (match p x with None -> return_when p xs | Some b -> b)
 
 let rec splitAt n xs = 
-  if n = 0 then ([],xs)
+  if n =|= 0 then ([],xs)
   else 
     (match xs with
     | []      -> ([],[])
@@ -3882,9 +3915,9 @@ let rec splitAt n xs =
 let pack n xs = 
   let rec pack_aux l i = function
     | [] -> failwith "not on a boundary"
-    | [x] -> if i = n then [l++[x]] else failwith "not on a boundary"
+    | [x] -> if i =|= n then [l++[x]] else failwith "not on a boundary"
     | x::xs -> 
-        if i = n 
+        if i =|= n 
         then (l++[x])::(pack_aux [] 1 xs) 
         else pack_aux (l++[x]) (i+1) xs 
   in
@@ -3959,7 +3992,7 @@ let rec (get_pair: ('a list) -> (('a * 'a) list)) = function
 let rang elem liste =
   let rec rang_rec elem accu = function
     | []   -> raise Not_found
-    | a::l -> if a = elem then accu
+    | a::l -> if a =*= elem then accu
     else rang_rec elem (accu+1) l in
   rang_rec elem 1 liste
 
@@ -4000,7 +4033,7 @@ let rec uncons_permut xs =
   indexed +> List.map (fun (x, pos) -> (x, pos),  remove_elem_pos pos xs)
 let _ = 
   example 
-    (uncons_permut ['a';'b';'c'] = 
+    (uncons_permut ['a';'b';'c'] =*= 
      [('a', 0),  ['b';'c'];
       ('b', 1),  ['a';'c'];
       ('c', 2),  ['a';'b']
@@ -4056,7 +4089,7 @@ let pack_sorted same xs =
          if same (List.hd cur) y then pack_s_aux (y::cur, rest) ys
          else pack_s_aux ([y], cur::rest) ys
     in pack_s_aux ([List.hd xs],[]) (List.tl xs) +> List.rev
-let test = pack_sorted (=) [1;1;1;2;2;3;4]
+let test = pack_sorted (=*=) [1;1;1;2;2;3;4]
 
 
 let rec keep_best f = 
@@ -4103,8 +4136,8 @@ let sort_by_key_highfirst xs =
 let sort_by_key_lowfirst xs = 
   sort_prof (fun (k1,v1) (k2,v2) -> compare k1 k2) xs
 
-let _ = example (sort_by_key_lowfirst [4, (); 7,()] = [4,(); 7,()])
-let _ = example (sort_by_key_highfirst [4,(); 7,()] = [7,(); 4,()])
+let _ = example (sort_by_key_lowfirst [4, (); 7,()] =*= [4,(); 7,()])
+let _ = example (sort_by_key_highfirst [4,(); 7,()] =*= [7,(); 4,()])
 
 
 let sortgen_by_key_highfirst xs = 
@@ -4180,13 +4213,33 @@ let rec fusionneListeContenant (et1, et2) = function
 (* Arrays *)
 (*****************************************************************************)
 
+(* do bound checking ? *)
 let array_find_index f a =
+  let rec array_find_index_ i =
+    if f i then i else array_find_index_ (i+1)
+  in
+  try array_find_index_ 0 with _ -> raise Not_found
+
+let array_find_index_via_elem f a =
   let rec array_find_index_ i =
     if f a.(i) then i else array_find_index_ (i+1)
   in
   try array_find_index_ 0 with _ -> raise Not_found
 
 
+
+type idx = Idx of int 
+let next_idx (Idx i) = (Idx (i+1))
+let int_of_idx (Idx i) = i
+
+let array_find_index_typed f a =
+  let rec array_find_index_ i =
+    if f i then i else array_find_index_ (next_idx i)
+  in
+  try array_find_index_ (Idx 0) with _ -> raise Not_found
+
+
+
 (*****************************************************************************)
 (* Matrix *)
 (*****************************************************************************)
@@ -4257,8 +4310,8 @@ let ex_columns1 =
     [1;4;7];
     [2;5;8];
   ]
-let _ = example (rows_of_matrix ex_matrix1 = ex_rows1)
-let _ = example (columns_of_matrix ex_matrix1 = ex_columns1)
+let _ = example (rows_of_matrix ex_matrix1 =*= ex_rows1)
+let _ = example (columns_of_matrix ex_matrix1 =*= ex_columns1)
 
 
 (*****************************************************************************)
@@ -4289,6 +4342,7 @@ let bigarray_string_of_c_layout a = "<>"
 (* Set. Have a look too at set*.mli  *)
 (*****************************************************************************)
 type 'a set = 'a list
+  (* with sexp *)
 
 let (empty_set: 'a set) = []
 let (insert_set: 'a -> 'a set -> 'a set) = fun x xs -> 
@@ -4419,12 +4473,13 @@ let rec intersect x y =
 (* Assoc *)
 (*****************************************************************************)
 type ('a,'b) assoc  = ('a * 'b) list
+  (* with sexp *)
 
 
 let (assoc_to_function: ('a, 'b) assoc -> ('a -> 'b)) = fun xs ->
   xs +> List.fold_left (fun acc (k, v) -> 
     (fun k' -> 
-      if k = k' then v else acc k'
+      if k =*= k' then v else acc k'
     )) (fun k -> failwith "no key in this assoc")
 (* simpler: 
 let (assoc_to_function: ('a, 'b) assoc -> ('a -> 'b)) = fun xs ->
@@ -4475,7 +4530,8 @@ let (lookup_list2: 'a -> ('a , 'b) assoc list -> ('b * int)) = fun el xxs ->
       with Not_found -> lookup_l_aux (i+1) xxs
   in lookup_l_aux 0 xxs
 
-let _ = example (lookup_list2 "c" [["a",1;"b",2];["a",1;"b",3];["a",1;"c",7]] = (7,2))
+let _ = example 
+  (lookup_list2 "c" [["a",1;"b",2];["a",1;"b",3];["a",1;"c",7]] =*= (7,2))
 
 
 let assoc_option  k l = 
@@ -4543,7 +4599,7 @@ let _  =
   let h = Hashtbl.create 101 in
   Hashtbl.add h "toto" 1; 
   Hashtbl.add h "toto" 1;
-  assert(hash_to_list h = ["toto",1; "toto",1])
+  assert(hash_to_list h =*= ["toto",1; "toto",1])
  
 
 let hfind_default key value_if_not_found h = 
@@ -4569,6 +4625,7 @@ let hfind_option key h =
 (*****************************************************************************)
 
 type 'a hashset = ('a, bool) Hashtbl.t 
+  (* with sexp *)
 
 
 let hash_hashset_add k e h = 
@@ -4654,6 +4711,7 @@ let diff_two_say_set_eff xs1 xs2 =
 (* Stack *)
 (*****************************************************************************)
 type 'a stack = 'a list
+  (* with sexp *)
 
 let (empty_stack: 'a stack) = []
 let (push: 'a -> 'a stack -> 'a stack) = fun x xs -> x::xs
@@ -4743,38 +4801,51 @@ let rec (tree_iter: ('a -> unit) -> 'a tree -> unit) = fun f tree ->
 (* N-ary tree with updatable childrens *)
 (*****************************************************************************)
 
-(* Leaf can seem redundant, but sometimes want to directly see if 
- * a children is a leaf without looking if the list is empty.
- *)
-type ('a, 'b) treeref = 
-  | NodeRef of 'a * ('a, 'b) treeref list ref 
-  | LeafRef of 'b
+(* no empty tree, must have one root at list *)
+
+type 'a treeref = 
+  | NodeRef of 'a * 'a treeref list ref 
 
 let treeref_children_ref tree = 
   match tree with
-  | LeafRef _ -> failwith "treeref_tail: leaf"
   | NodeRef (n, x) -> x
 
 
 
 let rec (treeref_node_iter: 
-   (('a * ('a, 'b) treeref list ref) -> unit) -> 
-   ('a, 'b) treeref -> unit) = 
+(*   (('a * ('a, 'b) treeref list ref) -> unit) -> 
+   ('a, 'b) treeref -> unit
+*) 'a) 
+ = 
  fun f tree -> 
   match tree with
-  | LeafRef _ -> ()
+(*  | LeafRef _ -> ()*)
   | NodeRef (n, xs) -> 
       f (n, xs);
       !xs +> List.iter (treeref_node_iter f)
 
 
+let find_treeref f tree = 
+  let res = ref [] in
+
+  tree +> treeref_node_iter (fun (n, xs) -> 
+    if f (n,xs)
+    then push2 (n, xs) res;
+  );
+  match !res with
+  | [n,xs] -> NodeRef (n, xs)
+  | [] -> raise Not_found
+  | x::y::zs -> raise Multi_found
+
 let rec (treeref_node_iter_with_parents: 
-   (('a * ('a, 'b) treeref list ref) -> ('a list) -> unit) -> 
-   ('a, 'b) treeref -> unit) = 
+ (*  (('a * ('a, 'b) treeref list ref) -> ('a list) -> unit) -> 
+   ('a, 'b) treeref -> unit) 
+ *) 'a)
+ = 
  fun f tree -> 
   let rec aux acc tree = 
     match tree with
-    | LeafRef _ -> ()
+(*    | LeafRef _ -> ()*)
     | NodeRef (n, xs) -> 
         f (n, xs) acc ;
         !xs +> List.iter (aux (n::acc))
@@ -4782,19 +4853,73 @@ let rec (treeref_node_iter_with_parents:
   aux [] tree
 
 
-let find_treeref f tree = 
+(* ---------------------------------------------------------------------- *)
+(* Leaf can seem redundant, but sometimes want to directly see if 
+ * a children is a leaf without looking if the list is empty.
+ *)
+type ('a, 'b) treeref2 = 
+  | NodeRef2 of 'a * ('a, 'b) treeref2 list ref 
+  | LeafRef2 of 'b
+
+
+let treeref2_children_ref tree = 
+  match tree with
+  | LeafRef2 _ -> failwith "treeref_tail: leaf"
+  | NodeRef2 (n, x) -> x
+
+
+
+let rec (treeref_node_iter2: 
+   (('a * ('a, 'b) treeref2 list ref) -> unit) -> 
+   ('a, 'b) treeref2 -> unit) = 
+ fun f tree -> 
+  match tree with
+  | LeafRef2 _ -> ()
+  | NodeRef2 (n, xs) -> 
+      f (n, xs);
+      !xs +> List.iter (treeref_node_iter2 f)
+
+
+let find_treeref2 f tree = 
   let res = ref [] in
 
-  tree +> treeref_node_iter (fun (n, xs) -> 
+  tree +> treeref_node_iter2 (fun (n, xs) -> 
     if f (n,xs)
     then push2 (n, xs) res;
   );
   match !res with
-  | [n,xs] -> NodeRef (n, xs)
+  | [n,xs] -> NodeRef2 (n, xs)
   | [] -> raise Not_found
   | x::y::zs -> raise Multi_found
 
 
+
+
+let rec (treeref_node_iter_with_parents2: 
+  (('a * ('a, 'b) treeref2 list ref) -> ('a list) -> unit) -> 
+   ('a, 'b) treeref2 -> unit) = 
+ fun f tree -> 
+  let rec aux acc tree = 
+    match tree with
+    | LeafRef2 _ -> ()
+    | NodeRef2 (n, xs) -> 
+        f (n, xs) acc ;
+        !xs +> List.iter (aux (n::acc))
+  in
+  aux [] tree
+
+
+
+
+
+
+
+
+
+
+
+
+
 let find_treeref_with_parents_some f tree = 
   let res = ref [] in
 
@@ -4846,13 +4971,13 @@ let (add_arc: ('a * 'a) -> 'a graph -> 'a graph) = fun arc (nodes, arcs) ->
   (nodes, set [arc] $+$ arcs)
 
 let (del_arc: ('a * 'a) -> 'a graph -> 'a graph) = fun arc (nodes, arcs) -> 
-  (nodes, arcs +> List.filter (fun a -> not (arc = a)))
+  (nodes, arcs +> List.filter (fun a -> not (arc =*= a)))
 
 let (successors: 'a -> 'a graph -> 'a set) = fun x (nodes, arcs) -> 
-  arcs +> List.filter (fun (src, dst) -> src = x) +> List.map snd
+  arcs +> List.filter (fun (src, dst) -> src =*= x) +> List.map snd
 
 let (predecessors: 'a -> 'a graph -> 'a set) = fun x (nodes, arcs) -> 
-  arcs +> List.filter (fun (src, dst) -> dst = x) +> List.map fst
+  arcs +> List.filter (fun (src, dst) -> dst =*= x) +> List.map fst
 
 let (nodes: 'a graph -> 'a set) = fun (nodes, arcs) -> nodes
 
@@ -4990,10 +5115,10 @@ let big_union f xs = xs +> map f +> fold union_set empty_set
 let empty_list = []
 let sort = List.sort
 let length = List.length
-let null xs = match xs with [] -> true | _ -> false
+(* in prelude now: let null xs = match xs with [] -> true | _ -> false *)
 let head = List.hd
 let tail = List.tl
-let is_singleton = fun xs -> List.length xs = 1
+let is_singleton = fun xs -> List.length xs =|= 1
 
 (*****************************************************************************)
 (* Geometry (raytracer) *)
@@ -5168,6 +5293,7 @@ type parse_info = {
     column: int;
     file: filename;
   } 
+  (* with sexp *)
 
 let fake_parse_info = { 
   charpos = -1; str = "";
@@ -5196,7 +5322,7 @@ let (info_from_charpos2: int -> filename -> (int * int * string)) =
   let rec charpos_to_pos_aux last_valid =
     let s =
       try Some (input_line chan)
-      with End_of_file when charpos = last_valid -> None in
+      with End_of_file when charpos =|= last_valid -> None in
     incr linen;
     match s with
       Some s ->
@@ -5322,20 +5448,18 @@ let error_message_short = fun filename (lexeme, lexstart) ->
  *)
 
 type score_result = Ok | Pb of string 
+ (* with sexp *)
 type score = (string (* usually a filename *), score_result) Hashtbl.t
+ (* with sexp *)
+type score_list = (string (* usually a filename *) * score_result) list
+ (* with sexp *)
 
 let empty_score () = (Hashtbl.create 101 : score)
 
 
 
-let regression_testing newscore best_score_file = 
+let regression_testing_vs newscore bestscore = 
 
-  pr2 ("regression file: "^ best_score_file);
-  let (bestscore : score) = 
-    if not (Sys.file_exists best_score_file)
-    then write_value (empty_score()) best_score_file;
-    get_value best_score_file 
-  in
   let newbestscore = empty_score () in
 
   let allres = 
@@ -5369,7 +5493,7 @@ let regression_testing newscore best_score_file =
               Hashtbl.add newbestscore res Ok
           | Pb x, Pb y -> 
               Hashtbl.add newbestscore res (Pb x);
-              if not (x = y)
+              if not (x =$= y)
               then begin 
                 Printf.printf
                  "Semipb: still error but not same error : %s\n" res;
@@ -5378,29 +5502,52 @@ let regression_testing newscore best_score_file =
               end
           )
     );
-    write_value newbestscore (best_score_file ^ ".old");
-    write_value newbestscore best_score_file;
     flush stdout; flush stderr;
+    newbestscore
   end
 
+let regression_testing newscore best_score_file = 
+
+  pr2 ("regression file: "^ best_score_file);
+  let (bestscore : score) = 
+    if not (Sys.file_exists best_score_file)
+    then write_value (empty_score()) best_score_file;
+    get_value best_score_file 
+  in
+  let newbestscore = regression_testing_vs newscore bestscore in
+  write_value newbestscore (best_score_file ^ ".old");
+  write_value newbestscore best_score_file;
+  ()
+
+
+
+
 let string_of_score_result v = 
   match v with 
   | Ok -> "Ok" 
   | Pb s -> "Pb: " ^ s
 
-let print_score score = 
-  score +> hash_to_list +> List.iter (fun (k, v) -> 
-    pr2 (sprintf "% s --> %s" k (string_of_score_result v))
-  );
+let total_scores score = 
+  let total = hash_to_list score +> List.length in
+  let good  = hash_to_list score +> List.filter
+    (fun (s, v) -> v =*= Ok) +> List.length in
+  good, total
+   
+
+let print_total_score score = 
   pr2 "--------------------------------";
   pr2 "total score";
   pr2 "--------------------------------";
-  let total = hash_to_list score +> List.length in
-  let good  = hash_to_list score +> List.filter 
-    (fun (s, v) -> v = Ok) +> List.length 
-  in
+  let (good, total) = total_scores score in
   pr2 (sprintf "good = %d/%d" good total)
 
+let print_score score = 
+  score +> hash_to_list +> List.iter (fun (k, v) -> 
+    pr2 (sprintf "% s --> %s" k (string_of_score_result v))
+  );
+  print_total_score score;
+  ()
+
 
 (*****************************************************************************)
 (* Scope managment (cocci) *)
@@ -5435,7 +5582,7 @@ let rec lookup_env k env =
   | [] -> raise Not_found
   | []::zs -> lookup_env k zs
   | ((k',v)::xs)::zs -> 
-      if k = k'
+      if k =*= k'
       then v 
       else lookup_env k (xs::zs)
 
@@ -5721,7 +5868,7 @@ let main_boilerplate f =
        * Common.debugger will be set in main(), so too late, so 
        * have to be quicker
        *)
-      if Sys.argv +> Array.to_list +> List.exists (fun x -> x ="-debugger")
+      if Sys.argv +> Array.to_list +> List.exists (fun x -> x =$= "-debugger")
       then debugger := true;
 
       finalize          (fun ()-> 
index d6d9b63..5bbdcfc 100644 (file)
@@ -239,13 +239,18 @@ val _list_bool : (string * bool) list ref
 val example3 : string -> bool -> unit
 val test_all : unit -> unit
 
+
 (* regression testing *)
 type score_result = Ok | Pb of string 
-type score = (string (* usually a filename *), score_result) Hashtbl.t
+type score =      (string (* usually a filename *), score_result) Hashtbl.t
+type score_list = (string (* usually a filename *) * score_result) list
 val empty_score : unit -> score
 val regression_testing : 
   score -> filename (* old score file on disk (usually in /tmp) *) -> unit
+val regression_testing_vs: score -> score -> score
+val total_scores : score -> int (* good *) * int (* total *)
 val print_score : score -> unit
+val print_total_score: score -> unit
 
 
 (* quickcheck spirit *)
@@ -463,6 +468,11 @@ val exn_to_s : exn -> string
 (* alias *)
 val string_of_exn : exn -> string
 
+type error = Error of string 
+
+type evotype = unit
+val evoval : evotype
+
 (*****************************************************************************)
 (* Environment *)
 (*****************************************************************************)
@@ -564,7 +574,7 @@ val (=*=): 'a -> 'a -> bool
 
 (* if want to restrict the use of '=', uncomment this:
  *
- * val (=): int -> int -> bool
+ * val (=): unit -> unit -> bool
  * 
  * But it will not forbid you to use caml functions like List.find, List.mem
  * which internaly use this convenient but evolution-unfriendly (=)
@@ -572,7 +582,6 @@ val (=*=): 'a -> 'a -> bool
 
 
 
-
 (*###########################################################################*)
 (* And now basic types *)
 (*###########################################################################*)
@@ -1168,14 +1177,15 @@ val drop_until : ('a -> bool) -> 'a list -> 'a list
 val span : ('a -> bool) -> 'a list -> 'a list * 'a list
 
 val skip_until : ('a list -> bool) -> 'a list -> 'a list
-val skipfirst : 'a -> 'a list -> 'a list
+val skipfirst : (* Eq a *) 'a -> 'a list -> 'a list
 
 (* cf also List.partition *)
 val fpartition : ('a -> 'b option) -> 'a list -> 'b list * 'a list
 
 val groupBy : ('a -> 'a -> bool) -> 'a list -> 'a list list
 val exclude_but_keep_attached: ('a -> bool) -> 'a list -> ('a * 'a list) list
-val group_by_post: ('a -> bool) -> 'a list -> ('a list * 'a) list * 'a list
+val group_by_post: ('a -> bool) -> 'a list -> ('a list * 'a) list *    'a list
+val group_by_pre:  ('a -> bool) -> 'a list -> 'a list *    ('a * 'a list) list
 val group_by_mapped_key: ('a -> 'b) -> 'a list -> ('b * 'a list) list
 
 (* Use hash internally to not be in O(n2). If you want to use it on a
@@ -1208,7 +1218,7 @@ val filter_index : (int -> 'a -> bool) -> 'a list -> 'a list
 val fold_left_with_index : ('a -> 'b -> int -> 'a) -> 'a -> 'b list -> 'a
 
 val nth : 'a list -> int -> 'a
-val rang : 'a -> 'a list -> int
+val rang : (* Eq a *) 'a -> 'a list -> int
 
 val last_n : int -> 'a list -> 'a list
 
@@ -1279,7 +1289,7 @@ val minimum : 'a list -> 'a
 val min_with : ('a -> 'b) -> 'a list -> 'a
 val two_mins_with : ('a -> 'b) -> 'a list -> 'a * 'a
 
-val all_assoc : 'a -> ('a * 'b) list -> 'b list
+val all_assoc : (* Eq a *) 'a -> ('a * 'b) list -> 'b list
 val prepare_want_all_assoc : ('a * 'b) list -> ('a * 'b list) list
 
 val or_list : bool list -> bool
@@ -1328,7 +1338,17 @@ val fusionneListeContenant : 'a * 'a -> 'a list list -> 'a list list
 (* Arrays *)
 (*****************************************************************************)
 
-val array_find_index : ('a -> bool) -> 'a array -> int
+val array_find_index : (int -> bool) -> 'a array -> int
+val array_find_index_via_elem : ('a -> bool) -> 'a array -> int
+
+(* for better type checking, as sometimes when have an 'int array', can
+ * easily mess up the index from the value.
+ *)
+type idx = Idx of int 
+val next_idx: idx -> idx
+val int_of_idx: idx -> int
+
+val array_find_index_typed : (idx -> bool) -> 'a array -> idx
 
 (*****************************************************************************)
 (* Matrix *)
@@ -1449,7 +1469,7 @@ module StringSet = Set.Make(struct type t = string let compare = compare end)
 
 type ('a, 'b) assoc = ('a * 'b) list
 
-val assoc_to_function : ('a, 'b) assoc -> ('a -> 'b)
+val assoc_to_function : (* Eq a *) ('a, 'b) assoc -> ('a -> 'b)
 
 val empty_assoc : ('a, 'b) assoc
 val fold_assoc : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a
@@ -1632,22 +1652,53 @@ val tree_iter : ('a -> unit) -> 'a tree -> unit
 (* N-ary tree with updatable childrens *)
 (*****************************************************************************)
 
-(* Leaf can seem redundant, but sometimes want to directly see if 
- * a children is a leaf without looking if the list is empty.
- *)
-type ('a, 'b) treeref = 
-  | NodeRef of 'a * ('a, 'b) treeref list ref 
-  | LeafRef of 'b
+(* no empty tree, must have one root at least *)
+type 'a treeref = 
+  | NodeRef of 'a *   'a treeref list ref 
 
 val treeref_node_iter: 
-  (('a * ('a, 'b) treeref list ref) -> unit) -> ('a, 'b) treeref -> unit
+  (('a * 'a treeref list ref) -> unit) -> 'a treeref -> unit
 val treeref_node_iter_with_parents: 
-  (('a * ('a, 'b) treeref list ref) -> ('a list) -> unit) -> 
-  ('a, 'b) treeref -> unit
+  (('a * 'a treeref list ref) -> ('a list) -> unit) -> 
+  'a treeref -> unit
 
 val find_treeref: 
-  (('a * ('a, 'b) treeref list ref) -> bool) -> 
-  ('a, 'b) treeref -> ('a, 'b) treeref
+  (('a * 'a treeref list ref) -> bool) -> 
+  'a treeref -> 'a treeref
+
+val treeref_children_ref: 
+  'a treeref -> 'a treeref list ref 
+
+val find_treeref_with_parents_some:
+ ('a * 'a treeref list ref -> 'a list -> 'c option) ->
+ 'a treeref -> 'c
+
+val find_multi_treeref_with_parents_some:
+ ('a * 'a treeref list ref -> 'a list -> 'c option) ->
+ 'a treeref -> 'c list
+
+
+(* Leaf can seem redundant, but sometimes want to directly see if 
+ * a children is a leaf without looking if the list is empty.
+ *)
+type ('a, 'b) treeref2 = 
+  | NodeRef2 of 'a * ('a, 'b) treeref2 list ref 
+  | LeafRef2 of 'b
+
+
+val find_treeref2: 
+  (('a * ('a, 'b) treeref2 list ref) -> bool) -> 
+  ('a, 'b) treeref2 -> ('a, 'b) treeref2
+
+val treeref_node_iter_with_parents2: 
+  (('a * ('a, 'b) treeref2 list ref) -> ('a list) -> unit) -> 
+  ('a, 'b) treeref2 -> unit
+
+val treeref_node_iter2: 
+  (('a * ('a, 'b) treeref2 list ref) -> unit) -> ('a, 'b) treeref2 -> unit
+
+(*
+
 
 val treeref_children_ref: ('a, 'b) treeref -> ('a, 'b) treeref list ref 
 
@@ -1658,7 +1709,7 @@ val find_treeref_with_parents_some:
 val find_multi_treeref_with_parents_some:
  ('a * ('a, 'b) treeref list ref -> 'a list -> 'c option) ->
  ('a, 'b) treeref -> 'c list
-
+*)
 
 (*****************************************************************************)
 (* Graph. But have a look too at Ograph_*.mli; it's better *)
@@ -1856,7 +1907,7 @@ val error_messagebis : filename -> (string * int) -> int -> string
 (* for example of use, see the code used in coccinelle *)
 type ('a, 'b) scoped_env = ('a, 'b) assoc list
 
-val lookup_env : 'a -> ('a, 'b) scoped_env -> 'b
+val lookup_env : (* Eq a *) 'a -> ('a, 'b) scoped_env -> 'b
 val member_env_key : 'a -> ('a, 'b) scoped_env -> bool
 
 val new_scope : ('a, 'b) scoped_env ref -> unit
diff --git a/commons/features.ml.cpp b/commons/features.ml.cpp
new file mode 100644 (file)
index 0000000..f7c1095
--- /dev/null
@@ -0,0 +1,65 @@
+(* yes sometimes cpp is useful *)
+
+(* old:
+note: in addition to Makefile.config, globals/config.ml is also modified
+by configure
+features.ml: features.ml.cpp Makefile.config
+       cpp -DFEATURE_GUI=$(FEATURE_GUI) \
+            -DFEATURE_MPI=$(FEATURE_MPI) \
+           -DFEATURE_PCRE=$(FEATURE_PCRE) \
+          features.ml.cpp > features.ml
+
+clean::
+       rm -f features.ml
+
+beforedepend:: features.ml
+
+*)
+
+#if FEATURE_MPI==1
+
+module Distribution = struct
+  let under_mpirun () = 
+    Distribution.under_mpirun()
+      
+  let mpi_main2 ?debug_mpi map_ex reduce_ex fxs = 
+    Distribution.mpi_main2 debug_mpi map_ex reduce_ex fxs
+
+  let mpi_adjust_argv argv = 
+    Distribution.mpi_adjust_argv argv
+end
+
+#else 
+
+module Distribution = struct
+  let under_mpirun () = 
+    false
+      
+  let mpi_main2 ?debug_mpi map_ex reduce_ex fxs = 
+    let res = List.map map_ex (fxs()) in
+    reduce_ex res
+
+  let mpi_adjust_argv argv = 
+    argv
+end
+
+#endif
+
+
+#if FEATURE_REGEXP_PCRE==1
+#else
+#endif
+
+#if FEATURE_BACKTRACE==1
+module Backtrace = struct
+ let print () = 
+   Backtrace.print ()
+end
+#else
+
+module Backtrace = struct
+ let print () = 
+   print_string "no backtrace support, use configure --with-backtrace\n"
+end
+
+#endif
index fdbddc6..fe727ed 100644 (file)
@@ -16,7 +16,7 @@ class ['a,'b] oassocb xs =
 
     method del (k,v) = {< data = Mapb.remove k data >}
     method mem e = raise Todo
-    method null = (Mapb.height data = 0)
+    method null = (Mapb.height data =|= 0)
 
     method assoc k = Mapb.find k data
     method delkey k = {< data = Mapb.remove k data >}
index 064d8c4..5116627 100644 (file)
@@ -19,14 +19,14 @@ object(o: 'o)
 
   (* is_intersect, equal, subset *)
   method is_subset_of: 'o -> bool = fun o2 -> 
-    ((o2#minus o)#cardinal >= 0) && ((o#minus o2)#cardinal = 0)
+    ((o2#minus o)#cardinal >= 0) && ((o#minus o2)#cardinal =|= 0)
 
   method is_equal: 'o -> bool = fun o2 -> 
-    ((o2#minus o)#cardinal = 0) && ((o#minus o2)#cardinal = 0)
+    ((o2#minus o)#cardinal =|= 0) && ((o#minus o2)#cardinal =|= 0)
       
 
   method is_singleton: bool = (* can be short circuited *)
-    o#length = 1
+    o#length =|= 1
   method cardinal: int = (* just to keep naming conventions *)
     o#length 
       (* dont work: 
diff --git a/commons/readme.txt b/commons/readme.txt
new file mode 100644 (file)
index 0000000..4478613
--- /dev/null
@@ -0,0 +1,30 @@
+
+This directory builds a common.cma library and also optionally
+multiple commons_xxx.cma small libraries. The reason not to just build
+a single one is that some functionnalities require external libraries
+(like Berkeley DB, MPI, etc) or special version of OCaml (like for the
+backtrace support) and I don't want to penalize the user by forcing
+him to install all those libs before being able to use some of my
+common helper functions. So, common.ml and other files offer
+convenient helpers that do not require to install anything. In some
+case I have directly included the code of those external libs when
+there are simple such as for ANSITerminal in ocamlextra/, and for
+dumper.ml I have even be further by inlining its code in common.ml so
+one can just do a open Common and have everything. Then if the user
+wants to, he can also leverage the other commons_xxx libraries by
+explicitely building them after he has installed the necessary
+external files.
+
+For many configurable things we can use some flags in ml files, 
+and have some -xxx command line argument to set them or not,
+but for other things flags are not enough as they will not remove
+the header and linker dependencies in Makefiles. A solution is
+to use cpp and pre-process many files that have such configuration
+issue. Another solution is to centralize all the cpp issue in one
+file, features.ml.cpp, that acts as a generic wrapper for other
+librairies and depending on the configuration actually call 
+the external library or provide a fake empty services indicating
+that the service is not present. 
+So you should have a ../configure that call cpp on features.ml.cpp
+to set those linking-related configuration settings.
+
index f9ba591..8313657 100644 (file)
@@ -46,9 +46,10 @@ let empty = []
 
 let pack newi j = function
   | [] -> [Interv (newi,j)]
-  | (Exact z)::xs -> (Interv (newi, j))::(if newi = z then xs else (Exact z)::xs)
+  | (Exact z)::xs -> 
+      (Interv (newi, j))::(if newi =|= z then xs else (Exact z)::xs)
   | (Interv (i', j'))::xs -> 
-      if newi = j' 
+      if newi =|= j' 
       then (Interv (i', j))::xs  (* merge *)
       else (Interv (newi, j))::(Interv (i', j'))::xs
         
@@ -58,19 +59,19 @@ let rec (add2: int -> seti -> seti) = fun x -> function
   | [] -> [Exact x]
   | (Exact i)::xs when x > i+1 -> (Exact x)::(Exact i)::xs
   | (Interv (i,j)::xs) when x > j+1 -> (Exact x)::(Interv (i,j))::xs
-  | (Interv (i,j)::xs) when x = j+1 -> (Interv (i,x))::xs
-  | (Exact i)::xs when x = i+1 -> (Interv (i,x))::xs
+  | (Interv (i,j)::xs) when x =|= j+1 -> (Interv (i,x))::xs
+  | (Exact i)::xs when x =|= i+1 -> (Interv (i,x))::xs
       
-  | (Exact i)::xs when i = x   -> (Exact i)::xs
+  | (Exact i)::xs when i =|= x   -> (Exact i)::xs
   | (Interv (i,j)::xs) when x <= j && x >= i -> (Interv (i,j))::xs
   | other -> 
 (*         let _ = log "Cache miss" in *)
       let _ = count2 () in
       (match other with
-      |       (Exact i)::xs when x = i-1 -> pack x i xs 
+      |       (Exact i)::xs when x =|= i-1 -> pack x i xs 
       |       (Exact i)::xs when x < i-1 -> (Exact i)::add x xs
                 
-      |       (Interv (i,j)::xs) when x = i-1 -> pack x j xs
+      |       (Interv (i,j)::xs) when x =|= i-1 -> pack x j xs
       |       (Interv (i,j)::xs) when x < i-1 -> (Interv (i,j))::add x xs
       |       _ -> raise Impossible
       )
@@ -89,9 +90,9 @@ let intervise = function
   | Exact x -> Interv (x,x)
   | y -> y
 let exactize = function
-  | Interv (i,j) when i = j -> Exact i
+  | Interv (i,j) when i =|= j -> Exact i
   | y -> y
-let exactize2 x y = if x = y then Exact x else Interv (x,y)
+let exactize2 x y = if x =|= y then Exact x else Interv (x,y)
 
 
 let rec (remove: int -> seti -> seti) = fun x xs -> 
@@ -110,8 +111,8 @@ let rec (remove: int -> seti -> seti) = fun x xs ->
           (
             let _ = assert (j > i) in (* otherwise can lead to construct seti such as [7,6] when removing 6 from [6,6] *)
             match () with
-            | _ when x = i -> [exactize2 (i+1) j]
-            | _ when x = j -> [exactize2 i (j-1)]
+            | _ when x =|= i -> [exactize2 (i+1) j]
+            | _ when x =|= j -> [exactize2 i (j-1)]
             | _ -> [exactize2 (x+1) j; exactize2 i (x-1)]
           ) @ zs
       else (Interv (i,j))::remove x zs
@@ -146,7 +147,7 @@ let iter f xs = xs +> List.iter
   | Interv (i, j) -> for k = i to j do f k done
   )
         
-let is_empty xs = xs = []
+let is_empty xs = xs =*= []
 let choose = function
   | [] -> failwith "not supposed to be called with empty set"
   | (Exact i)::xs -> i
@@ -328,7 +329,7 @@ let rec debug = function
 let patch1 xs = List.map exactize xs
 let patch2 xs = xs +> List.map (fun e -> 
   match e with
-  | Interv (i,j) when i > j && i = j+1 -> 
+  | Interv (i,j) when i > j && i =|= j+1 -> 
       let _ = pr2 (sprintf "i = %d, j = %d" i j) in
       Exact i
   | e -> e
@@ -338,7 +339,7 @@ let patch3 xs =
     xs +> List.fold_left (fun (min,acc) e -> 
       match e with 
       | Exact i -> 
-          if i = min 
+          if i =|= min 
           then (min, acc)
           else (i, (Exact i)::acc)
       | Interv (i,j) -> 
diff --git a/commons/sexp_common.ml b/commons/sexp_common.ml
new file mode 100644 (file)
index 0000000..208d760
--- /dev/null
@@ -0,0 +1,319 @@
+(* automatically generated by ocamltarzan *)
+
+open Common
+
+let either_of_sexp__ =
+  let _loc = "Xxx.either"
+  in
+    fun _of_a _of_b ->
+      function
+      | (Sexp.List (Sexp.Atom (("left" | "Left" as tag)) :: sexp_args) as
+         sexp) ->
+          (match sexp_args with
+           | [ v1 ] -> let v1 = _of_a v1 in Left v1
+           | _ -> Conv_error.stag_incorrect_n_args _loc tag sexp)
+      | (Sexp.List (Sexp.Atom (("right" | "Right" as tag)) :: sexp_args) as
+         sexp) ->
+          (match sexp_args with
+           | [ v1 ] -> let v1 = _of_b v1 in Right v1
+           | _ -> Conv_error.stag_incorrect_n_args _loc tag sexp)
+      | (Sexp.Atom ("left" | "Left") as sexp) ->
+          Conv_error.stag_takes_args _loc sexp
+      | (Sexp.Atom ("right" | "Right") as sexp) ->
+          Conv_error.stag_takes_args _loc sexp
+      | (Sexp.List (Sexp.List _ :: _) as sexp) ->
+          Conv_error.nested_list_invalid_sum _loc sexp
+      | (Sexp.List [] as sexp) -> Conv_error.empty_list_invalid_sum _loc sexp
+      | sexp -> Conv_error.unexpected_stag _loc sexp
+  
+let either_of_sexp _of_a _of_b sexp = either_of_sexp__ _of_a _of_b sexp
+  
+let sexp_of_either _of_a _of_b =
+  function
+  | Left v1 -> let v1 = _of_a v1 in Sexp.List [ Sexp.Atom "Left"; v1 ]
+  | Right v1 -> let v1 = _of_b v1 in Sexp.List [ Sexp.Atom "Right"; v1 ]
+  
+let either3_of_sexp__ =
+  let _loc = "Xxx.either3"
+  in
+    fun _of_a _of_b _of_c ->
+      function
+      | (Sexp.List (Sexp.Atom (("left3" | "Left3" as tag)) :: sexp_args) as
+         sexp) ->
+          (match sexp_args with
+           | [ v1 ] -> let v1 = _of_a v1 in Left3 v1
+           | _ -> Conv_error.stag_incorrect_n_args _loc tag sexp)
+      | (Sexp.List (Sexp.Atom (("middle3" | "Middle3" as tag)) :: sexp_args)
+         as sexp) ->
+          (match sexp_args with
+           | [ v1 ] -> let v1 = _of_b v1 in Middle3 v1
+           | _ -> Conv_error.stag_incorrect_n_args _loc tag sexp)
+      | (Sexp.List (Sexp.Atom (("right3" | "Right3" as tag)) :: sexp_args) as
+         sexp) ->
+          (match sexp_args with
+           | [ v1 ] -> let v1 = _of_c v1 in Right3 v1
+           | _ -> Conv_error.stag_incorrect_n_args _loc tag sexp)
+      | (Sexp.Atom ("left3" | "Left3") as sexp) ->
+          Conv_error.stag_takes_args _loc sexp
+      | (Sexp.Atom ("middle3" | "Middle3") as sexp) ->
+          Conv_error.stag_takes_args _loc sexp
+      | (Sexp.Atom ("right3" | "Right3") as sexp) ->
+          Conv_error.stag_takes_args _loc sexp
+      | (Sexp.List (Sexp.List _ :: _) as sexp) ->
+          Conv_error.nested_list_invalid_sum _loc sexp
+      | (Sexp.List [] as sexp) -> Conv_error.empty_list_invalid_sum _loc sexp
+      | sexp -> Conv_error.unexpected_stag _loc sexp
+  
+let either3_of_sexp _of_a _of_b _of_c sexp =
+  either3_of_sexp__ _of_a _of_b _of_c sexp
+  
+let sexp_of_either3 _of_a _of_b _of_c =
+  function
+  | Left3 v1 -> let v1 = _of_a v1 in Sexp.List [ Sexp.Atom "Left3"; v1 ]
+  | Middle3 v1 -> let v1 = _of_b v1 in Sexp.List [ Sexp.Atom "Middle3"; v1 ]
+  | Right3 v1 -> let v1 = _of_c v1 in Sexp.List [ Sexp.Atom "Right3"; v1 ]
+  
+let filename_of_sexp__ =
+  let _loc = "Xxx.filename" in fun sexp -> Conv.string_of_sexp sexp
+  
+let filename_of_sexp sexp =
+  try filename_of_sexp__ sexp
+  with
+  | Conv_error.No_variant_match ((msg, sexp)) -> Conv.of_sexp_error msg sexp
+  
+let sexp_of_filename v = Conv.sexp_of_string v
+  
+let dirname_of_sexp__ =
+  let _loc = "Xxx.dirname" in fun sexp -> Conv.string_of_sexp sexp
+  
+let dirname_of_sexp sexp =
+  try dirname_of_sexp__ sexp
+  with
+  | Conv_error.No_variant_match ((msg, sexp)) -> Conv.of_sexp_error msg sexp
+  
+let sexp_of_dirname v = Conv.sexp_of_string v
+  
+let set_of_sexp__ =
+  let _loc = "Xxx.set" in fun _of_a -> Conv.list_of_sexp _of_a
+  
+let set_of_sexp _of_a sexp =
+  try set_of_sexp__ _of_a sexp
+  with
+  | Conv_error.No_variant_match ((msg, sexp)) -> Conv.of_sexp_error msg sexp
+  
+let sexp_of_set _of_a = Conv.sexp_of_list _of_a
+  
+let assoc_of_sexp__ =
+  let _loc = "Xxx.assoc"
+  in
+    fun _of_a _of_b ->
+      Conv.list_of_sexp
+        (function
+         | Sexp.List ([ v1; v2 ]) ->
+             let v1 = _of_a v1 and v2 = _of_b v2 in (v1, v2)
+         | sexp -> Conv_error.tuple_of_size_n_expected _loc 2 sexp)
+  
+let assoc_of_sexp _of_a _of_b sexp =
+  try assoc_of_sexp__ _of_a _of_b sexp
+  with
+  | Conv_error.No_variant_match ((msg, sexp)) -> Conv.of_sexp_error msg sexp
+  
+let sexp_of_assoc _of_a _of_b =
+  Conv.sexp_of_list
+    (fun (v1, v2) ->
+       let v1 = _of_a v1 and v2 = _of_b v2 in Sexp.List [ v1; v2 ])
+  
+let hashset_of_sexp__ =
+  let _loc = "Xxx.hashset"
+  in fun _of_a -> Conv.hashtbl_of_sexp _of_a Conv.bool_of_sexp
+  
+let hashset_of_sexp _of_a sexp =
+  try hashset_of_sexp__ _of_a sexp
+  with
+  | Conv_error.No_variant_match ((msg, sexp)) -> Conv.of_sexp_error msg sexp
+  
+let sexp_of_hashset _of_a = Conv.sexp_of_hashtbl _of_a Conv.sexp_of_bool
+  
+let stack_of_sexp__ =
+  let _loc = "Xxx.stack" in fun _of_a -> Conv.list_of_sexp _of_a
+  
+let stack_of_sexp _of_a sexp =
+  try stack_of_sexp__ _of_a sexp
+  with
+  | Conv_error.No_variant_match ((msg, sexp)) -> Conv.of_sexp_error msg sexp
+  
+let sexp_of_stack _of_a = Conv.sexp_of_list _of_a
+  
+let parse_info_of_sexp__ =
+  let _loc = "Xxx.parse_info"
+  in
+    function
+    | (Sexp.List field_sexps as sexp) ->
+        let str_field = ref None and charpos_field = ref None
+        and line_field = ref None and column_field = ref None
+        and file_field = ref None and duplicates = ref []
+        and extra = ref [] in
+        let rec iter =
+          (function
+           | Sexp.List ([ Sexp.Atom field_name; field_sexp ]) :: tail ->
+               ((match field_name with
+                 | "str" ->
+                     (match !str_field with
+                      | None ->
+                          let fvalue = Conv.string_of_sexp field_sexp
+                          in str_field := Some fvalue
+                      | Some _ -> duplicates := field_name :: !duplicates)
+                 | "charpos" ->
+                     (match !charpos_field with
+                      | None ->
+                          let fvalue = Conv.int_of_sexp field_sexp
+                          in charpos_field := Some fvalue
+                      | Some _ -> duplicates := field_name :: !duplicates)
+                 | "line" ->
+                     (match !line_field with
+                      | None ->
+                          let fvalue = Conv.int_of_sexp field_sexp
+                          in line_field := Some fvalue
+                      | Some _ -> duplicates := field_name :: !duplicates)
+                 | "column" ->
+                     (match !column_field with
+                      | None ->
+                          let fvalue = Conv.int_of_sexp field_sexp
+                          in column_field := Some fvalue
+                      | Some _ -> duplicates := field_name :: !duplicates)
+                 | "file" ->
+                     (match !file_field with
+                      | None ->
+                          let fvalue = filename_of_sexp field_sexp
+                          in file_field := Some fvalue
+                      | Some _ -> duplicates := field_name :: !duplicates)
+                 | _ ->
+                     if !Conv.record_check_extra_fields
+                     then extra := field_name :: !extra
+                     else ());
+                iter tail)
+           | sexp :: _ -> Conv_error.record_only_pairs_expected _loc sexp
+           | [] -> ())
+        in
+          (iter field_sexps;
+           if !duplicates <> []
+           then Conv_error.record_duplicate_fields _loc !duplicates sexp
+           else
+             if !extra <> []
+             then Conv_error.record_extra_fields _loc !extra sexp
+             else
+               (match ((!str_field), (!charpos_field), (!line_field),
+                       (!column_field), (!file_field))
+                with
+                | (Some str_value, Some charpos_value, Some line_value,
+                   Some column_value, Some file_value) ->
+                    {
+                      str = str_value;
+                      charpos = charpos_value;
+                      line = line_value;
+                      column = column_value;
+                      file = file_value;
+                    }
+                | _ ->
+                    Conv_error.record_undefined_elements _loc sexp
+                      [ ((!str_field = None), "str");
+                        ((!charpos_field = None), "charpos");
+                        ((!line_field = None), "line");
+                        ((!column_field = None), "column");
+                        ((!file_field = None), "file") ]))
+    | (Sexp.Atom _ as sexp) -> Conv_error.record_list_instead_atom _loc sexp
+  
+let parse_info_of_sexp sexp = parse_info_of_sexp__ sexp
+  
+let sexp_of_parse_info {
+                         str = v_str;
+                         charpos = v_charpos;
+                         line = v_line;
+                         column = v_column;
+                         file = v_file
+                       } =
+  let bnds = [] in
+  let arg = sexp_of_filename v_file in
+  let bnd = Sexp.List [ Sexp.Atom "file"; arg ] in
+  let bnds = bnd :: bnds in
+  let arg = Conv.sexp_of_int v_column in
+  let bnd = Sexp.List [ Sexp.Atom "column"; arg ] in
+  let bnds = bnd :: bnds in
+  let arg = Conv.sexp_of_int v_line in
+  let bnd = Sexp.List [ Sexp.Atom "line"; arg ] in
+  let bnds = bnd :: bnds in
+  let arg = Conv.sexp_of_int v_charpos in
+  let bnd = Sexp.List [ Sexp.Atom "charpos"; arg ] in
+  let bnds = bnd :: bnds in
+  let arg = Conv.sexp_of_string v_str in
+  let bnd = Sexp.List [ Sexp.Atom "str"; arg ] in
+  let bnds = bnd :: bnds in Sexp.List bnds
+  
+
+
+let score_result_of_sexp__ =
+  let _loc = "Xxx.score_result"
+  in
+    function
+    | Sexp.Atom ("ok" | "Ok") -> Ok
+    | (Sexp.List (Sexp.Atom (("pb" | "Pb" as tag)) :: sexp_args) as sexp) ->
+        (match sexp_args with
+         | [ v1 ] -> let v1 = Conv.string_of_sexp v1 in Pb v1
+         | _ -> Conv_error.stag_incorrect_n_args _loc tag sexp)
+    | (Sexp.List (Sexp.Atom ("ok" | "Ok") :: _) as sexp) ->
+        Conv_error.stag_no_args _loc sexp
+    | (Sexp.Atom ("pb" | "Pb") as sexp) ->
+        Conv_error.stag_takes_args _loc sexp
+    | (Sexp.List (Sexp.List _ :: _) as sexp) ->
+        Conv_error.nested_list_invalid_sum _loc sexp
+    | (Sexp.List [] as sexp) -> Conv_error.empty_list_invalid_sum _loc sexp
+    | sexp -> Conv_error.unexpected_stag _loc sexp
+  
+let score_result_of_sexp sexp = score_result_of_sexp__ sexp
+  
+let sexp_of_score_result =
+  function
+  | Ok -> Sexp.Atom "Ok"
+  | Pb v1 ->
+      let v1 = Conv.sexp_of_string v1 in Sexp.List [ Sexp.Atom "Pb"; v1 ]
+  
+let score_of_sexp__ =
+  let _loc = "Xxx.score"
+  in
+    fun sexp ->
+      Conv.hashtbl_of_sexp Conv.string_of_sexp score_result_of_sexp sexp
+  
+let score_of_sexp sexp =
+  try score_of_sexp__ sexp
+  with
+  | Conv_error.No_variant_match ((msg, sexp)) -> Conv.of_sexp_error msg sexp
+  
+let sexp_of_score v =
+  Conv.sexp_of_hashtbl Conv.sexp_of_string sexp_of_score_result v
+  
+
+let score_list_of_sexp__ =
+  let _loc = "Xxx.score_list"
+  in
+    fun sexp ->
+      Conv.list_of_sexp
+        (function
+         | Sexp.List ([ v1; v2 ]) ->
+             let v1 = Conv.string_of_sexp v1
+             and v2 = score_result_of_sexp v2
+             in (v1, v2)
+         | sexp -> Conv_error.tuple_of_size_n_expected _loc 2 sexp)
+        sexp
+  
+let score_list_of_sexp sexp =
+  try score_list_of_sexp__ sexp
+  with
+  | Conv_error.No_variant_match ((msg, sexp)) -> Conv.of_sexp_error msg sexp
+  
+let sexp_of_score_list v =
+  Conv.sexp_of_list
+    (fun (v1, v2) ->
+       let v1 = Conv.sexp_of_string v1
+       and v2 = sexp_of_score_result v2
+       in Sexp.List [ v1; v2 ])
+    v
index 17533b9..477b780 100755 (executable)
--- a/configure
+++ b/configure
@@ -209,7 +209,11 @@ on the $project website. !!!!
 All seems fine for $project.
 
 To compile $project type:
- make depend; make
+ (make depend); make all
+or alternatively, for the optimized version:
+ (make depend); make all.opt
+If you want both, you could use:
+ (make depend); make world
 
 To install type:
  make install
@@ -278,7 +282,7 @@ my $pythonprefix = $python ? "yes_" : "no_";
 `cd python; ln -s ${pythonprefix}pycocci_aux.ml pycocci_aux.ml;`;
 `cd python; make depend`;
 
-my $command = "perl -p -i -e 's#Not_found.\*#Not_found->\\\"$src\\\"#' globals/config.ml";
+my $command = "perl -p -e 's#Not_found.\*#Not_found->\\\"$src\\\"#' globals/config.ml.in > globals/config.ml";
 `$command`;
 
 #
index f50124c..3b7fb55 100644 (file)
@@ -4,8 +4,9 @@ Thanks to
  - A guy from Cornell for suggesting the term "semantic patch".
 
 Thanks to 
- - Francois Pottier and Yann Regis-Gianas for menhir
- - arty@users.sourceforge.net for pycaml
+ - Francois Pottier and Yann Regis-Gianas for menhir and menhirlib/
+ - arty@users.sourceforge.net for pycaml/
+ - Jane Street for ocamlsexp/
  - Richard Jones for his dumper module, 
 
 Thanks of course also to Stallman, Linus, Leroy, Knuth and their
index 84b98d4..57c6dc4 100644 (file)
@@ -33,7 +33,7 @@ INCLUDES=-I ../commons -I ../commons/ocamlextra -I ../globals
 
 
 #The Caml compilers.
-#for warning:  -w A 
+#for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
 OCAMLCFLAGS ?= -g -dtypes
 OCAMLC =ocamlc$(OPTBIN) $(OCAMLCFLAGS) $(INCLUDES)
@@ -83,9 +83,9 @@ clean::
 # clean rule for others files
 clean::
        rm -f *.cm[iox] *.o *.annot
-       rm -f *~ .*~ #*# 
+       rm -f *~ .*~ #*#
 
-depend: 
+depend:
        $(OCAMLDEP) *.mli *.ml > .depend
 
 distclean::
diff --git a/demos/initial_final.cocci b/demos/initial_final.cocci
new file mode 100644 (file)
index 0000000..3b56ea8
--- /dev/null
@@ -0,0 +1,20 @@
+// Options: -dir {directory}
+
+@initialize:python@
+counter = 0
+
+@x@
+position p;
+@@
+
+kmalloc@p(...)
+
+@script:python@
+p<<x.p;
+@@
+
+counter = counter + 1
+
+@finalize:python@
+
+print "counter %d" % (counter)
diff --git a/docs/Makefile b/docs/Makefile
new file mode 100644 (file)
index 0000000..067c9f1
--- /dev/null
@@ -0,0 +1,25 @@
+SUBDIRS=grammar
+
+TEX=options.tex
+PDF=$(TEX:.tex=.pdf)
+AUX=$(TEX:.tex=.aux)
+LOG=$(TEX:.tex=.log)
+
+.PHONY: all clean distclean $(SUBDIRS)
+.SUFFIXES: .pdf .tex
+
+all: $(PDF) $(SUBDIRS)
+
+$(SUBDIRS):
+       make -C $@
+
+$(PDF): $(TEX)
+       pdflatex $<
+
+clean:
+       make -C $(SUBDIRS) clean
+       rm -f $(AUX) $(LOG)
+
+distclean:
+       make -C $(SUBDIRS) distclean
+       rm -f $(PDF)
diff --git a/docs/SmPL-ver2-tutorial-ols07.pdf b/docs/SmPL-ver2-tutorial-ols07.pdf
deleted file mode 100644 (file)
index 1cc81d3..0000000
Binary files a/docs/SmPL-ver2-tutorial-ols07.pdf and /dev/null differ
diff --git a/docs/SmPL-with-grammar-ercim-evos06.pdf b/docs/SmPL-with-grammar-ercim-evos06.pdf
deleted file mode 100644 (file)
index 78428e6..0000000
Binary files a/docs/SmPL-with-grammar-ercim-evos06.pdf and /dev/null differ
diff --git a/docs/grammar/cocci_syntax.pdf b/docs/grammar/cocci_syntax.pdf
new file mode 100644 (file)
index 0000000..c690e60
Binary files /dev/null and b/docs/grammar/cocci_syntax.pdf differ
index 8dafbd9..869ab16 100644 (file)
@@ -7,6 +7,7 @@
 \usepackage[pdfborder={0 0 0}]{hyperref}
 \usepackage{listings}
 \usepackage[usenames,dvipsnames]{color}
+\usepackage{times}
 \usepackage[T1]{fontenc}
 \usepackage{multirow}
 
@@ -100,9 +101,9 @@ part, the grammar is written using standard notation.  In some rules,
 however, the left-hand side is in all uppercase letters.  These are
 macros, which take one or more grammar rule right-hand-sides as
 arguments.  The grammar also uses some unspecified nonterminals, such
-as {\sf id}, {\sf const}, etc.  These refer to the sets suggested by
-the name, {\em i.e.}, {\sf id} refers to the set of possible
-C-language identifiers, while {\sf const} refers to the set of
+as \T{id}, \T{const}, etc.  These refer to the sets suggested by
+the name, {\em i.e.}, \T{id} refers to the set of possible
+C-language identifiers, while \T{const} refers to the set of
 possible C-language constants.  \ifhevea A PDF version of this
 documentation is available at
 \url{http://www.emn.fr/x-info/coccinelle/docs/cocci_syntax.pdf}.\else
@@ -127,16 +128,21 @@ A HTML version of this documentation is available online at
 
   \RULE{\rt{changeset}}
   \CASE{\NT{metavariables} \NT{transformation}}
+  \CASE{\NT{script\_metavariables} \T{script\_code}}
 %  \CASE{\NT{metavariables} \ANY{--- filename +++ filename} \NT{transformation}}
-
 \end{grammar}
 
+\noindent
+\T{script\_code} is any code in the chosen scripting language.  Parsing of
+the semantic patch does not check the validity of this code; any errors are
+first detected when the code is executed.
+
 % Between the metavariables and the transformation rule, there can be a
 % specification of constraints on the names of the old and new files,
 % analogous to the filename specifications in the standard patch syntax.
 % (see Figure \ref{scsiglue_patch}).
 
-\section{Metavariables}
+\section{Metavariables for transformations}
 
 The \NT{rulename} portion of the metavariable declaration can specify
 properties of a rule such as its name, the names of the rules that it
@@ -160,6 +166,10 @@ section.
     \opt{\NT{disable-iso}} \opt{\NT{exists}} \opt{expression}}
   \CASE{script:\T{language} \OPT{depends on \NT{dep}}}
 
+  \RULE{\rt{script\_init\_final}}
+  \CASE{initialize:\T{language}}
+  \CASE{finalize:\T{language}}
+
   \RULE{\rt{dep}}
   \CASE{\NT{pnrule}}
   \CASE{\NT{dep} \&\& \NT{dep}}
@@ -187,7 +197,7 @@ section.
   \CASE{\NT{elem} \ANY{, \NT{elem}}}
 \end{grammar}
 
-The keyword \NT{disable-iso} is normally used with the names of
+The keyword \KW{disable} is normally used with the names of
 isomorphisms defined in standard.iso or whatever isomorphism file has been
 included.  There are, however, some other isomorphisms that are built into
 the implementation of Coccinelle and that can be disabled as well.  Their
@@ -291,6 +301,36 @@ The \NT{ctype} and \NT{ctypes} nonterminals are used by both the grammar of
 metavariable declarations and the grammar of transformations, and are
 defined on page~\pageref{types}.
 
+\section{Metavariables for scripts}
+
+Metavariables for scripts can only be inherited from transformation rules.
+In the spirit of scripting languages such as Python that use dynamic
+typing, metavariables for scripts do not include type declarations.
+
+\begin{grammar}
+  \RULE{\rt{script\_metavariables}}
+  \CASE{@ script:\NT{language} \OPT{depends on \NT{dep}} @
+        \any{\NT{script\_metadecl}} @@}
+  \CASE{@ initialize:\NT{language} @}
+  \CASE{@ finalize:\NT{language} @}
+
+  \RULE{\rt{language}} \CASE{python}
+
+  \RULE{\rt{script\_metadecl}} \CASE{\T{id} <{}< \T{rulename\_id}.\T{id} ;}
+\end{grammar}
+
+Currently, the only scripting language that is supported is Python.  The
+set of available scripting languages may be extended at some point.
+
+Script rules declared with \KW{initialize} are run before the treatment of
+any file.  Script rules declared with \KW{finalize} are run when the
+treatment of all of the files has completed.  There can be at most one of
+each per scripting language (thus currently at most one of each).
+Initialize and finalize script rules do not have access to SmPL
+metavariables.  Nevertheless, a finalize script rule can access any
+variables initialized by the other script rules, allowing information to be
+transmitted from the matching process to the finalize rule.
+
 \section{Transformation}
 
 The transformation specification essentially has the form of C code,
index c16b836..1450a72 100644 (file)
@@ -3,7 +3,7 @@
 
 \ifhevea
 % Definition for Hevea (HTML generation)
-\def\T#1{{\sf #1}}
+\def\T#1{{\sf{#1}}}
 \def\NTS#1{{\maroon #1\/}}
 \def\KW#1{{\blue #1}}
 \def\gramor{{\black $|$}}
@@ -17,7 +17,7 @@
 \def\etoile{{\black *}}
 \else
 % Definition for LaTeX
-\def\T#1{{\sf #1}}
+\def\T#1{{\textsf{\small{#1}}}}
 \def\NTS#1{{\it #1\/}}
 \def\KW#1{{\mtt{#1}}}
 %\def\gramor{$\vert$}
index 95eb81a..7184f64 100644 (file)
Binary files a/docs/options.pdf and b/docs/options.pdf differ
index 85e3fad..3b18077 100644 (file)
@@ -101,6 +101,12 @@ place of the standard one.  Normally one should use the {\tt using}
 construct within a semantic patch to specify isomorphisms to be used {\em
   in addition to} the standard ones.}
 
+\rare{-iso\_limit $\langle$int$\rangle$} Limit the depth of application of
+isomorphisms to the specified integer.
+
+\rare{-no\_iso\_limit} Put no limit on the number of times that
+isomorphisms can be applied. This is the default.
+
 \developer{-track\_iso}{ Gather information about isomorphism usage.}
 
 \developer{-profile\_iso}{ Gather information about the time required for
@@ -182,7 +188,10 @@ semantic patch rule is applied to all functions in all files, etc.  If a
 directory is specified then no files may be specified and only the
 rightmost directory specified is used.
 
-\minimum{-dir}{ Specify a directory containing C files to process.}
+\minimum{-dir}{ Specify a directory containing C files to process.  By
+  default, the include path will be set to the ``include'' subdirectory of
+  this directory.  A different include path can be specified using the
+  option {\bf -I}.}
 
 \normal{-include\_headers}{ This option causes header files to be processed
 independently.  This option only makes sense if a directory is specified
diff --git a/docs/semantic-patches-for-collateral-evolutions.ppt b/docs/semantic-patches-for-collateral-evolutions.ppt
deleted file mode 100644 (file)
index 8a58ebb..0000000
Binary files a/docs/semantic-patches-for-collateral-evolutions.ppt and /dev/null differ
diff --git a/docs/semantic-patches-talk-ols07.odp b/docs/semantic-patches-talk-ols07.odp
deleted file mode 100644 (file)
index 6815d85..0000000
Binary files a/docs/semantic-patches-talk-ols07.odp and /dev/null differ
diff --git a/docs/semantic-patches-talk-ols07.ppt b/docs/semantic-patches-talk-ols07.ppt
deleted file mode 100644 (file)
index 78ab9f0..0000000
Binary files a/docs/semantic-patches-talk-ols07.ppt and /dev/null differ
diff --git a/engine/.depend b/engine/.depend
deleted file mode 100644 (file)
index 8179bbb..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-asttoctl.cmi: ../ctl/wrapper_ctl.cmi lib_engine.cmo ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi 
-asttoctl2.cmi: ../ctl/wrapper_ctl.cmi lib_engine.cmo ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi 
-asttomember.cmi: lib_engine.cmo ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi 
-c_vs_c.cmi: ../parsing_c/ast_c.cmo 
-check_reachability.cmi: ../ctl/wrapper_ctl.cmi ../commons/ograph_extended.cmi \
-    ../parsing_c/control_flow_c.cmi ../ctl/ast_ctl.cmo 
-cocci_vs_c.cmi: ../parsing_c/control_flow_c.cmi ../commons/common.cmi \
-    ../parsing_cocci/ast_cocci.cmi ../parsing_c/ast_c.cmo 
-ctlcocci_integration.cmi: ../commons/ograph_extended.cmi lib_engine.cmo \
-    ../parsing_c/control_flow_c.cmi ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi 
-ctltotex.cmi: ../ctl/wrapper_ctl.cmi lib_engine.cmo ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi 
-pattern_c.cmi: lib_engine.cmo ../parsing_c/control_flow_c.cmi \
-    ../parsing_cocci/ast_cocci.cmi 
-postprocess_transinfo.cmi: ../commons/ograph_extended.cmi lib_engine.cmo \
-    ../parsing_cocci/ast_cocci.cmi 
-pretty_print_engine.cmi: lib_engine.cmo ../ctl/ast_ctl.cmo \
-    ../parsing_c/ast_c.cmo 
-transformation_c.cmi: lib_engine.cmo ../parsing_c/control_flow_c.cmi 
-asttoctl.cmo: ../ctl/wrapper_ctl.cmi ../parsing_cocci/visitor_ast.cmi \
-    ../parsing_cocci/unify_ast.cmi pretty_print_engine.cmi lib_engine.cmo \
-    ../parsing_cocci/free_vars.cmi ../commons/common.cmi ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi asttoctl.cmi 
-asttoctl.cmx: ../ctl/wrapper_ctl.cmx ../parsing_cocci/visitor_ast.cmx \
-    ../parsing_cocci/unify_ast.cmx pretty_print_engine.cmx lib_engine.cmx \
-    ../parsing_cocci/free_vars.cmx ../commons/common.cmx ../ctl/ast_ctl.cmx \
-    ../parsing_cocci/ast_cocci.cmx asttoctl.cmi 
-asttoctl2.cmo: ../ctl/wrapper_ctl.cmi ../parsing_cocci/visitor_ast.cmi \
-    ../parsing_cocci/unify_ast.cmi ../parsing_cocci/type_cocci.cmi \
-    pretty_print_engine.cmi ../ctl/pretty_print_ctl.cmi \
-    ../parsing_cocci/pretty_print_cocci.cmi lib_engine.cmo flag_matcher.cmo \
-    ../globals/flag.cmo ../commons/common.cmi ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi asttoctl2.cmi 
-asttoctl2.cmx: ../ctl/wrapper_ctl.cmx ../parsing_cocci/visitor_ast.cmx \
-    ../parsing_cocci/unify_ast.cmx ../parsing_cocci/type_cocci.cmx \
-    pretty_print_engine.cmx ../ctl/pretty_print_ctl.cmx \
-    ../parsing_cocci/pretty_print_cocci.cmx lib_engine.cmx flag_matcher.cmx \
-    ../globals/flag.cmx ../commons/common.cmx ../ctl/ast_ctl.cmx \
-    ../parsing_cocci/ast_cocci.cmx asttoctl2.cmi 
-asttomember.cmo: ../parsing_cocci/visitor_ast.cmi \
-    ../parsing_cocci/pretty_print_cocci.cmi lib_engine.cmo \
-    ../commons/common.cmi ../ctl/ast_ctl.cmo ../parsing_cocci/ast_cocci.cmi \
-    asttomember.cmi 
-asttomember.cmx: ../parsing_cocci/visitor_ast.cmx \
-    ../parsing_cocci/pretty_print_cocci.cmx lib_engine.cmx \
-    ../commons/common.cmx ../ctl/ast_ctl.cmx ../parsing_cocci/ast_cocci.cmx \
-    asttomember.cmi 
-c_vs_c.cmo: ../parsing_c/lib_parsing_c.cmo ../commons/common.cmi \
-    ../parsing_c/ast_c.cmo c_vs_c.cmi 
-c_vs_c.cmx: ../parsing_c/lib_parsing_c.cmx ../commons/common.cmx \
-    ../parsing_c/ast_c.cmx c_vs_c.cmi 
-check_exhaustive_pattern.cmo: ../parsing_c/control_flow_c.cmi \
-    ../parsing_cocci/ast_cocci.cmi ../parsing_c/ast_c.cmo 
-check_exhaustive_pattern.cmx: ../parsing_c/control_flow_c.cmx \
-    ../parsing_cocci/ast_cocci.cmx ../parsing_c/ast_c.cmx 
-check_reachability.cmo: ../ctl/wrapper_ctl.cmi ../commons/ograph_extended.cmi \
-    ../ctl/flag_ctl.cmo ../ctl/ctl_engine.cmi ../parsing_c/control_flow_c.cmi \
-    ../ctl/ast_ctl.cmo check_reachability.cmi 
-check_reachability.cmx: ../ctl/wrapper_ctl.cmx ../commons/ograph_extended.cmx \
-    ../ctl/flag_ctl.cmx ../ctl/ctl_engine.cmx ../parsing_c/control_flow_c.cmx \
-    ../ctl/ast_ctl.cmx check_reachability.cmi 
-cocci_vs_c.cmo: ../parsing_cocci/type_cocci.cmi \
-    ../parsing_c/lib_parsing_c.cmo flag_matcher.cmo \
-    ../parsing_c/control_flow_c.cmi ../commons/common.cmi c_vs_c.cmi \
-    ../parsing_cocci/ast_cocci.cmi ../parsing_c/ast_c.cmo cocci_vs_c.cmi 
-cocci_vs_c.cmx: ../parsing_cocci/type_cocci.cmx \
-    ../parsing_c/lib_parsing_c.cmx flag_matcher.cmx \
-    ../parsing_c/control_flow_c.cmx ../commons/common.cmx c_vs_c.cmx \
-    ../parsing_cocci/ast_cocci.cmx ../parsing_c/ast_c.cmx cocci_vs_c.cmi 
-ctlcocci_integration.cmo: ../ctl/wrapper_ctl.cmi pretty_print_engine.cmi \
-    ../parsing_cocci/pretty_print_cocci.cmi postprocess_transinfo.cmi \
-    pattern_c.cmi ../commons/ograph_extended.cmi lib_engine.cmo \
-    ../parsing_cocci/flag_parsing_cocci.cmo flag_matcher.cmo \
-    ../globals/flag.cmo ../parsing_c/control_flow_c.cmi ../commons/common.cmi \
-    check_reachability.cmi c_vs_c.cmi ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi ../parsing_c/ast_c.cmo \
-    ctlcocci_integration.cmi 
-ctlcocci_integration.cmx: ../ctl/wrapper_ctl.cmx pretty_print_engine.cmx \
-    ../parsing_cocci/pretty_print_cocci.cmx postprocess_transinfo.cmx \
-    pattern_c.cmx ../commons/ograph_extended.cmx lib_engine.cmx \
-    ../parsing_cocci/flag_parsing_cocci.cmx flag_matcher.cmx \
-    ../globals/flag.cmx ../parsing_c/control_flow_c.cmx ../commons/common.cmx \
-    check_reachability.cmx c_vs_c.cmx ../ctl/ast_ctl.cmx \
-    ../parsing_cocci/ast_cocci.cmx ../parsing_c/ast_c.cmx \
-    ctlcocci_integration.cmi 
-ctltotex.cmo: ../parsing_cocci/pretty_print_cocci.cmi lib_engine.cmo \
-    ../ctl/ast_ctl.cmo ctltotex.cmi 
-ctltotex.cmx: ../parsing_cocci/pretty_print_cocci.cmx lib_engine.cmx \
-    ../ctl/ast_ctl.cmx ctltotex.cmi 
-isomorphisms_c_c.cmo: ../commons/common.cmi ../parsing_c/ast_c.cmo 
-isomorphisms_c_c.cmx: ../commons/common.cmx ../parsing_c/ast_c.cmx 
-lib_engine.cmo: ../ctl/wrapper_ctl.cmi ../commons/ograph_extended.cmi \
-    ../parsing_c/control_flow_c.cmi ../commons/common.cmi ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi ../parsing_c/ast_c.cmo 
-lib_engine.cmx: ../ctl/wrapper_ctl.cmx ../commons/ograph_extended.cmx \
-    ../parsing_c/control_flow_c.cmx ../commons/common.cmx ../ctl/ast_ctl.cmx \
-    ../parsing_cocci/ast_cocci.cmx ../parsing_c/ast_c.cmx 
-lib_matcher_c.cmo: lib_matcher_c.cmi 
-lib_matcher_c.cmx: lib_matcher_c.cmi 
-main.cmo: ../parsing_cocci/parse_cocci.cmi ctltotex.cmi asttoctl.cmi 
-main.cmx: ../parsing_cocci/parse_cocci.cmx ctltotex.cmx asttoctl.cmx 
-pattern_c.cmo: ../parsing_c/visitor_c.cmi ../parsing_c/lib_parsing_c.cmo \
-    lib_engine.cmo flag_matcher.cmo ../commons/common.cmi cocci_vs_c.cmi \
-    ../parsing_cocci/ast_cocci.cmi ../parsing_c/ast_c.cmo pattern_c.cmi 
-pattern_c.cmx: ../parsing_c/visitor_c.cmx ../parsing_c/lib_parsing_c.cmx \
-    lib_engine.cmx flag_matcher.cmx ../commons/common.cmx cocci_vs_c.cmx \
-    ../parsing_cocci/ast_cocci.cmx ../parsing_c/ast_c.cmx pattern_c.cmi 
-postprocess_transinfo.cmo: ../parsing_c/parser_c.cmi ../parsing_c/parse_c.cmi \
-    lib_engine.cmo ../commons/common.cmi ../parsing_cocci/ast_cocci.cmi \
-    ../parsing_c/ast_c.cmo postprocess_transinfo.cmi 
-postprocess_transinfo.cmx: ../parsing_c/parser_c.cmx ../parsing_c/parse_c.cmx \
-    lib_engine.cmx ../commons/common.cmx ../parsing_cocci/ast_cocci.cmx \
-    ../parsing_c/ast_c.cmx postprocess_transinfo.cmi 
-pretty_print_engine.cmo: ../ctl/pretty_print_ctl.cmi \
-    ../parsing_cocci/pretty_print_cocci.cmi ../parsing_c/pretty_print_c.cmi \
-    lib_engine.cmo ../commons/common.cmi ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi ../parsing_c/ast_c.cmo \
-    pretty_print_engine.cmi 
-pretty_print_engine.cmx: ../ctl/pretty_print_ctl.cmx \
-    ../parsing_cocci/pretty_print_cocci.cmx ../parsing_c/pretty_print_c.cmx \
-    lib_engine.cmx ../commons/common.cmx ../ctl/ast_ctl.cmx \
-    ../parsing_cocci/ast_cocci.cmx ../parsing_c/ast_c.cmx \
-    pretty_print_engine.cmi 
-sgrep.cmo: ../parsing_cocci/ast_cocci.cmi ../parsing_c/ast_c.cmo 
-sgrep.cmx: ../parsing_cocci/ast_cocci.cmx ../parsing_c/ast_c.cmx 
-transformation_c.cmo: ../parsing_c/visitor_c.cmi \
-    ../parsing_cocci/type_cocci.cmi ../parsing_c/lib_parsing_c.cmo \
-    lib_engine.cmo flag_matcher.cmo ../globals/flag.cmo \
-    ../parsing_c/control_flow_c.cmi ../commons/common.cmi cocci_vs_c.cmi \
-    ../parsing_cocci/ast_cocci.cmi ../parsing_c/ast_c.cmo \
-    transformation_c.cmi 
-transformation_c.cmx: ../parsing_c/visitor_c.cmx \
-    ../parsing_cocci/type_cocci.cmx ../parsing_c/lib_parsing_c.cmx \
-    lib_engine.cmx flag_matcher.cmx ../globals/flag.cmx \
-    ../parsing_c/control_flow_c.cmx ../commons/common.cmx cocci_vs_c.cmx \
-    ../parsing_cocci/ast_cocci.cmx ../parsing_c/ast_c.cmx \
-    transformation_c.cmi 
index 15fddb0..f90e6ad 100644 (file)
@@ -39,16 +39,16 @@ SRC= flag_matcher.ml lib_engine.ml pretty_print_engine.ml \
 #SRC= flag_matcher.ml \
 #  c_vs_c.ml cocci_vs_c.ml \
 #  lib_engine.ml \
-#  pattern_c.ml transformation_c.ml 
+#  pattern_c.ml transformation_c.ml
 
 #LIBS=../commons/commons.cma ../parsing_c/parsing_c.cma
 #INCLUDES= -I ../commons -I ../parsing_c
 INCLUDES = -I ../commons -I ../commons/ocamlextra -I ../globals \
-              -I ../ctl -I ../parsing_cocci -I ../parsing_c 
+              -I ../ctl -I ../parsing_cocci -I ../parsing_c
 LIBS=../commons/commons.cma ../globals/globals.cma \
      ../ctl/ctl.cma ../parsing_c/parsing_c.cma ../parsing_cocci/cocci_parser.cma
 
-SYSLIBS= str.cma unix.cma 
+SYSLIBS= str.cma unix.cma
 
 
 # just to test asttoctl
@@ -59,7 +59,7 @@ SYSLIBS= str.cma unix.cma
 # Generic variables
 ##############################################################################
 
-#for warning:  -w A 
+#for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
 OCAMLCFLAGS ?= -g -dtypes
 
@@ -112,14 +112,16 @@ clean::
 .ml.cmx:
        $(OCAMLOPT) -c $<
 
-.ml.mldepend: 
+.ml.mldepend:
        $(OCAMLC) -i $<
 
 clean::
        rm -f *.cm[ioxa] *.o *.a *.cmxa *.annot
-clean::
        rm -f *~ .*~ gmon.out #*#
 
+distclean::
+       rm -f .depend
+
 beforedepend::
 
 depend:: beforedepend
index 10f79b1..dd6e5a7 100644 (file)
@@ -1106,7 +1106,8 @@ let forwhile header body ((afvs,_,_,_) as aft) after
     (Ast.Atomic(re),(_,_,_,Ast.CONTEXT(_,Ast.NOTHING))) ->
       (match Ast.unwrap re with
        Ast.MetaStmt((_,_,Ast.CONTEXT(_,Ast.NOTHING),_),
-                    Type_cocci.Unitary,_,false) ->
+                    Type_cocci.Unitary,_,false)
+       when after = Tail or after = End or after = VeryEnd ->
          let (efvs) =
            match seq_fvs quantified [Ast.get_fvs header] with
              [(efvs,_)] -> efvs
@@ -2328,7 +2329,7 @@ let asttoctlz (name,(_,_,exists_flag),l) used_after positions =
 
 let asttoctl r used_after positions =
   match r with
-    Ast.ScriptRule _ -> []
+    Ast.ScriptRule _ | Ast.InitialScriptRule _ | Ast.FinalScriptRule _ -> []
   | Ast.CocciRule (a,b,c,_,Ast_cocci.Normal) ->
       asttoctlz (a,b,c) used_after positions
   | Ast.CocciRule (a,b,c,_,Ast_cocci.Generated) -> [CTL.True]
index d0c70af..acfa8e8 100644 (file)
@@ -321,6 +321,6 @@ let asttomemberz (_,_,l) used_after =
 
 let asttomember r used_after =
   match r with
-    Ast.ScriptRule _ -> []
+    Ast.ScriptRule _ | Ast.InitialScriptRule _ | Ast.FinalScriptRule _ -> []
   | Ast.CocciRule (a,b,c,_,_) -> asttomemberz (a,b,c) used_after
 
index baa7f9f..3f2e7e9 100644 (file)
@@ -74,6 +74,16 @@ let (option: 'a matcher -> ('a option matcher)) = fun f t1 t2 ->
   | _ -> fail
 
 
+let same_s saopt sbopt = 
+  match saopt, sbopt with
+  | None, None -> true
+  | Some namea, Some nameb -> 
+      let sa = Ast_c.str_of_name namea in
+      let sb = Ast_c.str_of_name nameb in
+      sa =$= sb
+  | _ -> false 
+
+
 let rec fullType a b = 
   let ((qua,iiqa), tya) = a in
   let ((qub,iiqb), tyb) = b in
@@ -100,19 +110,24 @@ and typeC tya tyb =
       (sua =*= sub && sa =$= sb) >&&> 
         return (StructUnionName (sua, sa), iix)
 
-  | TypeName (sa, opta), TypeName (sb, optb) -> 
+  | TypeName (namea, opta), TypeName (nameb, optb) -> 
+      let sa = Ast_c.str_of_name namea in
+      let sb = Ast_c.str_of_name nameb in
+      
       (* assert compatible opta optb ? *)
       (*option fullType opta optb*)
       sa =$= sb >&&> 
        let opt = 
          (match opta, optb with
          | None, None -> None
+
          | Some x, _ 
          | _, Some x 
+
              -> Some x
          ) 
        in
-       return (TypeName (sa, opt), iix)
+       return (TypeName (namea, opt), iix)
       
 
   | Array (ea, a), Array (eb,b) -> 
@@ -128,7 +143,7 @@ and typeC tya tyb =
       let bx = ba in
       let iihas3dotsx = iihas3dotsa in
 
-      (ba = bb && List.length tsa = List.length tsb) >&&>
+      (ba =:= bb && List.length tsa =|= List.length tsb) >&&>
       fullType returna returnb >>= (fun returnx -> 
 
       Common.zip tsa tsb +> List.fold_left 
@@ -136,17 +151,23 @@ and typeC tya tyb =
           let iix = iia in
           acc >>= (fun xs -> 
 
-            let (((ba, saopt, ta), ii_b_sa)) = parama in
-            let (((bb, sbopt, tb), ii_b_sb)) = paramb in
+            let {p_register = (ba,iiba); p_namei = saopt; p_type = ta} = 
+              parama in
+            let {p_register = (bb,iibb); p_namei = sbopt; p_type = tb} = 
+              paramb in
 
             let bx = ba in
+            let iibx = iiba in
+
             let sxopt = saopt in
-            let ii_b_sx = ii_b_sa in
+
 
             (* todo?  iso on name or argument ? *)
-            (ba =:= bb && saopt =*= sbopt) >&&>
+            (ba =:= bb && same_s saopt sbopt) >&&>
             fullType ta tb >>= (fun tx -> 
-              let paramx = (((bx, sxopt, tx), ii_b_sx)) in
+              let paramx = { p_register = (bx, iibx);
+                             p_namei = sxopt;
+                             p_type = tx; } in
               return ((paramx,iix)::xs)
             )
           )
@@ -158,11 +179,14 @@ and typeC tya tyb =
 
   | Enum (saopt, enuma), Enum (sbopt, enumb) -> 
       (saopt =*= sbopt &&
-      List.length enuma = List.length enumb && 
+      List.length enuma =|= List.length enumb && 
       Common.zip enuma enumb +> List.for_all (fun 
-        ((((sa, eopta),ii_s_eqa), iicommaa), (((sb, eoptb),ii_s_eqb),iicommab))
+        (((namesa,eopta), iicommaa), ((namesb,eoptb),iicommab))
           -> 
+            let sa = str_of_name namesa in
+            let sb = str_of_name namesb in
             sa =$= sb && 
+            (* todo ? eopta and b can have some info so ok to use =*= ?  *)
             eopta =*= eoptb 
         )
       ) >&&>
@@ -190,7 +214,7 @@ and typeC tya tyb =
 
 
   | StructUnion (sua, saopt, sta), StructUnion (sub, sbopt, stb) -> 
-      (sua =*= sub && saopt =*= sbopt && List.length sta = List.length stb) 
+      (sua =*= sub && saopt =*= sbopt && List.length sta =|= List.length stb) 
       >&&> 
       Common.zip sta stb +> List.fold_left 
         (fun acc ((xfielda, iia), (xfieldb, iib)) -> 
@@ -208,20 +232,21 @@ and typeC tya tyb =
                   (fun acc2 ((fielda,iia),(fieldb,iib))-> 
                     let iix = iia in
                     acc2 >>= (fun xs -> 
-                      let (fa, ii2a) = fielda in
-                      let (fb, ii2b) = fieldb in
-                      let ii2x = ii2a in
-                      match fa, fb with
-                      | Simple (saopt, ta), Simple (sbopt, tb) -> 
-                          saopt =*= sbopt >&&> 
+                      match fielda, fieldb with
+                      | Simple (nameaopt, ta), Simple (namebopt, tb) -> 
+                          
+
+                          same_s nameaopt namebopt >&&> 
                           fullType ta tb >>= (fun tx -> 
-                            return (((Simple (saopt, tx), ii2x), iix)::xs)
+                            return (((Simple (nameaopt, tx)), iix)::xs)
                           )
                           
-                      | BitField (sopta, ta, ea), BitField (soptb, tb, eb) -> 
-                          (sopta =*= soptb && ea =*= eb) >&&> 
+                      | BitField (nameopta, ta, infoa, ea), 
+                        BitField (nameoptb, tb, infob, eb) -> 
+                          let infox = infoa in
+                          (same_s nameopta nameoptb && ea =*= eb) >&&> 
                           fullType ta tb >>= (fun tx -> 
-                            return (((BitField (sopta,tx,ea), ii2x), iix)::xs)
+                            return (((BitField (nameopta,tx,infox,ea)), iix)::xs)
                           )
                       | _,_ -> fail
                     )
@@ -246,14 +271,14 @@ and typeC tya tyb =
    * must put iib and not iix, because we want the token corresponding
    * to the typedef.
    *)
-  | TypeName (s, Some a), _ -> 
+  | TypeName (name, Some a), _ -> 
       fullType a (Ast_c.nQ, tyb) >>= (fun x -> 
-        return (TypeName (s, Some x), iia) 
+        return (TypeName (name, Some x), iia) 
       )
 
-  | _, TypeName (s, Some b) -> 
+  | _, TypeName (name, Some b) -> 
       fullType b (Ast_c.nQ, tya) >>= (fun x -> 
-        return (TypeName (s, Some x), iib) (* subtil: *)
+        return (TypeName (name, Some x), iib) (* subtil: *)
       )
 
   | _, _ -> fail
index 933f16e..dd17d4b 100644 (file)
@@ -18,8 +18,6 @@
 * The authors reserve the right to distribute this or future versions of
 * Coccinelle under other licenses.
 *)
-
-
 open Common
 
 module A = Ast_cocci
@@ -140,7 +138,7 @@ let generalize_mcode ia =
 (* 0x0 is equivalent to 0,  value format isomorphism *)
 let equal_c_int s1 s2 = 
   try 
-    int_of_string s1 = int_of_string s2
+    int_of_string s1 =|= int_of_string s2
   with Failure("int_of_string") -> 
     s1 =$= s2
 
@@ -281,7 +279,7 @@ let equal_metavarval valu valu' =
        (function (fla,cea,posa1,posa2) ->
          List.exists
            (function (flb,ceb,posb1,posb2) ->
-             fla = flb && cea = ceb &&
+             fla =$= flb && cea =$= ceb &&
              Ast_c.equal_posl posa1 posb1 && Ast_c.equal_posl posa2 posb2)
             l2)
        l1
@@ -309,58 +307,45 @@ let split_signb_baseb_ii (baseb, ii) =
   | B.IntType (B.CChar), ["char",i1] -> None, [i1]
 
 
-  | B.IntType (B.Si (sign, base)), xs -> 
-      (match sign, base, xs with
-      | B.Signed, B.CChar2,   ["signed",i1;"char",i2] -> 
-          Some (B.Signed, i1), [i2]
-      | B.UnSigned, B.CChar2,   ["unsigned",i1;"char",i2] -> 
-          Some (B.UnSigned, i1), [i2]
-
-      | B.Signed, B.CShort, ["short",i1] -> 
-          None, [i1]
-      | B.Signed, B.CShort, ["signed",i1;"short",i2] -> 
-          Some (B.Signed, i1), [i2]
-      | B.UnSigned, B.CShort, ["unsigned",i1;"short",i2] -> 
-          Some (B.UnSigned, i1), [i2]
-      | B.Signed, B.CShort, ["short",i1;"int",i2] -> 
-          None, [i1;i2]
-
-      | B.Signed, B.CInt, ["int",i1] -> 
-          None, [i1]
-      | B.Signed, B.CInt, ["signed",i1;"int",i2] -> 
-          Some (B.Signed, i1), [i2]
-      | B.UnSigned, B.CInt, ["unsigned",i1;"int",i2] -> 
-          Some (B.UnSigned, i1), [i2]
-
-      | B.Signed, B.CInt, ["signed",i1;] -> 
-          Some (B.Signed, i1), []
-      | B.UnSigned, B.CInt, ["unsigned",i1;] -> 
-          Some (B.UnSigned, i1), []
-
-      | B.Signed, B.CLong, ["long",i1] -> 
-          None, [i1]
-      | B.Signed, B.CLong, ["long",i1;"int",i2] -> 
-          None, [i1;i2]
-      | B.Signed, B.CLong, ["signed",i1;"long",i2] -> 
-          Some (B.Signed, i1), [i2]
-      | B.UnSigned, B.CLong, ["unsigned",i1;"long",i2] -> 
-          Some (B.UnSigned, i1), [i2]
-
-      | B.Signed, B.CLongLong, ["long",i1;"long",i2] -> None, [i1;i2]
-      | B.Signed, B.CLongLong, ["signed",i1;"long",i2;"long",i3] -> 
-          Some (B.Signed, i1), [i2;i3]
-      | B.UnSigned, B.CLongLong, ["unsigned",i1;"long",i2;"long",i3] -> 
-          Some (B.UnSigned, i1), [i2;i3]
-
-
-      | B.UnSigned, B.CShort, ["unsigned",i1;"short",i2; "int", i3] -> 
-          Some (B.UnSigned, i1), [i2;i3]
-          
-
-
-      | _ -> failwith "strange type1, maybe because of weird order"
-      )
-  | _ -> failwith "strange type2, maybe because of weird order"
+  | B.IntType (B.Si (sign, base)), xs ->
+      let (signed,rest) =
+       match (sign,xs) with
+         (_,[]) -> None,[]
+       | (B.Signed,(("signed",i1)::rest)) -> (Some (B.Signed,i1),rest)
+       | (B.Signed,rest) -> (None,rest)
+       | (B.UnSigned,(("unsigned",i1)::rest)) -> (Some (B.UnSigned,i1),rest)
+       | (B.UnSigned,rest) -> (* is this case possible? *) (None,rest) in
+      (* The original code only allowed explicit signed and unsigned for char,
+        while this code allows char by itself.  Not sure that needs to be
+        checked for here.  If it does, then add a special case. *)
+      let base_res =
+       match (base,rest) with
+         B.CInt, ["int",i1] -> [i1]
+       | B.CInt, [] -> []
+
+       | B.CInt, ["",i1] -> (* no type is specified at all *)
+           (match i1.B.pinfo with
+             B.FakeTok(_,_) -> []
+           | _ -> failwith ("unrecognized signed int: "^
+                            (String.concat " "(List.map fst iis))))
+
+       | B.CChar2, ["char",i2] -> [i2]
+
+       | B.CShort, ["short",i1] -> [i1]
+       | B.CShort, ["short",i1;"int",i2] -> [i1;i2]
+
+       | B.CLong, ["long",i1] -> [i1]
+       | B.CLong, ["long",i1;"int",i2] -> [i1;i2]
+
+       | B.CLongLong, ["long",i1;"long",i2] -> [i1;i2]
+       | B.CLongLong, ["long",i1;"long",i2;"int",i3] -> [i1;i2;i3]
+
+       | _ ->
+         failwith ("strange type1, maybe because of weird order: "^
+                   (String.concat " " (List.map fst iis))) in
+      (signed,base_res)
+  | _ -> failwith ("strange type2, maybe because of weird order: "^
+                  (String.concat " " (List.map fst iis)))
 
 (*---------------------------------------------------------------------------*)
 
@@ -450,9 +435,10 @@ let initialisation_to_affectation decl =
               iisep) = x in
 
           (match var with
-          | Some ((s, ini),  iis::iini) -> 
-              (match ini with
-              | Some (B.InitExpr e, ii_empty2) -> 
+          | Some (name, iniopt) -> 
+              (match iniopt with
+              | Some (iini, (B.InitExpr e, ii_empty2)) -> 
+                  let iis = Ast_c.info_of_name name in
                  let local =
                    match local with
                      Ast_c.NotLocalDecl -> Ast_c.NotLocalVar
@@ -461,10 +447,11 @@ let initialisation_to_affectation decl =
                   let typ =
                    ref (Some ((Lib_parsing_c.al_type returnType),local),
                               Ast_c.NotTest) in
-                  let id = (B.Ident s, typ),[iis] in
+                  let ident = name in
+                  let idexpr = (B.Ident (ident), typ),Ast_c.noii in
                   F.DefineExpr
-                    ((B.Assignment (id, B.SimpleAssign, e), 
-                     Ast_c.noType()), iini)
+                    ((B.Assignment (idexpr, B.SimpleAssign, e), 
+                     Ast_c.noType()), [iini])
               | _ -> F.Decl decl
               )
           | _ -> F.Decl decl
@@ -659,7 +646,7 @@ let rec (expression: (A.expression, Ast_c.expression) matcher) =
       (* old: before have a MetaConst. Now we factorize and use 'form' to 
        * differentiate between different cases *)
       let rec matches_id = function
-         B.Ident(c) -> true
+         B.Ident(name) -> true
        | B.Cast(ty,e) -> matches_id (B.unwrap_expr e)
        | _ -> false in
       let form_ok =
@@ -668,9 +655,14 @@ let rec (expression: (A.expression, Ast_c.expression) matcher) =
        | (A.CONST,e) ->
            let rec matches = function
                B.Constant(c) -> true
-              | B.Ident idb when idb =~ "^[A-Z_][A-Z_0-9]*$" -> 
-                 pr2_once ("warning: I consider " ^ idb ^ " as a constant");
-                 true
+              | B.Ident (nameidb) -> 
+                  let s = Ast_c.str_of_name nameidb in 
+                  if s =~ "^[A-Z_][A-Z_0-9]*$" 
+                  then begin
+                   pr2_once ("warning: I consider " ^ s ^ " as a constant");
+                   true
+                  end
+                  else false
              | B.Cast(ty,e) -> matches (B.unwrap_expr e)
              | B.Unary(e,B.UnMinus) -> matches (B.unwrap_expr e)
              | B.SizeOfExpr(exp) -> true
@@ -740,12 +732,12 @@ let rec (expression: (A.expression, Ast_c.expression) matcher) =
   | A.Edots (_, Some expr), _    -> failwith "not handling when on Edots"
        
        
-  | A.Ident ida,   ((B.Ident idb, typ),ii) ->
-      let ib1 = tuple_of_list1 ii in
-      ident DontKnow ida (idb, ib1) >>= (fun ida (idb, ib1) -> 
+  | A.Ident ida,   ((B.Ident (nameidb), typ),noii) ->
+      assert (null noii);
+      ident_cpp DontKnow ida nameidb >>= (fun ida nameidb -> 
         return (
         ((A.Ident ida)) +> wa, 
-        ((B.Ident idb, typ),[ib1])
+        ((B.Ident (nameidb), typ),Ast_c.noii)
           ))
         
        
@@ -963,25 +955,25 @@ let rec (expression: (A.expression, Ast_c.expression) matcher) =
 
   (* todo?: handle some isomorphisms here ? *)
   | A.RecordAccess (ea, ia1, ida), ((B.RecordAccess (eb, idb), typ),ii) ->
-      let (ib1, ib2) = tuple_of_list2 ii in
-      ident DontKnow ida (idb, ib2) >>= (fun ida (idb, ib2) -> 
+      let (ib1) = tuple_of_list1 ii in
+      ident_cpp DontKnow ida idb >>= (fun ida idb -> 
       tokenf ia1 ib1 >>= (fun ia1 ib1 -> 
       expression ea eb >>= (fun ea eb -> 
         return (
           ((A.RecordAccess (ea, ia1, ida))) +> wa,
-          ((B.RecordAccess (eb, idb), typ), [ib1;ib2])
+          ((B.RecordAccess (eb, idb), typ), [ib1])
         ))))
 
 
 
   | A.RecordPtAccess (ea,ia1,ida),((B.RecordPtAccess (eb, idb), typ), ii) ->
-      let (ib1, ib2) = tuple_of_list2 ii in
-      ident DontKnow ida (idb, ib2) >>= (fun ida (idb, ib2) -> 
+      let (ib1) = tuple_of_list1 ii in
+      ident_cpp DontKnow ida idb >>= (fun ida idb -> 
       tokenf ia1 ib1 >>= (fun ia1 ib1 -> 
       expression ea eb >>= (fun ea eb -> 
         return (
           ((A.RecordPtAccess (ea, ia1, ida))) +> wa,
-          ((B.RecordPtAccess (eb, idb), typ), [ib1;ib2])
+          ((B.RecordPtAccess (eb, idb), typ), [ib1])
         ))))
 
 
@@ -1092,6 +1084,19 @@ let rec (expression: (A.expression, Ast_c.expression) matcher) =
 
 
 (* ------------------------------------------------------------------------- *)
+and (ident_cpp: info_ident -> (A.ident, B.name) matcher) = 
+ fun infoidb ida idb -> 
+   match idb with
+   | B.RegularName (s, iis) -> 
+       let iis = tuple_of_list1 iis in
+       ident infoidb ida (s, iis) >>= (fun ida (s,iis) -> 
+         return (
+           ida, 
+           (B.RegularName (s, [iis]))
+         ))
+   | B.CppConcatenatedName _ | B.CppVariadicName _ |B.CppIdentBuilder _
+       -> raise Todo
+
 and (ident: info_ident -> (A.ident, string * Ast_c.info) matcher) = 
  fun infoidb ida ((idb, iib) as ib) -> 
   X.all_bound (A.get_inherited ida) >&&>
@@ -1212,7 +1217,7 @@ and arguments_bis = fun eas ebs ->
                * for the associated ',' see below how we handle the EComma
                * to match nothing.
                *)
-              (if startxs = []
+              (if null startxs
               then
                 if mcode_contain_plus (mcodekind mcode)
                 then fail 
@@ -1261,7 +1266,7 @@ and arguments_bis = fun eas ebs ->
           startendxs +> List.fold_left (fun acc (startxs, endxs) -> 
             acc >||> (
               let ok =
-                if startxs = []
+                if null startxs
                 then
                   if mcode_contain_plus (mcodekind ida)
                   then false 
@@ -1293,7 +1298,7 @@ and arguments_bis = fun eas ebs ->
                   X.envf keep inherited
                     (ida, Ast_c.MetaExprListVal startxs', max_min)
                 (fun () -> 
-                 if startxs = []
+                 if null startxs
                  then return (ida, [])
                   else X.distrf_args ida (Ast_c.split_comma startxs')
                 )
@@ -1322,21 +1327,25 @@ and arguments_bis = fun eas ebs ->
 and argument arga argb =
   X.all_bound (A.get_inherited arga) >&&>
    match A.unwrap arga, argb with
-  | A.TypeExp tya,  Right (B.ArgType (((b, sopt, tyb), ii_b_s))) ->
+  | A.TypeExp tya,  
+    Right (B.ArgType {B.p_register=b,iib; p_namei=sopt;p_type=tyb}) ->
 
       if b || sopt <> None
       then 
         (* failwith "the argument have a storage and ast_cocci does not have"*)
         fail
       else 
+        (* b = false and sopt = None *)
         fullType tya tyb >>= (fun tya tyb -> 
           return (
             (A.TypeExp tya) +> A.rewrap arga,
-            (Right (B.ArgType (((b, sopt, tyb), ii_b_s))))
+            (Right (B.ArgType {B.p_register=(b,iib);
+                               p_namei=sopt;
+                               p_type=tyb;}))
         ))
 
   | A.TypeExp tya,  _                                  -> fail
-  | _,              Right (B.ArgType (tyb, sto_iisto)) -> fail
+  | _,              Right (B.ArgType _) -> fail
   | _, Left argb ->
       expression arga argb >>= (fun arga argb ->
         return (arga, Left argb)
@@ -1374,7 +1383,7 @@ and parameters_bis eas ebs =
           startendxs +> List.fold_left (fun acc (startxs, endxs) -> 
             acc >||> (
 
-              (if startxs = []
+              (if null startxs
               then
                 if mcode_contain_plus (mcodekind mcode)
                 then fail 
@@ -1418,7 +1427,7 @@ and parameters_bis eas ebs =
           startendxs +> List.fold_left (fun acc (startxs, endxs) -> 
             acc >||> (
               let ok =
-                if startxs = []
+                if null startxs
                 then
                   if mcode_contain_plus (mcodekind ida)
                   then false 
@@ -1450,7 +1459,7 @@ and parameters_bis eas ebs =
                   X.envf keep inherited 
                     (ida, Ast_c.MetaParamListVal startxs', max_min)
                 (fun () -> 
-                 if startxs = []
+                 if null startxs
                  then return (ida, [])
                  else X.distrf_params ida (Ast_c.split_comma startxs')
                ) >>= (fun ida startxs -> 
@@ -1468,15 +1477,20 @@ and parameters_bis eas ebs =
       | A.VoidParam ta, ys -> 
           (match eas, ebs with
           | [], [Left eb] -> 
-              let ((hasreg, idbopt, tb), ii_b_s) = eb in
-              if idbopt = None && null ii_b_s 
+              let {B.p_register=(hasreg,iihasreg);
+                   p_namei = idbopt;
+                   p_type=tb; } = eb in
+              
+              if idbopt =*= None && not hasreg
               then 
                 match tb with 
                 | (qub, (B.BaseType B.Void,_)) -> 
                     fullType ta tb >>= (fun ta tb -> 
                       return (
                         [(A.VoidParam ta) +> A.rewrap ea],
-                        [Left ((hasreg, idbopt, tb), ii_b_s)]
+                        [Left {B.p_register=(hasreg, iihasreg);
+                               p_namei = idbopt;
+                               p_type = tb;}]
                       ))
                 | _ -> fail
               else fail
@@ -1518,23 +1532,40 @@ and parameters_bis eas ebs =
   
 
 
+(*
+let split_register_param = fun (hasreg, idb, ii_b_s) -> 
+  match hasreg, idb,  ii_b_s with
+  | false, Some s, [i1] -> Left (s, [], i1)
+  | true, Some s, [i1;i2] -> Left (s, [i1], i2)
+  | _, None, ii -> Right ii
+  | _ -> raise Impossible
+*)
+
+
+and parameter = fun (idaopt, typa) paramb ->
 
+  let {B.p_register = (hasreg,iihasreg);
+       p_namei = nameidbopt;
+       p_type = typb;} = paramb in
 
-and parameter = fun (idaopt, typa)   ((hasreg, idbopt, typb), ii_b_s) ->
   fullType typa typb >>= (fun typa typb -> 
-  match idaopt, Ast_c.split_register_param (hasreg, idbopt, ii_b_s) with
-  | Some ida, Left (idb, iihasreg, iidb) -> 
+  match idaopt, nameidbopt with
+  | Some ida, Some nameidb -> 
       (* todo: if minus on ida, should also minus the iihasreg ? *)
-      ident DontKnow ida (idb,iidb) >>= (fun ida (idb,iidb) -> 
+      ident_cpp DontKnow ida nameidb >>= (fun ida nameidb -> 
         return (
           (Some ida, typa),
-          ((hasreg, Some idb, typb), iihasreg++[iidb])
+          {B.p_register = (hasreg, iihasreg);
+           p_namei = Some (nameidb);
+           p_type = typb}
         ))
         
-  | None, Right iihasreg -> 
+  | None, None -> 
       return (
         (None, typa),
-        ((hasreg, None, typb), iihasreg)
+        {B.p_register=(hasreg,iihasreg);
+         p_namei = None;
+         p_type = typb;}
       )
       
 
@@ -1550,8 +1581,8 @@ and parameter = fun (idaopt, typa)   ((hasreg, idbopt, typb), ii_b_s) ->
       )
  *)
 
-  | Some _, Right _ -> fail
-  | None, Left _ -> fail
+  | Some _, None -> fail
+  | None, Some _ -> fail
   )
 
 
@@ -1590,7 +1621,7 @@ and (declaration: (A.mcodekind * bool * A.declaration,B.declaration) matcher) =
           )))
         
   | _, (B.DeclList (xs, iiptvirgb::iifakestart::iisto)) -> 
-      if X.mode = PatternMode
+      if X.mode =*= PatternMode
       then
         xs +> List.fold_left (fun acc var -> 
           acc >||> (
@@ -1644,7 +1675,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
   * T { }; that we want to match against typedef struct { } xx_t;
   *)
  | A.TyDecl (tya0, ptvirga), 
-   ({B.v_namei = Some ((idb, None),[iidb]);
+   ({B.v_namei = Some (nameidb, None);
      B.v_type = typb0;
      B.v_storage = (B.StoTypedef, inl);
      B.v_local = local; 
@@ -1666,7 +1697,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
          | Some s -> 
              pr2 (sprintf 
               "warning: both a typedef (%s) and struct name introduction (%s)"
-              idb s
+              (Ast_c.str_of_name nameidb) s
              );
              pr2 "warning: I will consider only the typedef";
              let (iisub, iisb, lbb, rbb) = tuple_of_list4 ii in
@@ -1677,8 +1708,8 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
            (Ast_c.nQ, (B.StructUnion (sub, sbopt, declsb), ii))
        in
        let fake_typeb = 
-         Ast_c.nQ,((B.TypeName (idb, Some 
-           (Lib_parsing_c.al_type structnameb))), [iidb]) 
+         Ast_c.nQ,((B.TypeName (nameidb, Some 
+           (Lib_parsing_c.al_type structnameb))), []) 
        in
 
        tokenf ptvirga iiptvirgb >>= (fun ptvirga iiptvirgb -> 
@@ -1703,11 +1734,11 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
                 let typb0 = ((qu, il), typb1) in
                
                 match fake_typeb with 
-                | _nQ, ((B.TypeName (idb,_typ)), [iidb]) -> 
+                | _nQ, ((B.TypeName (nameidb, _typ)),[]) -> 
 
                      return (
                      (A.TyDecl (tya0, ptvirga)) +> A.rewrap decla,
-                     (({B.v_namei = Some ((idb, None),[iidb]);
+                     (({B.v_namei = Some (nameidb, None);
                         B.v_type = typb0;
                         B.v_storage = (B.StoTypedef, inl);
                         B.v_local = local;
@@ -1735,7 +1766,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
                
                    return (
                      (A.TyDecl (tya0, ptvirga)) +> A.rewrap decla,
-                     (({B.v_namei = Some ((idb, None),[iidb]);
+                     (({B.v_namei = Some (nameidb, None);
                         B.v_type = typb0;
                         B.v_storage = (B.StoTypedef, inl);
                         B.v_local = local;
@@ -1755,22 +1786,18 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
    )
          
    | A.UnInit (stoa, typa, ida, ptvirga), 
-     ({B.v_namei = Some ((idb, _),[iidb]);
-       B.v_storage = (B.StoTypedef,_);
-     }, iivirg) -> 
-       fail
+     ({B.v_namei= Some (nameidb, _);B.v_storage= (B.StoTypedef,_);}, iivirg) 
+     -> fail
 
    | A.Init (stoa, typa, ida, eqa, inia, ptvirga), 
-     ({B.v_namei = Some ((idb, _),[iidb]);
-       B.v_storage = (B.StoTypedef,_);
-     }, iivirg) -> 
-       fail
+     ({B.v_namei=Some(nameidb, _);B.v_storage=(B.StoTypedef,_);}, iivirg)
+       -> fail
 
 
 
     (* could handle iso here but handled in standard.iso *)
    | A.UnInit (stoa, typa, ida, ptvirga), 
-     ({B.v_namei = Some ((idb, None),[iidb]);
+     ({B.v_namei = Some (nameidb, None);
        B.v_type = typb;
        B.v_storage = stob;
        B.v_local = local;
@@ -1779,12 +1806,12 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
 
        tokenf ptvirga iiptvirgb >>= (fun ptvirga iiptvirgb -> 
        fullType typa typb >>= (fun typa typb -> 
-       ident DontKnow ida (idb, iidb) >>= (fun ida (idb, iidb) -> 
+       ident_cpp DontKnow ida nameidb >>= (fun ida nameidb -> 
        storage_optional_allminus allminus stoa (stob, iistob) >>= 
         (fun stoa (stob, iistob) -> 
          return (
            (A.UnInit (stoa, typa, ida, ptvirga)) +>  A.rewrap decla,
-           (({B.v_namei = Some ((idb,None),[iidb]);
+           (({B.v_namei = Some (nameidb, None);
               B.v_type = typb;
               B.v_storage = stob;
               B.v_local = local;
@@ -1794,7 +1821,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
          )))))
 
    | A.Init (stoa, typa, ida, eqa, inia, ptvirga), 
-     ({B.v_namei = Some((idb,Some inib),[iidb;iieqb]);
+     ({B.v_namei = Some(nameidb, Some (iieqb, inib));
        B.v_type = typb;
        B.v_storage = stob;
        B.v_local = local;
@@ -1804,13 +1831,13 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
        tokenf ptvirga iiptvirgb >>= (fun ptvirga iiptvirgb -> 
        tokenf eqa iieqb >>= (fun eqa iieqb -> 
        fullType typa typb >>= (fun typa typb -> 
-       ident DontKnow ida (idb, iidb) >>= (fun ida (idb, iidb) -> 
+       ident_cpp DontKnow ida nameidb >>= (fun ida nameidb -> 
        storage_optional_allminus allminus stoa (stob, iistob) >>= 
        (fun stoa (stob, iistob) -> 
        initialiser inia inib >>= (fun inia inib -> 
          return (
            (A.Init (stoa, typa, ida, eqa, inia, ptvirga)) +> A.rewrap decla,
-           (({B.v_namei = Some((idb,Some inib),[iidb;iieqb]);
+           (({B.v_namei = Some(nameidb, Some (iieqb, inib));
               B.v_type = typb;
               B.v_storage = stob;
               B.v_local = local;
@@ -1827,7 +1854,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
        B.v_attr = attrs;
      }, iivirg)  ->
 
-       if stob = (B.NoSto, false)
+       if stob =*= (B.NoSto, false)
        then
          tokenf ptvirga iiptvirgb >>= (fun ptvirga iiptvirgb -> 
          fullType typa typb >>= (fun typa typb -> 
@@ -1844,7 +1871,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
 
 
    | A.Typedef (stoa, typa, ida, ptvirga), 
-     ({B.v_namei = Some ((idb, None),[iidb]);
+     ({B.v_namei = Some (nameidb, None);
        B.v_type = typb;
        B.v_storage = (B.StoTypedef,inline);
        B.v_local = local;
@@ -1864,30 +1891,39 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
        | A.MetaType(_,_,_) -> 
 
            let fake_typeb = 
-             Ast_c.nQ, ((B.TypeName (idb, Ast_c.noTypedefDef())), [iidb]) 
+             Ast_c.nQ, ((B.TypeName (nameidb, Ast_c.noTypedefDef())), []) 
            in
            fullTypebis ida fake_typeb >>= (fun ida fake_typeb -> 
              match fake_typeb with
-             | _nQ, ((B.TypeName (idb,_typ)), [iidb]) -> 
-                 return (ida, (idb, iidb))
+             | _nQ, ((B.TypeName (nameidb, _typ)), []) ->
+                 return (ida, nameidb)
              | _ -> raise Impossible
            )
 
        | A.TypeName sa -> 
-           if (term sa) =$= idb
-           then 
-             tokenf sa iidb >>= (fun sa iidb -> 
-               return (
-                 (A.TypeName sa) +> A.rewrap ida,
-                 (idb, iidb)
-               ))
-             else fail
+           (match nameidb with
+           | B.RegularName (sb, iidb) -> 
+               let iidb1 = tuple_of_list1 iidb in
+               
+               if (term sa) =$= sb
+               then 
+                 tokenf sa iidb1 >>= (fun sa iidb1 -> 
+                   return (
+                     (A.TypeName sa) +> A.rewrap ida,
+                     B.RegularName (sb, [iidb1])
+                   ))
+               else fail
+
+           | B.CppConcatenatedName _ | B.CppVariadicName _ |B.CppIdentBuilder _
+               -> raise Todo
+           )
+
        | _ -> raise Impossible
 
-       ) >>= (fun ida (idb, iidb) ->
+       ) >>= (fun ida nameidb ->
          return (
            (A.Typedef (stoa, typa, ida, ptvirga)) +> A.rewrap decla,
-           (({B.v_namei = Some ((idb, None),[iidb]);
+           (({B.v_namei = Some (nameidb, None);
               B.v_type = typb;
               B.v_storage = (B.StoTypedef,inline);
               B.v_local = local;
@@ -1921,8 +1957,8 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
    | A.OptDecl _,    _ | A.UniqueDecl _,     _ -> 
        failwith "not handling Opt/Unique Decl"
 
-   | _, ({B.v_namei=Some _}, _)
-       -> fail
+   | _, ({B.v_namei=Some _}, _) -> 
+       fail
 
 
 
@@ -2165,7 +2201,7 @@ and (struct_fields: (A.declaration list, B.field list) matcher) =
           startendxs +> List.fold_left (fun acc (startxs, endxs) -> 
             acc >||> (
               
-              (if startxs = []
+              (if null startxs 
               then
                 if mcode_contain_plus (mcodekind mcode)
                 then fail 
@@ -2205,21 +2241,20 @@ and (struct_field: (A.declaration, B.field) matcher) = fun fa fb ->
     | [onevar,iivirg] -> 
       assert (null iivirg);
       (match onevar with
-      | B.BitField (sopt, typb, expr), ii -> 
+      | B.BitField (sopt, typb, _, expr) -> 
           pr2_once "warning: bitfield not handled by ast_cocci";
           fail
-      | B.Simple (None, typb), ii -> 
+      | B.Simple (None, typb) -> 
           pr2_once "warning: unamed struct field not handled by ast_cocci";
           fail
-      | B.Simple (Some idb, typb), ii -> 
-          let (iidb) = tuple_of_list1 ii in
+      | B.Simple (Some nameidb, typb) -> 
 
           (* build a declaration from a struct field *)
           let allminus = false in
           let iisto = [] in
           let stob = B.NoSto, false in
           let fake_var = 
-            ({B.v_namei = Some ((idb, None),[iidb]);
+            ({B.v_namei = Some (nameidb, None);
               B.v_type = typb;
               B.v_storage = stob;
               B.v_local = Ast_c.NotLocalDecl;
@@ -2231,11 +2266,12 @@ and (struct_field: (A.declaration, B.field) matcher) = fun fa fb ->
             (fun fa (var,iiptvirgb,iisto) -> 
 
               match fake_var with
-              | ({B.v_namei = Some ((idb, None),[iidb]);
+              | ({B.v_namei = Some (nameidb, None);
                   B.v_type = typb;
                   B.v_storage = stob;
                 }, iivirg) -> 
-                  let onevar = B.Simple (Some idb, typb), [iidb] in
+
+                  let onevar = B.Simple (Some nameidb, typb) in
                   
                   return (
                     (fa),
@@ -2383,7 +2419,7 @@ and simulate_signed ta basea stringsa signaopt tb baseb ii rebuilda =
       | A.VoidType,  B.Void 
       | A.FloatType, B.FloatType (B.CFloat)
       | A.DoubleType, B.FloatType (B.CDouble) -> 
-           assert (signaopt = None); 
+           assert (signaopt =*= None); 
           let stringa = tuple_of_list1 stringsa in
            let (ibaseb) = tuple_of_list1 ii in 
            tokenf stringa ibaseb >>= (fun stringa ibaseb -> 
@@ -2392,7 +2428,7 @@ and simulate_signed ta basea stringsa signaopt tb baseb ii rebuilda =
                (B.BaseType baseb, [ibaseb])
              ))
             
-      | A.CharType,  B.IntType B.CChar when signaopt = None -> 
+      | A.CharType,  B.IntType B.CChar when signaopt =*= None -> 
          let stringa = tuple_of_list1 stringsa in
           let ibaseb = tuple_of_list1 ii in
            tokenf stringa ibaseb >>= (fun stringa ibaseb -> 
@@ -2482,16 +2518,14 @@ and simulate_signed_meta ta basea signaopt tb baseb ii rebuilda =
 
       let match_to_type rebaseb = 
        sign signaopt signbopt >>= (fun signaopt iisignbopt -> 
-       let ibaseb = tuple_of_list1 iibaseb in
        let fta = A.rewrap basea (A.Type(None,basea)) in
-       let ftb = Ast_c.nQ,(B.BaseType (rebaseb), [ibaseb]) in
+       let ftb = Ast_c.nQ,(B.BaseType (rebaseb), iibaseb) in
        fullType fta ftb >>= (fun fta (_,tb) ->
          (match A.unwrap fta,tb with
            A.Type(_,basea), (B.BaseType baseb, ii) ->
-             let ibaseb = tuple_of_list1 ii in
              return (
              (rebuilda (basea, signaopt)) +> A.rewrap ta,
-             (B.BaseType (baseb), iisignbopt ++ [ibaseb])
+             (B.BaseType (baseb), iisignbopt ++ ii)
                )
          | _ -> failwith "not possible"))) in
         
@@ -2505,13 +2539,7 @@ and simulate_signed_meta ta basea signaopt tb baseb ii rebuilda =
           (match iibaseb with 
           | [] -> fail (* metavariable has to match something *)
 
-          | [x;y] -> 
-              pr2_once 
-                "warning: long int or short int not handled by ast_cocci";
-              fail
-
-          | [ibaseb] -> match_to_type (B.IntType (B.Si (B.Signed, ty)))
-          | _ -> raise Impossible
+          | _ -> match_to_type (B.IntType (B.Si (B.Signed, ty)))
 
           )
 
@@ -2739,16 +2767,26 @@ and (typeC: (A.typeC, Ast_c.typeC) matcher) =
     * uint in the C code. But some CEs consists in renaming some types,
     * so we don't want apply isomorphisms every time. 
     *) 
-    | A.TypeName sa,  (B.TypeName (sb,typb), ii) ->
-        let (isb) = tuple_of_list1 ii in
-        if (term sa) =$= sb
-        then 
-          tokenf sa isb >>= (fun sa isb -> 
-          return (
-            (A.TypeName sa) +> A.rewrap ta,
-            (B.TypeName (sb,typb), [isb])
-          ))
-        else fail
+    | A.TypeName sa,  (B.TypeName (nameb, typb), noii) ->
+        assert (null noii);
+
+        (match nameb with
+        | B.RegularName (sb, iidb) -> 
+            let iidb1 = tuple_of_list1 iidb in
+               
+            if (term sa) =$= sb
+            then 
+              tokenf sa iidb1 >>= (fun sa iidb1 -> 
+                return (
+                  (A.TypeName sa) +> A.rewrap ta,
+                  (B.TypeName (B.RegularName (sb, [iidb1]), typb), noii)
+                   ))
+               else fail
+
+           | B.CppConcatenatedName _ | B.CppVariadicName _ |B.CppIdentBuilder _
+               -> raise Todo
+        )
+
 
     | _, (B.TypeOfExpr e, ii) -> fail
     | _, (B.TypeOfType e, ii) -> fail
@@ -2766,7 +2804,7 @@ and (typeC: (A.typeC, Ast_c.typeC) matcher) =
     | _, (B.Enum _, _) -> fail (* todo cocci ?*)
 
     | _,
-     ((B.TypeName (_, _) | B.StructUnionName (_, _) | B.EnumName _ |
+     ((B.TypeName _ | B.StructUnionName (_, _) | B.EnumName _ |
       B.StructUnion (_, _, _) |
       B.FunctionType _ | B.Array (_, _) | B.Pointer _ |
       B.BaseType _),
@@ -2867,9 +2905,9 @@ and compatible_base_type a signa b =
 
   match a, b with
   | Type_cocci.VoidType, B.Void -> 
-      assert (signa = None);
+      assert (signa =*= None);
       ok
-  | Type_cocci.CharType, B.IntType B.CChar when signa = None -> 
+  | Type_cocci.CharType, B.IntType B.CChar when signa =*= None -> 
       ok
   | Type_cocci.CharType, B.IntType (B.Si (signb, B.CChar2)) -> 
       compatible_sign signa signb 
@@ -2883,10 +2921,10 @@ and compatible_base_type a signa b =
       pr2_once "no longlong in cocci";
       fail
   | Type_cocci.FloatType, B.FloatType B.CFloat ->
-      assert (signa = None); 
+      assert (signa =*= None); 
       ok
   | Type_cocci.DoubleType, B.FloatType B.CDouble ->
-      assert (signa = None); 
+      assert (signa =*= None); 
       ok
   | _, B.FloatType B.CLongDouble -> 
       pr2_once "no longdouble in cocci";
@@ -2942,16 +2980,17 @@ and compatible_type a (b,local) =
        loop (a,b)
     | Type_cocci.StructUnionName (sua, _, sa),
        (qub, (B.StructUnionName (sub, sb),ii)) -> 
-         if equal_structUnion_type_cocci sua sub && sa = sb
+         if equal_structUnion_type_cocci sua sub && sa =$= sb
          then ok
          else fail
     | Type_cocci.EnumName (_, sa),
        (qub, (B.EnumName (sb),ii)) -> 
-         if sa = sb
+         if sa =$= sb
          then ok
          else fail
-    | Type_cocci.TypeName sa, (qub, (B.TypeName (sb,_typb), ii)) -> 
-       if sa = sb 
+    | Type_cocci.TypeName sa, (qub, (B.TypeName (namesb, _typb),noii)) -> 
+        let sb = Ast_c.str_of_name namesb in
+       if sa =$= sb 
        then ok
        else fail
 
@@ -2980,7 +3019,7 @@ and compatible_type a (b,local) =
         )
 
   (* subtil: must be after the MetaType case *)
-    | a, (qub, (B.TypeName (sb,Some b), ii)) -> 
+    | a, (qub, (B.TypeName (_namesb, Some b), noii)) -> 
       (* kind of typedef iso *)
        loop (a,b)
 
@@ -3052,7 +3091,7 @@ and inc_file (a, before_after) (b, h_rel_pos) =
         | _, None -> false 
         )
 
-    | (A.IncPath x)::xs, y::ys -> x = y && aux_inc (xs, ys) (x::passed)
+    | (A.IncPath x)::xs, y::ys -> x =$= y && aux_inc (xs, ys) (x::passed)
     | _ -> failwith "IncDots not in last place or other pb"
         
   in
@@ -3093,7 +3132,7 @@ and define_paramsbis = fun eas ebs ->
           startendxs +> List.fold_left (fun acc (startxs, endxs) -> 
             acc >||> (
 
-              (if startxs = []
+              (if null startxs
               then
                 if mcode_contain_plus (mcodekind mcode)
                 then fail 
@@ -3185,7 +3224,7 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) =
       | F.CaseNode _
       | F.TrueNode | F.FalseNode | F.AfterNode | F.FallThroughNode 
       | F.InLoopNode -> 
-          if X.mode = PatternMode 
+          if X.mode =*= PatternMode 
           then return default 
           else
             if mcode_contain_plus (mcodekind mcode)
@@ -3194,7 +3233,7 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) =
             else return default
 
       | F.EndStatement None -> 
-          if X.mode = PatternMode then return default 
+          if X.mode =*= PatternMode then return default 
           else 
               (* DEAD CODE NOW ? only useful in -no_cocci_vs_c_3 ?
                  if mcode_contain_plus (mcodekind mcode)
@@ -3214,10 +3253,10 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) =
             ))
 
       | F.FunHeader _ -> 
-          if X.mode = PatternMode then return default
+          if X.mode =*= PatternMode then return default
           else failwith "a MetaRuleElem can't transform a headfunc"
       | _n -> 
-          if X.mode = PatternMode then return default 
+          if X.mode =*= PatternMode then return default 
           else 
           X.distrf_node (generalize_mcode mcode) node >>= (fun mcode node -> 
             return (
@@ -3358,7 +3397,7 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) =
 
 
   | A.FunHeader (mckstart, allminus, fninfoa, ida, oparen, paramsa, cparen),
-    F.FunHeader ({B.f_name = idb;
+    F.FunHeader ({B.f_name = nameidb;
                   f_type = (retb, (paramsb, (isvaargs, iidotsb)));
                   f_storage = stob;
                   f_attr = attrs;
@@ -3389,13 +3428,13 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) =
       with [A.FAttr(a)] -> failwith "not checking attributes" | _ -> ());
 
       (match ii with
-      | iidb::ioparenb::icparenb::iifakestart::iistob -> 
+      | ioparenb::icparenb::iifakestart::iistob -> 
 
           (* maybe important to put ident as the first tokens to transform.
            * It's related to transform_proto. So don't change order
            * between the >>=.
            *)
-          ident LocalFunction ida (idb, iidb) >>= (fun ida (idb, iidb) -> 
+          ident_cpp LocalFunction ida nameidb >>= (fun ida nameidb -> 
           X.tokenf_mck mckstart iifakestart >>= (fun mckstart iifakestart -> 
           tokenf oparen ioparenb >>= (fun oparen ioparenb ->
           tokenf cparen icparenb >>= (fun cparen icparenb ->
@@ -3427,14 +3466,14 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) =
              return (
                A.FunHeader(mckstart,allminus,fninfoa,ida,oparen,
                           paramsa,cparen),
-               F.FunHeader ({B.f_name = idb;
+               F.FunHeader ({B.f_name = nameidb;
                              f_type = (retb, (paramsb, (isvaargs, iidotsb)));
                              f_storage = stob;
                              f_attr = attrs;
                              f_body = body;
                              f_old_c_style = oldstyle; (* TODO *)
                            },
-                           iidb::ioparenb::icparenb::iifakestart::iistob)
+                           ioparenb::icparenb::iifakestart::iistob)
                 )
               ))))))))
       | _ -> raise Impossible
@@ -3619,7 +3658,7 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) =
                B.i_is_in_ifdef = inifdef;
                B.i_content = copt;
               } ->
-      assert (copt = None);
+      assert (copt =*= None);
       
       let include_requirment = 
         match mcodekind incla, mcodekind filea with
@@ -3709,30 +3748,27 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) =
 
   | _, F.ExprStatement (_, (None, ii)) -> fail (* happen ? *)
 
-  | A.Label(id,dd), F.Label (st,(s,ii)) ->
-      let (ib1,ib2) = tuple_of_list2 ii in
-      let (string_of_id,rebuild) =
-       match A.unwrap id with
-         A.Id(s) -> (s,function s -> A.rewrap id (A.Id(s)))
-       | _ -> failwith "labels with metavariables not supported" in
-      if (term string_of_id) =$= s
-      then
-       tokenf string_of_id ib1 >>= (fun string_of_id ib1 ->
+  | A.Label(id,dd), F.Label (st, nameb, ((),ii)) ->
+      let (ib2) = tuple_of_list1 ii in
+      (match A.unwrap id with
+      | A.Id(_s) ->
+       ident_cpp DontKnow id nameb >>= (fun ida nameb ->
        tokenf dd ib2 >>= (fun dd ib2 ->
          return (
-           A.Label(rebuild string_of_id,dd),
-           F.Label (st,(s,[ib1;ib2]))
+           A.Label (ida,dd),
+           F.Label (st,nameb, ((),[ib2]))
          )))
-      else fail
+      | _ -> failwith "labels with metavariables not supported"
+      )
 
-  | A.Goto(goto,id,sem),          F.Goto (st,(s,ii))       ->
-      let (ib1,ib2,ib3) = tuple_of_list3 ii in
+  | A.Goto(goto,id,sem),          F.Goto (st,nameb, ((),ii))       ->
+      let (ib1,ib3) = tuple_of_list2 ii in
       tokenf goto ib1 >>= (fun goto ib1 ->
-      ident DontKnow id (s, ib2) >>= (fun id (s, ib2) ->
+      ident_cpp DontKnow id nameb >>= (fun id nameb ->
       tokenf sem ib3 >>= (fun sem ib3 ->
        return(
            A.Goto(goto,id,sem),
-            F.Goto (st,(s,[ib1;ib2;ib3]))
+            F.Goto (st,nameb, ((),[ib1;ib3]))
           ))))
 
   (* have not a counter part in coccinelle, for the moment *)
@@ -3749,7 +3785,7 @@ let rec (rule_elem_node: (A.rule_elem, Control_flow_c.node) matcher) =
     (F.MacroStmt (_, _)| F.DefineDoWhileZeroHeader _| F.EndNode|F.TopNode)
       -> fail
   | _, 
-    (F.Label (_, _)|F.Break (_, _)|F.Continue (_, _)|F.Default (_, _)|
+    (F.Label (_, _, _)|F.Break (_, _)|F.Continue (_, _)|F.Default (_, _)|
     F.Case (_, _)|F.Include _|F.Goto _|F.ExprStatement _|
     F.DefineType _|F.DefineExpr _|F.DefineTodo|
     F.DefineHeader (_, _)|F.ReturnExpr (_, _)|F.Return (_, _)|F.MacroIterHeader (_, _)|
index 65403a6..c9c3d02 100644 (file)
@@ -137,7 +137,7 @@ let (labels_for_ctl: string list (* dropped isos *) ->
       | Lib_engine.Top,         F.TopNode ->   [nodei, (p,[])]
       | Lib_engine.Exit,        F.Exit ->      [nodei, (p,[])]
       | Lib_engine.ErrorExit,   F.ErrorExit -> [nodei, (p,[])]
-      |        Lib_engine.Goto,        F.Goto(_,_) -> [nodei, (p,[])]
+      |        Lib_engine.Goto,        F.Goto(_,_,_) -> [nodei, (p,[])]
 
       | Lib_engine.InLoop , _ -> []
       | Lib_engine.TrueBranch , _ -> []
@@ -213,15 +213,15 @@ let (fix_flow_ctl2: F.cflow -> F.cflow) = fun flow ->
 
   (* for the #define CFG who have no Exit but have at least a EndNode *)
   (try 
-      let endi  = F.find_node (fun x -> x = F.EndNode) !g in
+      let endi  = F.find_node (fun x -> x =*= F.EndNode) !g in
       !g#add_arc ((endi, endi), F.Direct);
     with Not_found -> ()
   );
 
   (* for the regular functions *)
   (try 
-    let exitnodei  = F.find_node (fun x -> x = F.Exit) !g in
-    let errornodei = F.find_node (fun x -> x = F.ErrorExit) !g in
+    let exitnodei  = F.find_node (fun x -> x =*= F.Exit) !g in
+    let errornodei = F.find_node (fun x -> x =*= F.ErrorExit) !g in
     
     !g#add_arc ((exitnodei, exitnodei), F.Direct);
     
@@ -293,7 +293,7 @@ module ENV =
   struct
     type value = Lib_engine.metavar_binding_kind2
     type mvar = Ast_cocci.meta_name
-    let eq_mvar x x' = x = x'
+    let eq_mvar x x' = x =*= x'
     let eq_val v v' =
       (* v = v' *)
       match (v,v') with
@@ -304,7 +304,7 @@ module ENV =
       |        (Lib_engine.NormalMetaVal(Ast_c.MetaTypeVal a),
         Lib_engine.NormalMetaVal(Ast_c.MetaTypeVal b)) ->
           C_vs_c.eq_type a b
-      |        _ -> v = v'
+      |        _ -> v =*= v'
     let merge_val v v' = (* values guaranteed to be compatible *)
       (* v *)
       match (v,v') with
@@ -399,7 +399,7 @@ let (satbis_to_trans_info:
 let rec coalesce_positions = function
     [] -> []
   | (x,Ast_c.MetaPosValList l)::rest ->
-      let (same,others) = List.partition (function (x1,_) -> x = x1) rest in
+      let (same,others) = List.partition (function (x1,_) -> x =*= x1) rest in
       let ls =
        List.concat
          (List.map
index 445c8d6..32d69d4 100644 (file)
@@ -18,8 +18,6 @@
 * The authors reserve the right to distribute this or future versions of
 * Coccinelle under other licenses.
 *)
-
-
 open Common
 
 module Flag_engine = Flag_matcher
@@ -250,10 +248,10 @@ module XMATCH = struct
     match mck with 
     | Ast_cocci.PLUS -> Ast_cocci.PLUS
     | Ast_cocci.CONTEXT (pos, xs) -> 
-        assert (pos = Ast_cocci.NoPos || pos = Ast_cocci.DontCarePos);
+        assert (pos =*= Ast_cocci.NoPos || pos =*= Ast_cocci.DontCarePos);
         Ast_cocci.CONTEXT (posmck, xs)
     | Ast_cocci.MINUS (pos, xs) -> 
-        assert (pos = Ast_cocci.NoPos || pos = Ast_cocci.DontCarePos);
+        assert (pos =*= Ast_cocci.NoPos || pos =*= Ast_cocci.DontCarePos);
         Ast_cocci.MINUS (posmck, xs)
   
 
index 564a278..0d07454 100644 (file)
@@ -37,11 +37,17 @@ let get_extra _ =
   extra_counter := !extra_counter + 1;
   "__extra_counter__"^(string_of_int ctr)
 
-let read_fresh_id () =
+let get_seeded seed =
+  let ctr = !extra_counter in
+  extra_counter := !extra_counter + 1;
+  seed^(string_of_int ctr)
+
+let read_fresh_id _ =
   try 
     let s = read_line () in
     match Parse_c.tokens_of_string s with
       [Parser_c.TIdent _; Parser_c.EOF _] -> s
+    | [Parser_c.EOF _] -> get_extra()
     | _ -> failwith ("wrong fresh id: " ^ s)
   with End_of_file -> get_extra()
 
@@ -69,10 +75,13 @@ let process_tree inherited_env l =
   let new_triples = List.rev new_triples in
   let fresh_env =
     List.map
-      (function ((r,n) as fresh) ->
-       Printf.printf "%s: name for %s: " r n; (* not debugging code!!! *)
-       flush stdout;
-       (fresh,string2val(read_fresh_id())))
+      (function
+         ((r,n) as fresh,None) ->
+           Printf.printf "%s: name for %s: " r n; (* not debugging code!!! *)
+           flush stdout;
+           (fresh,string2val(read_fresh_id()))
+       | ((r,n) as fresh,Some seed) ->
+           (fresh,string2val(get_seeded seed)))
       all_fresh in
   let (_,res) =
     List.split
@@ -81,9 +90,10 @@ let process_tree inherited_env l =
           function (fresh,_) as elem ->
             List.map
               (function (freshs,((node,env,pred) as cur)) ->
-                if List.mem fresh freshs
-                then (freshs,(node,elem::env,pred))
-                else (freshs,cur))
+                try
+                  let _ = List.assoc fresh freshs in
+                  (freshs,(node,elem::env,pred))
+                with Not_found -> (freshs,cur))
               freshs_node_env_preds)
         (List.combine local_freshs new_triples)
         fresh_env) in
index 44e6dfd..2e1077f 100644 (file)
@@ -209,9 +209,9 @@ module XTRANS = struct
         ib
 
     | _ -> 
-        if (oldmcode, oldenv) = (mck, tin.binding)
+        if (oldmcode, oldenv) =*= (mck, tin.binding)
         then begin
-          if !Flag_matcher.show_misc 
+          if !Flag_matcher.show_misc
           then pr2 "already tagged but with same mcode, so safe";
           ib
         end
@@ -233,10 +233,13 @@ module XTRANS = struct
               Format.print_flush();
             *)
               failwith
-               (Common.sprintf "%s: already tagged token:\n%s"
-                  tin.extra.current_rule_name
-                  (Common.error_message (Ast_c.file_of_info ib)
-                     (Ast_c.str_of_info ib, Ast_c.opos_of_info ib)))
+               (match Ast_c.pinfo_of_info ib with
+                 Ast_c.FakeTok _ -> "already tagged fake token"
+               | _ ->
+                   Common.sprintf "%s: already tagged token:\n%s"
+                     tin.extra.current_rule_name
+                     (Common.error_message (Ast_c.file_of_info ib)
+                        (Ast_c.str_of_info ib, Ast_c.opos_of_info ib)))
             end
 
   let tokenf ia ib = fun tin -> 
@@ -403,7 +406,7 @@ module XTRANS = struct
       (match get_pos mck with 
       | Ast_cocci.DontCarePos -> true
       | Ast_cocci.FixPos (i1, i2) -> 
-          i1 = min && i2 = max
+          i1 =*= min && i2 =*= max
       | _ -> raise Impossible
       )
 
@@ -439,7 +442,7 @@ module XTRANS = struct
   let envf keep _inherited = fun (s, value, _) f tin -> 
     let s = Ast_cocci.unwrap_mcode s in
     let v = 
-      if keep = Type_cocci.Saved
+      if keep =*= Type_cocci.Saved
       then (
         try Some (List.assoc s tin.binding)
         with Not_found -> 
diff --git a/extra/.depend b/extra/.depend
deleted file mode 100644 (file)
index 8c6112e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-classic_patch.cmi: ../commons/common.cmi 
-kbuild.cmi: ../commons/common.cmi 
-maintainers.cmi: ../commons/common.cmi 
-classic_patch.cmo: ../commons/common.cmi classic_patch.cmi 
-classic_patch.cmx: ../commons/common.cmx classic_patch.cmi 
-kbuild.cmo: ../commons/common.cmi kbuild.cmi 
-kbuild.cmx: ../commons/common.cmx kbuild.cmi 
-maintainers.cmo: ../commons/common.cmi maintainers.cmi 
-maintainers.cmx: ../commons/common.cmx maintainers.cmi 
index dc26e71..4ebb12d 100644 (file)
@@ -4,12 +4,12 @@ TARGET=extra
 
 SOURCES = classic_patch.ml kbuild.ml maintainers.ml
 
-SYSLIBS = str.cma unix.cma 
+SYSLIBS = str.cma unix.cma
 
-LIBS=../commons/commons.cma ../parsing_c/parsing_c.cma ../globals/globals.cma 
+LIBS=../commons/commons.cma ../parsing_c/parsing_c.cma ../globals/globals.cma
 INCLUDES= -I ../commons -I ../globals -I  ../parsing_cocci -I  ../parsing_c
 
-#for warning:  -w A 
+#for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
 OCAMLCFLAGS ?= -g -dtypes
 OCAMLC =ocamlc$(OPTBIN) $(OCAMLCFLAGS) $(INCLUDES)
@@ -55,15 +55,16 @@ clean::
 .ml.cmx:
        $(OCAMLOPT) -c $<
 
-.ml.mldepend: 
+.ml.mldepend:
        $(OCAMLC) -i $<
 
 clean::
        rm -f *.cm[ioxa] *.o *.a *.cmxa *.annot
-
-clean::
        rm -f *~ .*~ gmon.out #*#
 
+distclean::
+       rm -f .depend
+
 beforedepend::
 
 depend:: beforedepend
index 10c4736..56be8fe 100644 (file)
@@ -124,7 +124,7 @@ let parse_makefile file =
     | s when s =~ "obj-\\$(CONFIG_.*)[ \t]*[\\+:]=\\(.*\\)" -> 
         let s = matched1 s in
         let objs = Common.split "[ \t]+" s in
-        assert(List.for_all (fun s -> thd3 (Common.dbe_of_filename s) = "o")
+        assert(List.for_all (fun s -> thd3 (Common.dbe_of_filename s) =$= "o")
                   objs);
         
         pr2 ("OBJS: " ^ (join "|" objs))
index ff5916d..581288a 100644 (file)
@@ -75,10 +75,10 @@ let generate_naive_subsystem_info dirs =
           if List.length dir_elems >= 2 then
             let base = Common.take 2 dir_elems in
             (fun dir_elems' -> 
-              List.length dir_elems' >= 2 && Common.take 2 dir_elems' = base),
+              List.length dir_elems' >= 2 && Common.take 2 dir_elems' =*= base),
             base
           else 
-            (fun dir_elems' -> dir_elems' = dir_elems), 
+            (fun dir_elems' -> dir_elems' =*= dir_elems), 
             dir_elems
         in
         
index 3d7e415..247fa4e 100644 (file)
@@ -51,7 +51,7 @@ type include_options =
     I_UNSPECIFIED | I_NO_INCLUDES | I_NORMAL_INCLUDES | I_ALL_INCLUDES
 let include_options = ref I_UNSPECIFIED
 
-let include_path = ref "include"
+let include_path = ref (None : string option)
 (* if true then when have a #include "../../xx.h", we look also for xx.h in
  * current directory. This is because of how works extract_c_and_res
  *)
diff --git a/globals/.depend b/globals/.depend
deleted file mode 100644 (file)
index e69de29..0000000
index d566808..c71daa0 100644 (file)
@@ -51,15 +51,16 @@ $(TARGET).cmxa: $(OPTOBJS) $(LIBS:.cma=.cmxa)
 .ml.cmx:
        $(OCAMLOPT) -c $<
 
-.ml.mldepend: 
+.ml.mldepend:
        $(OCAMLC) -i $<
 
 clean::
        rm -f *.cm[ioxa] *.o *.a *.cmxa *.annot
-
-clean::
        rm -f *~ .*~ gmon.out #*#
 
+distclean::
+       rm -f .depend
+
 beforedepend::
 
 depend:: beforedepend
similarity index 90%
rename from globals/config.ml
rename to globals/config.ml.in
index c133614..6d7bf93 100644 (file)
@@ -1,4 +1,4 @@
-let version = "0.1.6a"
+let version = "0.1.7"
 
 let path = 
   try (Sys.getenv "COCCINELLE_HOME") 
index 6568c4f..8156c5f 100644 (file)
@@ -16,3 +16,12 @@ Then simply type
  make
  make install
 
+Note:  'make' will compile the bytecode version by default.
+       You could use 'make all.opt' to have the optimized version.
+       If you compile both, 'make install' will take care of that
+       and install both, spatch and spatch.opt.
+       If you use only one of them, 'make install' will install
+       the one you have compiled, either spatch ou spatch.opt,
+       under the front-end spatch. You could use 'make world' to
+       compile the bytecode and the native code version.
+
diff --git a/main.ml b/main.ml
index a49d8a0..52096bb 100644 (file)
--- a/main.ml
+++ b/main.ml
@@ -214,8 +214,8 @@ let short_options = [
   "  causes local include files to be used";
   "-include_headers", Arg.Set include_headers,
   "    process header files independently";
-  "-I",   Arg.Set_string FC.include_path,
-  "  <dir> containing the Linux headers (optional)";
+  "-I",   Arg.String (function x -> FC.include_path := Some x),
+  "  <dir> containing the header files (optional)";
 
 
   "-dir", Arg.Set dir,
@@ -239,7 +239,7 @@ let short_options = [
     "  guess what";
 
   "-date",   Arg.Unit (fun () -> 
-    pr2 "version: $Date: 2009/02/19 16:00:47 $";
+    pr2 "version: $Date: 2009/04/15 18:01:55 $";
     raise (Common.UnixExit 0)
     ), 
   "   guess what";
@@ -378,12 +378,18 @@ let other_options = [
     "   <sec> timeout in seconds";
     "-steps", Arg.Int (fun x -> Flag_ctl.steps := Some x), 
     "   max number of model checking steps per code unit";
+    "-iso_limit", Arg.Int (fun x -> Flag_parsing_cocci.iso_limit := Some x),
+    "   max depth of iso application";
+    "-no_iso_limit", Arg.Unit (fun _ -> Flag_parsing_cocci.iso_limit := None),
+    "   disable limit on max depth of iso application";
     "-track_iso", Arg.Set Flag.track_iso_usage,
     "   gather information about isomorphism usage";
     "-profile_iso",
     Arg.Unit
     (function () ->
-      Common.profile:=PSOME ["parse cocci";"mysat";"asttoctl2";"full_engine"]),
+      Common.profile :=
+       (*post_engine not included, because it doesn't use isos*)
+       PSOME ["parse cocci";"mysat";"asttoctl2";"pre_engine";"full_engine"]),
     "   gather information about the cost of isomorphism usage"
   ];
 
@@ -392,6 +398,7 @@ let other_options = [
   "change of algorithm options",
   "", 
   [  
+(* no popl in official version
     "-popl", Arg.Set FC.popl, 
     "    simplified SmPL, for the popl paper";
 
@@ -404,6 +411,7 @@ let other_options = [
     Arg.Unit
     (function _ -> FC.popl := true; Flag_popl.keep_all_wits := true), 
     "    simplified SmPL, for the popl paper";
+*)
 
     "-hrule", Arg.String
     (function s ->
@@ -556,7 +564,7 @@ let adjust_stdin cfile k =
       try
         let (dir, base, ext) = Common.dbe_of_filename cfile in
         let varfile = Common.filename_of_dbe (dir, base, "var") in
-        if ext = "c" && Common.lfile_exists varfile
+        if ext =$= "c" && Common.lfile_exists varfile
         then Some varfile
         else None 
       with Invalid_argument("Filename.chop_extension") -> None
@@ -584,103 +592,18 @@ let glimpse_filter (coccifile, isofile) dir =
        
        
 
-
 (*****************************************************************************)
-(* The coccinelle main entry point *)
+(* Main action *)
 (*****************************************************************************)
-let main () = 
-  begin
-    let arglist = Array.to_list Sys.argv in
-
-    if not (null (Common.inter_set arglist
-                    ["-cocci_file";"-sp_file";"-test";"-testall";
-                      "-test_okfailed";"-test_regression_okfailed"]))
-    then run_profile quiet_profile;
-
-    let args = ref [] in
-
-    (* this call can set up many global flag variables via the cmd line *)
-    arg_parse2 (Arg.align all_options) (fun x -> args := x::!args) usage_msg;
-
-    (if !dir && List.length !args > 1
-    then
-      begin
-       let chosen = List.hd !args in
-       pr2 ("ignoring all but the last specified directory: "^chosen);
-       args := [chosen]
-      end);
-    args := List.rev !args;
-
-    if !cocci_file <> "" && (not (!cocci_file =~ ".*\\.\\(sgrep\\|spatch\\)$"))
-    then cocci_file := Common.adjust_ext_if_needed !cocci_file ".cocci";
-
-    if !Config.std_iso <> "" 
-    then Config.std_iso := Common.adjust_ext_if_needed !Config.std_iso ".iso";
-    if !Config.std_h <> "" 
-    then Config.std_h := Common.adjust_ext_if_needed !Config.std_h ".h";
-
-    if !Config.std_h <> "" 
-    then Parse_c.init_defs !Config.std_h;
-
-
-    (* must be done after Arg.parse, because Common.profile is set by it *)
-    Common.profile_code "Main total" (fun () -> 
-
-
-    let all_actions = Test_parsing_c.actions() in
-
-    (match (!args) with
-
-    (* --------------------------------------------------------- *)
-    (* The test framework. Works with tests/ or .ok and .failed  *)
-    (* --------------------------------------------------------- *)
-    | [x] when !test_mode    -> 
-        FC.include_path := "tests/include";
-        Testing.testone x !compare_with_expected
-
-    | []  when !test_all -> 
-        FC.include_path := "tests/include";
-        Testing.testall ()
-
-    | [] when !test_regression_okfailed -> 
-        Testing.test_regression_okfailed ()
-
-    | x::xs when !test_okfailed -> 
-        (* do its own timeout on FC.timeout internally *)
-        FC.relax_include_path := true;
-       adjust_stdin x (fun () -> 
-          Testing.test_okfailed !cocci_file (x::xs)
-        )
-
-    (* --------------------------------------------------------- *)
-    (* Actions, useful to debug subpart of coccinelle *)
-    (* --------------------------------------------------------- *)
 
-    | xs when List.mem !action (Common.action_list all_actions) ->
-        Common.do_action !action xs all_actions
-
-    | [file] when !action = "-parse_cocci" -> 
-        Testing.test_parse_cocci file
-
-     (* I think this is used by some scripts in some Makefile for our
-      * big-tests. So dont remove.
-      *)
-    | [file1;file2] when !action = "-compare_c" -> 
-       Test_parsing_c.test_compare_c file1 file2 (* result = unix code *)
-
-    (* could add the Test_parsing_c.test_actions such as -parse_c & co *)
-
-
-    (* --------------------------------------------------------- *)
-    (* This is the main entry *)
-    (* --------------------------------------------------------- *)
-    | x::xs -> 
-        
+let main_action xs = 
+  match xs with
+  | x::xs ->
        adjust_stdin x (fun () ->
-          if !cocci_file = ""
+          if !cocci_file =$= ""
           then failwith "I need a cocci file,  use -sp_file <file>";
 
-         if !dir && !Flag.patch = None
+         if !dir && !Flag.patch =*= None
          then
            (match xs with
            | [] -> Flag.patch := Some x
@@ -751,7 +674,7 @@ let main () =
                  let rec loop ct = function
                      [] -> []
                    | x::xs ->
-                       if (ct mod max) = index
+                       if (ct mod max) =|= index
                        then x::(loop (ct+1) xs)
                        else loop (ct+1) xs in
                  loop 0 infiles
@@ -772,24 +695,29 @@ let main () =
            | _ -> failwith "inconsistent distribution information" in
            
           let outfiles = 
-            Common.profile_code "Main.outfiles computation" (fun () -> 
-             infiles +> List.map (fun cfiles -> 
-               pr2 ("HANDLING: " ^ (join " " cfiles));
-               Common.timeout_function_opt !FC.timeout (fun () -> 
-               Common.report_if_take_time 10 (join " " cfiles) (fun () -> 
+            Common.profile_code "Main.outfiles computation" (fun () ->
+             let cocci_infos =
+               Cocci.pre_engine (!cocci_file, !Config.std_iso) in
+             let res =
+               infiles +> List.map (fun cfiles -> 
+                 pr2 ("HANDLING: " ^ (join " " cfiles));
+                 Common.timeout_function_opt !FC.timeout (fun () -> 
+                   Common.report_if_take_time 10 (join " " cfiles) (fun () -> 
                     (* Unix.sleep 1; *)
-                  try 
+                      try 
                     (* this is the main call *)
-                    Cocci.full_engine (!cocci_file, !Config.std_iso) cfiles
-                 with 
-                 | Common.UnixExit x -> raise (Common.UnixExit x)
-                 | e -> 
-                     if !dir
-                     then begin
-                       pr2 ("EXN:" ^ Printexc.to_string e); 
-                       [] (* *)
-                     end
-                     else raise e)))
+                       Cocci.full_engine cocci_infos cfiles
+                     with 
+                     | Common.UnixExit x -> raise (Common.UnixExit x)
+                     | e ->
+                         if !dir
+                         then begin
+                           pr2 ("EXN:" ^ Printexc.to_string e); 
+                           [] (* *)
+                         end
+                         else raise e))) in
+             Cocci.post_engine cocci_infos;
+             res
             ) +> List.concat 
           in
 
@@ -810,7 +738,7 @@ let main () =
                if !outplace_modif
                then Common.command2 ("cp "^outfile^" "^infile^".cocci_res");
                  
-               if !output_file = "" 
+               if !output_file =$= "" 
                then begin
                   let tmpfile = "/tmp/"^Common.basename infile in
                   pr2 (spf "One file modified. Result is here: %s" tmpfile);
@@ -819,9 +747,9 @@ let main () =
              ));
             if !output_file <> "" then
              (match outfiles with 
-             | [infile, Some outfile] when infile = x && null xs -> 
+             | [infile, Some outfile] when infile =$= x && null xs -> 
                   Common.command2 ("cp " ^outfile^ " " ^ !output_file);
-             | [infile, None] when infile = x && null xs -> 
+             | [infile, None] when infile =$= x && null xs -> 
                   Common.command2 ("cp " ^infile^ " " ^ !output_file);
              | _ -> 
                   failwith 
@@ -831,7 +759,109 @@ let main () =
             
             if !compare_with_expected
             then Testing.compare_with_expected outfiles))
-          
+
+  | [] -> raise Impossible
+
+
+(*****************************************************************************)
+(* The coccinelle main entry point *)
+(*****************************************************************************)
+let main () = 
+  begin
+    let arglist = Array.to_list Sys.argv in
+
+    if not (null (Common.inter_set arglist
+                    ["-cocci_file";"-sp_file";"-test";"-testall";
+                      "-test_okfailed";"-test_regression_okfailed"]))
+    then run_profile quiet_profile;
+
+    let args = ref [] in
+
+    (* this call can set up many global flag variables via the cmd line *)
+    arg_parse2 (Arg.align all_options) (fun x -> args := x::!args) usage_msg;
+
+    (if !dir
+    then
+      let chosen_dir =
+        if List.length !args > 1
+        then
+          begin
+            let chosen = List.hd !args in
+            pr2 ("ignoring all but the last specified directory: "^chosen);
+            args := [chosen];
+            chosen
+          end
+        else List.hd !args in
+      if !FC.include_path =*= None
+      then FC.include_path := Some (Filename.concat chosen_dir "include"));
+    args := List.rev !args;
+
+    if !cocci_file <> "" && (not (!cocci_file =~ ".*\\.\\(sgrep\\|spatch\\)$"))
+    then cocci_file := Common.adjust_ext_if_needed !cocci_file ".cocci";
+
+    if !Config.std_iso <> "" 
+    then Config.std_iso := Common.adjust_ext_if_needed !Config.std_iso ".iso";
+    if !Config.std_h <> "" 
+    then Config.std_h := Common.adjust_ext_if_needed !Config.std_h ".h";
+
+    if !Config.std_h <> "" 
+    then Parse_c.init_defs !Config.std_h;
+
+
+    (* must be done after Arg.parse, because Common.profile is set by it *)
+    Common.profile_code "Main total" (fun () -> 
+
+
+    let all_actions = Test_parsing_c.actions() in
+
+    (match (!args) with
+
+    (* --------------------------------------------------------- *)
+    (* The test framework. Works with tests/ or .ok and .failed  *)
+    (* --------------------------------------------------------- *)
+    | [x] when !test_mode    -> 
+        FC.include_path := Some "tests/include";
+        Testing.testone x !compare_with_expected
+
+    | []  when !test_all -> 
+        FC.include_path := Some "tests/include";
+        Testing.testall ()
+
+    | [] when !test_regression_okfailed -> 
+        Testing.test_regression_okfailed ()
+
+    | x::xs when !test_okfailed -> 
+        (* do its own timeout on FC.timeout internally *)
+        FC.relax_include_path := true;
+       adjust_stdin x (fun () -> 
+          Testing.test_okfailed !cocci_file (x::xs)
+        )
+
+    (* --------------------------------------------------------- *)
+    (* Actions, useful to debug subpart of coccinelle *)
+    (* --------------------------------------------------------- *)
+
+    | xs when List.mem !action (Common.action_list all_actions) ->
+        Common.do_action !action xs all_actions
+
+    | [file] when !action =$= "-parse_cocci" -> 
+        Testing.test_parse_cocci file
+
+     (* I think this is used by some scripts in some Makefile for our
+      * big-tests. So dont remove.
+      *)
+    | [file1;file2] when !action =$= "-compare_c" -> 
+       Test_parsing_c.test_compare_c file1 file2 (* result = unix code *)
+
+    (* could add the Test_parsing_c.test_actions such as -parse_c & co *)
+
+
+    (* --------------------------------------------------------- *)
+    (* This is the main entry *)
+    (* --------------------------------------------------------- *)
+    | x::xs -> 
+        main_action (x::xs)
+
     (* --------------------------------------------------------- *)
     (* empty entry *)
     (* --------------------------------------------------------- *)
diff --git a/menhirlib/.depend b/menhirlib/.depend
deleted file mode 100644 (file)
index af43dff..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-engine.cmo: engineTypes.cmo 
-engine.cmx: engineTypes.cmx 
-rowDisplacement.cmo: infiniteArray.cmo 
-rowDisplacement.cmx: infiniteArray.cmx 
-tableFormat.cmo: packedIntArray.cmo engineTypes.cmo 
-tableFormat.cmx: packedIntArray.cmx engineTypes.cmx 
-tableInterpreter.cmo: tableFormat.cmo rowDisplacement.cmo packedIntArray.cmo \
-    engineTypes.cmo engine.cmo 
-tableInterpreter.cmx: tableFormat.cmx rowDisplacement.cmx packedIntArray.cmx \
-    engineTypes.cmx engine.cmx 
index f98c9e4..f412b78 100644 (file)
@@ -10,7 +10,7 @@ SRC= infiniteArray.ml packedIntArray.ml rowDisplacement.ml engineTypes.ml \
   engine.ml tableFormat.ml tableInterpreter.ml convert.ml
 
 LIBS=
-INCLUDES= 
+INCLUDES=
 
 # copy what the menhir authors do
 EXTRAOPT=-for-pack MenhirLib
@@ -21,9 +21,9 @@ EXTRAOPT=-for-pack MenhirLib
 OCAMLCFLAGS=-g -dtypes
 OPTFLAGS=
 
-OCAMLC=ocamlc$(OPTBIN)     $(OCAMLCFLAGS) $(INCLUDES) 
-OCAMLOPT= ocamlopt$(OPTBIN) $(OPTFLAGS) $(EXTRAOPT)   $(INCLUDES) 
-OCAMLOPT2=ocamlopt$(OPTBIN) $(OPTFLAGS)              $(INCLUDES) 
+OCAMLC=ocamlc$(OPTBIN)     $(OCAMLCFLAGS) $(INCLUDES)
+OCAMLOPT= ocamlopt$(OPTBIN) $(OPTFLAGS) $(EXTRAOPT)   $(INCLUDES)
+OCAMLOPT2=ocamlopt$(OPTBIN) $(OPTFLAGS)              $(INCLUDES)
 OCAMLLEX=ocamllex$(OPTBIN)
 OCAMLYACC=ocamlyacc -v
 OCAMLDEP=ocamldep$(OPTBIN) $(INCLUDES)
@@ -46,9 +46,9 @@ $(TARGET).cma: $(OBJS) $(LIBS)
 $(TARGET).cmxa: $(OPTOBJS) $(LIBS:.cma=.cmxa)
        $(OCAMLOPT) -a -o $@ $(OPTOBJS)
 
-# I thought at first that only one file menhirLib.ml 
+# I thought at first that only one file menhirLib.ml
 # was needed but in fact it's a wierd cos menhirLib.cmo results from multi
-# files. They used the -pack ocamlc option, and for strange reason 
+# files. They used the -pack ocamlc option, and for strange reason
 # decided to produce a .cma instead of a classical .cma.
 # So I put all the necesseray files in this directory.
 
@@ -71,7 +71,7 @@ menhirLib.cmx: $(OPTOBJS)
 .ml.cmx:
        $(OCAMLOPT) -c $<
 
-.ml.mldepend: 
+.ml.mldepend:
        $(OCAMLC) -i $<
 
 clean::
@@ -85,4 +85,7 @@ beforedepend::
 depend:: beforedepend
        $(OCAMLDEP) *.mli *.ml    > .depend
 
+distclean::
+       rm -f .depend
+
 -include .depend
diff --git a/ocamlsexp/Makefile b/ocamlsexp/Makefile
new file mode 100644 (file)
index 0000000..fd31cc9
--- /dev/null
@@ -0,0 +1,166 @@
+##############################################################################
+# Variables
+##############################################################################
+
+SRC= \
+  type.ml \
+  parser.ml \
+  lexer.ml \
+  pre_sexp.ml \
+  sexp_intf.ml \
+  sexp.ml \
+  path.ml \
+  conv.ml \
+  conv_error.ml
+#SOURCES = \
+#  parser.mly \
+#  lexer.mll \
+# sexp.mli path.mli conv.mli 
+
+
+TARGET=sexplib1
+TARGETPACK=sexplib
+#LIB_PACK_NAME = sexplib
+
+##############################################################################
+# Generic variables
+##############################################################################
+
+INCLUDES=
+#-I +camlp4
+SYSLIBS= str.cma unix.cma bigarray.cma num.cma
+#INCDIRS = +camlp4
+#pad: take care for bigarray otherwise get some caml_ba_get_1 error msg
+
+##############################################################################
+#OCAMLFLAGS = -for-pack Sexplib
+
+#PACKS = type-conv
+#RESULT = sexplib
+
+#TRASH = pa_sexp_conv.cmi pa_sexp_conv.cmo pa_sexp_conv.annot
+
+#all: \
+#      pack-byte-code pack-native-code \
+#      sexplib.cma sexplib.cmxa \
+#      pa_sexp_conv.cmi pa_sexp_conv.cmo
+#
+#LIBINSTALL_FILES = \
+#  sexp.mli path.mli conv.mli \
+#  sexplib.cmi sexplib.cma sexplib.cmxa sexplib.a \
+#  pa_sexp_conv.cmi pa_sexp_conv.cmo
+#
+#install:      libinstall
+#uninstall:    libuninstall
+#
+#clean::       clean-doc
+#
+#-include $(OCAMLMAKEFILE)
+
+##############################################################################
+
+##############################################################################
+# Generic variables
+##############################################################################
+
+#dont use -custom, it makes the bytecode unportable.
+OCAMLCFLAGS= -g -dtypes # -w A
+#-for-pack Sexplib
+
+# This flag is also used in subdirectories so don't change its name here.
+OPTFLAGS=
+
+
+OCAMLC=ocamlc$(OPTBIN) $(OCAMLCFLAGS)  $(INCLUDES)  $(SYSINCLUDES) -thread
+OCAMLOPT=ocamlopt$(OPTBIN) $(OPTFLAGS) $(INCLUDES) $(SYSINCLUDES) -thread
+OCAMLLEX=ocamllex #-ml # -ml for debugging lexer, but slightly slower
+OCAMLYACC=ocamlyacc -v
+OCAMLDEP=ocamldep $(INCLUDES)
+OCAMLMKTOP=ocamlmktop -g -custom $(INCLUDES) -thread
+
+#-ccopt -static
+STATIC=
+
+
+##############################################################################
+# Top rules
+##############################################################################
+
+OBJS = $(SRC:.ml=.cmo)
+OPTOBJS = $(SRC:.ml=.cmx)
+
+all: $(TARGET).cma $(TARGETPACK).cmo
+all.opt: $(TARGET).cmxa
+
+$(TARGET).cma: $(OBJS)
+       $(OCAMLC) -a -o $(TARGET).cma $(OBJS)
+
+$(TARGET).cmxa: $(OPTOBJS) $(LIBS:.cma=.cmxa)
+       $(OCAMLOPT) -a -o $(TARGET).cmxa $(OPTOBJS)
+
+$(TARGET).top: $(OBJS) $(LIBS)
+       $(OCAMLMKTOP) -o $(TARGET).top $(SYSLIBS) $(LIBS) $(OBJS)
+
+clean::
+       rm -f $(TARGET).top
+
+
+
+$(TARGETPACK).cmo: $(OBJS)
+       $(OCAMLC) -pack -o $(TARGETPACK).cmo $(OBJS)
+
+# special handling, fun that they use cpp whereas they claim camplp4 can do everything
+pre_sexp.cmo: pre_sexp.ml
+       $(OCAMLC) -pp cpp -c $<
+
+pre_sexp.cmx: pre_sexp.ml
+       $(OCAMLOPT) -pp cpp -c $<
+
+
+
+lexer.ml: lexer.mll
+       $(OCAMLLEX) $<
+clean::
+       rm -f lexer.ml
+beforedepend:: lexer.ml
+
+
+parser.ml parser.mli: parser.mly
+       $(OCAMLYACC) $<
+clean::
+       rm -f parser.ml parser.mli parser.output
+beforedepend:: parser.ml parser.mli
+
+
+
+##############################################################################
+# Generic rules
+##############################################################################
+
+.SUFFIXES: .ml .mli .cmo .cmi .cmx
+
+.ml.cmo:
+       $(OCAMLC) -c $<
+.mli.cmi:
+       $(OCAMLC) -c $<
+.ml.cmx:
+       $(OCAMLOPT) -c $<
+
+.ml.mldepend: 
+       $(OCAMLC) -i $<
+
+clean::
+       rm -f *.cm[ioxa] *.o *.a *.cmxa *.annot
+clean::
+       rm -f *~ .*~ gmon.out #*#
+
+beforedepend::
+
+# need also -pp cpp here
+depend:: beforedepend
+       $(OCAMLDEP) -pp cpp *.mli *.ml    > .depend
+
+distclean: clean
+       rm -f .depend
+
+-include .depend
diff --git a/ocamlsexp/conv.ml b/ocamlsexp/conv.ml
new file mode 100644 (file)
index 0000000..9955924
--- /dev/null
@@ -0,0 +1,342 @@
+(* File: conv.ml
+
+    Copyright (C) 2005-
+
+      Jane Street Holding, LLC
+      Author: Markus Mottl
+      email: mmottl\@janestcapital.com
+      WWW: http://www.janestcapital.com/ocaml
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+(* Conv: Utility Module for S-expression Conversions *)
+
+open Printf
+open Bigarray
+open Sexp
+
+type 'a sexp_option = 'a option
+
+(* Conversion of OCaml-values to S-expressions *)
+
+let default_string_of_float = ref (fun n -> sprintf "%.20G" n)
+let read_old_option_format = ref true
+let write_old_option_format = ref true
+
+let sexp_of_unit () = List []
+let sexp_of_bool b = Atom (string_of_bool b)
+let sexp_of_string str = Atom str
+let sexp_of_char c = Atom (String.make 1 c)
+let sexp_of_int n = Atom (string_of_int n)
+let sexp_of_float n = Atom (!default_string_of_float n)
+let sexp_of_int32 n = Atom (Int32.to_string n)
+let sexp_of_int64 n = Atom (Int64.to_string n)
+let sexp_of_nativeint n = Atom (Nativeint.to_string n)
+let sexp_of_big_int n = Atom (Big_int.string_of_big_int n)
+let sexp_of_nat n = Atom (Nat.string_of_nat n)
+let sexp_of_num n = Atom (Num.string_of_num n)
+let sexp_of_ratio n = Atom (Ratio.string_of_ratio n)
+let sexp_of_ref sexp_of__a rf = sexp_of__a !rf
+let sexp_of_lazy sexp_of__a lv = sexp_of__a (Lazy.force lv)
+
+let sexp_of_option sexp_of__a = function
+  | Some x when !write_old_option_format -> List [sexp_of__a x]
+  | Some x -> List [Atom "some"; sexp_of__a x]
+  | None when !write_old_option_format -> List []
+  | None -> Atom "none"
+
+let sexp_of_pair sexp_of__a sexp_of__b (a, b) =
+  List [sexp_of__a a; sexp_of__b b]
+
+let sexp_of_triple sexp_of__a sexp_of__b sexp_of__c (a, b, c) =
+  List [sexp_of__a a; sexp_of__b b; sexp_of__c c]
+
+let sexp_of_list sexp_of__a lst =
+  List (List.rev (List.rev_map sexp_of__a lst))
+
+let sexp_of_array sexp_of__a ar =
+  let lst_ref = ref [] in
+  for i = Array.length ar - 1 downto 0 do
+    lst_ref := sexp_of__a ar.(i) :: !lst_ref
+  done;
+  List !lst_ref
+
+let sexp_of_hashtbl sexp_of_key sexp_of_val htbl =
+  let coll k v acc = List [sexp_of_key k; sexp_of_val v] :: acc in
+  List (Hashtbl.fold coll htbl [])
+
+let sexp_of_float_vec vec =
+  let lst_ref = ref [] in
+  for i = Array1.dim vec downto 1 do
+    lst_ref := sexp_of_float vec.{i} :: !lst_ref
+  done;
+  List !lst_ref
+
+type vec32 = (float, float32_elt, fortran_layout) Array1.t
+type vec64 = (float, float64_elt, fortran_layout) Array1.t
+let sexp_of_float32_vec (vec : vec32) = sexp_of_float_vec vec
+let sexp_of_float64_vec (vec : vec64) = sexp_of_float_vec vec
+let sexp_of_vec (vec : vec64) = sexp_of_float_vec vec
+
+let sexp_of_float_mat mat =
+  let m = Array2.dim1 mat in
+  let n = Array2.dim2 mat in
+  let lst_ref = ref [] in
+  for col = n downto 1 do
+    let vec = Array2.slice_right mat col in
+    for row = m downto 1 do
+      lst_ref := sexp_of_float vec.{row} :: !lst_ref
+    done
+  done;
+  List (sexp_of_int m :: sexp_of_int n :: !lst_ref)
+
+type mat32 = (float, float32_elt, fortran_layout) Array2.t
+type mat64 = (float, float64_elt, fortran_layout) Array2.t
+let sexp_of_float32_mat (mat : mat32) = sexp_of_float_mat mat
+let sexp_of_float64_mat (mat : mat64) = sexp_of_float_mat mat
+let sexp_of_mat (mat : mat64) = sexp_of_float_mat mat
+
+let sexp_of_abstr _ = Atom "<abstr>"
+let sexp_of_fun _ = Atom "<fun>"
+
+type 'a opaque = 'a
+let sexp_of_opaque _ _ = Atom "<opaque>"
+
+let string_of__of__sexp_of to_sexp x = Sexp.to_string (to_sexp x)
+
+
+(* Conversion of S-expressions to OCaml-values *)
+
+exception Of_sexp_error of string * Sexp.t
+
+let record_check_extra_fields = ref true
+
+let of_sexp_error what sexp = raise (Of_sexp_error (what, sexp))
+
+let unit_of_sexp sexp = match sexp with
+  | List [] -> ()
+  | Atom _ | List _ -> of_sexp_error "unit_of_sexp: empty list needed" sexp
+
+let bool_of_sexp sexp = match sexp with
+  | Atom ("true" | "True") -> true
+  | Atom ("false" | "False") -> false
+  | Atom _ -> of_sexp_error "bool_of_sexp: unknown string" sexp
+  | List _ -> of_sexp_error "bool_of_sexp: atom needed" sexp
+
+let string_of_sexp sexp = match sexp with
+  | Atom str -> str
+  | List _ -> of_sexp_error "string_of_sexp: atom needed" sexp
+
+let char_of_sexp sexp = match sexp with
+  | Atom str ->
+      if String.length str <> 1 then
+        of_sexp_error
+          "char_of_sexp: atom string must contain one character only" sexp;
+      str.[0]
+  | List _ -> of_sexp_error "char_of_sexp: atom needed" sexp
+
+let int_of_sexp sexp = match sexp with
+  | Atom str ->
+      (try int_of_string str
+      with exc -> of_sexp_error ("int_of_sexp: " ^ Printexc.to_string exc) sexp)
+  | List _ -> of_sexp_error "int_of_sexp: atom needed" sexp
+
+let float_of_sexp sexp = match sexp with
+  | Atom str ->
+      (try float_of_string str
+      with exc ->
+        of_sexp_error ("float_of_sexp: " ^ Printexc.to_string exc) sexp)
+  | List _ -> of_sexp_error "float_of_sexp: atom needed" sexp
+
+let int32_of_sexp sexp = match sexp with
+  | Atom str ->
+      (try Int32.of_string str
+      with exc ->
+        of_sexp_error ("int32_of_sexp: " ^ Printexc.to_string exc) sexp)
+  | List _ -> of_sexp_error "int32_of_sexp: atom needed" sexp
+
+let int64_of_sexp sexp = match sexp with
+  | Atom str ->
+      (try Int64.of_string str
+      with exc ->
+        of_sexp_error ("int64_of_sexp: " ^ Printexc.to_string exc) sexp)
+  | List _ -> of_sexp_error "int64_of_sexp: atom needed" sexp
+
+let nativeint_of_sexp sexp = match sexp with
+  | Atom str ->
+      (try Nativeint.of_string str
+      with exc ->
+        of_sexp_error ("nativeint_of_sexp: " ^ Printexc.to_string exc) sexp)
+  | List _ -> of_sexp_error "nativeint_of_sexp: atom needed" sexp
+
+let big_int_of_sexp sexp = match sexp with
+  | Atom str ->
+      (try Big_int.big_int_of_string str
+      with exc ->
+        of_sexp_error ("big_int_of_sexp: " ^ Printexc.to_string exc) sexp)
+  | List _ -> of_sexp_error "big_int_of_sexp: atom needed" sexp
+
+let nat_of_sexp sexp = match sexp with
+  | Atom str ->
+      (try Nat.nat_of_string str
+      with exc ->
+        of_sexp_error ("nat_of_sexp: " ^ Printexc.to_string exc) sexp)
+  | List _ -> of_sexp_error "nat_of_sexp: atom needed" sexp
+
+let num_of_sexp sexp = match sexp with
+  | Atom str ->
+      (try Num.num_of_string str
+      with exc ->
+        of_sexp_error ("num_of_sexp: " ^ Printexc.to_string exc) sexp)
+  | List _ -> of_sexp_error "num_of_sexp: atom needed" sexp
+
+let ratio_of_sexp sexp = match sexp with
+  | Atom str ->
+      (try Ratio.ratio_of_string str
+      with exc ->
+        of_sexp_error ("ratio_of_sexp: " ^ Printexc.to_string exc) sexp)
+  | List _ -> of_sexp_error "ratio_of_sexp: atom needed" sexp
+
+let ref_of_sexp a__of_sexp sexp = ref (a__of_sexp sexp)
+let lazy_of_sexp a__of_sexp sexp = lazy (a__of_sexp sexp)
+
+let option_of_sexp a__of_sexp sexp =
+  if !read_old_option_format then
+    match sexp with
+    | List [] | Atom ("none" | "None") -> None
+    | List [el] | List [Atom ("some" | "Some"); el] -> Some (a__of_sexp el)
+    | List _ ->
+        of_sexp_error "option_of_sexp: list must represent optional value" sexp
+    | Atom _ -> of_sexp_error "option_of_sexp: only none can be atom" sexp
+  else
+    match sexp with
+    | Atom ("none" | "None") -> None
+    | List [Atom ("some" | "Some"); el] -> Some (a__of_sexp el)
+    | Atom _ -> of_sexp_error "option_of_sexp: only none can be atom" sexp
+    | List _ -> of_sexp_error "option_of_sexp: list must be (some el)" sexp
+
+let pair_of_sexp a__of_sexp b__of_sexp sexp = match sexp with
+  | List [a_sexp; b_sexp] ->
+      let a = a__of_sexp a_sexp in
+      let b = b__of_sexp b_sexp in
+      a, b
+  | List _ ->
+      of_sexp_error
+        "pair_of_sexp: list must contain exactly two elements only" sexp
+  | Atom _ -> of_sexp_error "pair_of_sexp: list needed" sexp
+
+let triple_of_sexp a__of_sexp b__of_sexp c__of_sexp sexp = match sexp with
+  | List [a_sexp; b_sexp; c_sexp] ->
+      let a = a__of_sexp a_sexp in
+      let b = b__of_sexp b_sexp in
+      let c = c__of_sexp c_sexp in
+      a, b, c
+  | List _ ->
+      of_sexp_error
+        "triple_of_sexp: list must contain exactly three elements only" sexp
+  | Atom _ -> of_sexp_error "triple_of_sexp: list needed" sexp
+
+let list_of_sexp a__of_sexp sexp = match sexp with
+  | List lst ->
+      let rev_lst = List.rev_map a__of_sexp lst in
+      List.rev rev_lst
+  | Atom _ -> of_sexp_error "list_of_sexp: list needed" sexp
+
+let array_of_sexp a__of_sexp sexp = match sexp with
+  | List [] -> [||]
+  | List (h :: t) ->
+      let len = List.length t + 1 in
+      let res = Array.create len (a__of_sexp h) in
+      let rec loop i = function
+        | [] -> res
+        | h :: t -> res.(i) <- a__of_sexp h; loop (i + 1) t in
+      loop 1 t
+  | Atom _ -> of_sexp_error "array_of_sexp: list needed" sexp
+
+let hashtbl_of_sexp key_of_sexp val_of_sexp sexp = match sexp with
+  | List lst ->
+      let htbl = Hashtbl.create 0 in
+      let act = function
+        | List [k_sexp; v_sexp] ->
+            Hashtbl.add htbl (key_of_sexp k_sexp) (val_of_sexp v_sexp)
+        | List _ | Atom _ ->
+            of_sexp_error "hashtbl_of_sexp: tuple list needed" sexp
+      in
+      List.iter act lst;
+      htbl
+  | Atom _ -> of_sexp_error "hashtbl_of_sexp: list needed" sexp
+
+let float_vec_of_sexp empty_float_vec create_float_vec sexp = match sexp with
+  | List [] -> empty_float_vec
+  | List lst ->
+      let len = List.length lst in
+      let res = create_float_vec len in
+      let rec loop i = function
+        | [] -> res
+        | h :: t -> res.{i} <- float_of_sexp h; loop (i + 1) t in
+      loop 1 lst
+  | Atom _ -> of_sexp_error "float_vec_of_sexp: list needed" sexp
+
+let create_float32_vec = Array1.create float32 fortran_layout
+let create_float64_vec = Array1.create float64 fortran_layout
+let empty_float32_vec = create_float32_vec 0
+let empty_float64_vec = create_float64_vec 0
+let float32_vec_of_sexp = float_vec_of_sexp empty_float32_vec create_float32_vec
+let float64_vec_of_sexp = float_vec_of_sexp empty_float64_vec create_float64_vec
+let vec_of_sexp = float_vec_of_sexp empty_float64_vec create_float64_vec
+
+let check_too_much_data sexp data res =
+  if data = [] then res
+  else of_sexp_error "float_mat_of_sexp: too much data" sexp
+
+let float_mat_of_sexp create_float_mat sexp = match sexp with
+  | List (sm :: sn :: data) ->
+      let m = int_of_sexp sm in
+      let n = int_of_sexp sn in
+      let res = create_float_mat m n in
+      if m = 0 || n = 0 then check_too_much_data sexp data res
+      else
+        let rec loop_cols col data =
+          let vec = Array2.slice_right res col in
+          let rec loop_rows row = function
+            | [] -> of_sexp_error "float_mat_of_sexp: not enough data" sexp
+            | h :: t ->
+                vec.{row} <- float_of_sexp h;
+                if row = m then
+                  if col = n then check_too_much_data sexp t res
+                  else loop_cols (col + 1) t
+                else loop_rows (row + 1) t in
+          loop_rows 1 data in
+        loop_cols 1 data
+  | List _ -> of_sexp_error "float_mat_of_sexp: list too short" sexp
+  | Atom _ -> of_sexp_error "float_mat_of_sexp: list needed" sexp
+
+let create_float32_mat = Array2.create float32 fortran_layout
+let create_float64_mat = Array2.create float64 fortran_layout
+
+let float32_mat_of_sexp = float_mat_of_sexp create_float32_mat
+let float64_mat_of_sexp = float_mat_of_sexp create_float64_mat
+let mat_of_sexp = float_mat_of_sexp create_float64_mat
+
+let fun_of_sexp sexp =
+  of_sexp_error "fun_of_sexp: cannot convert function values" sexp
+
+let of_string__of__of_sexp of_sexp s =
+  try
+    let sexp = Sexp.of_string s in
+    of_sexp sexp
+  with e ->
+    failwith (sprintf "of_string failed on %s with %s" s (Printexc.to_string e))
diff --git a/ocamlsexp/conv.mli b/ocamlsexp/conv.mli
new file mode 100644 (file)
index 0000000..60ab215
--- /dev/null
@@ -0,0 +1,348 @@
+(* File: conv.mli
+
+    Copyright (C) 2005-
+
+      Jane Street Holding, LLC
+      Author: Markus Mottl
+      email: mmottl\@janestcapital.com
+      WWW: http://www.janestcapital.com/ocaml
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+(** Conv: Utility Module for S-expression Conversions *)
+
+open Bigarray
+
+(** Dummy definition for "optional" options *)
+type 'a sexp_option = 'a option
+
+
+(** {6 Conversion of OCaml-values to S-expressions} *)
+
+val default_string_of_float : (float -> string) ref
+(** [default_string_of_float] reference to the default function used
+    to convert floats to strings.
+
+    Initially set to [fun n -> sprintf "%.20G" n].
+*)
+
+val write_old_option_format : bool ref
+(** [write_old_option_format] reference for the default option format
+    used to write option values.  If set to [true], the old-style option
+    format will be used, the new-style one otherwise.
+
+    Initially set to [true].
+*)
+
+val read_old_option_format : bool ref
+(** [read_old_option_format] reference for the default option format
+    used to read option values.  [Of_sexp_error] will be raised with
+    old-style option values if this reference is set to [false].
+    Reading new-style option values is always supported.
+
+    Initially set to [true].
+*)
+
+val sexp_of_unit : unit -> Sexp.t
+(** [sexp_of_unit ()] converts a value of type [unit] to an S-expression. *)
+
+val sexp_of_bool : bool -> Sexp.t
+(** [sexp_of_bool b] converts the value [x] of type [bool] to an
+    S-expression. *)
+
+val sexp_of_string : string -> Sexp.t
+(** [sexp_of_bool str] converts the value [str] of type [string] to an
+    S-expression. *)
+
+val sexp_of_char : char -> Sexp.t
+(** [sexp_of_char c] converts the value [c] of type [char] to an
+    S-expression. *)
+
+val sexp_of_int : int -> Sexp.t
+(** [sexp_of_int n] converts the value [n] of type [int] to an
+    S-expression. *)
+
+val sexp_of_float : float -> Sexp.t
+(** [sexp_of_float n] converts the value [n] of type [float] to an
+    S-expression. *)
+
+val sexp_of_int32 : int32 -> Sexp.t
+(** [sexp_of_int32 n] converts the value [n] of type [int32] to an
+    S-expression. *)
+
+val sexp_of_int64 : int64 -> Sexp.t
+(** [sexp_of_int64 n] converts the value [n] of type [int64] to an
+    S-expression. *)
+
+val sexp_of_nativeint : nativeint -> Sexp.t
+(** [sexp_of_nativeint n] converts the value [n] of type [nativeint] to an
+    S-expression. *)
+
+val sexp_of_big_int : Big_int.big_int -> Sexp.t
+(** [sexp_of_big_int n] converts the value [n] of type [Big_int.big_int]
+    to an S-expression. *)
+
+val sexp_of_nat : Nat.nat -> Sexp.t
+(** [sexp_of_nat n] converts the value [n] of type [Nat.nat] to an
+    S-expression. *)
+
+val sexp_of_num : Num.num -> Sexp.t
+(** [sexp_of_num n] converts the value [n] of type [Num.num] to an
+    S-expression. *)
+
+val sexp_of_ratio : Ratio.ratio -> Sexp.t
+(** [sexp_of_ratio n] converts the value [n] of type [Ratio.ratio] to an
+    S-expression. *)
+
+val sexp_of_ref : ('a -> 'b) -> 'a ref -> 'b
+(** [sexp_of_ref conv r] converts the value [r] of type ['a ref] to
+    an S-expression.  Uses [conv] to convert values of type ['a] to an
+    S-expression. *)
+
+val sexp_of_lazy : ('a -> 'b) -> 'a lazy_t -> 'b
+(** [sexp_of_ref conv l] converts the value [l] of type ['a lazy_t] to
+    an S-expression.  Uses [conv] to convert values of type ['a] to an
+    S-expression. *)
+
+val sexp_of_option : ('a -> Sexp.t) -> 'a option -> Sexp.t
+(** [sexp_of_option conv opt] converts the value [opt] of type ['a
+    option] to an S-expression.  Uses [conv] to convert values of type
+    ['a] to an S-expression. *)
+
+val sexp_of_pair : ('a -> Sexp.t) -> ('b -> Sexp.t) -> 'a * 'b -> Sexp.t
+(** [sexp_of_pair conv1 conv2 pair] converts a pair to an S-expression.
+    It uses its first argument to convert the first element of the pair,
+    and its second argument to convert the second element of the pair. *)
+
+val sexp_of_triple :
+  ('a -> Sexp.t) -> ('b -> Sexp.t) -> ('c -> Sexp.t) -> 'a * 'b * 'c -> Sexp.t
+(** [sexp_of_triple conv1 conv2 conv3 triple] converts a triple to
+    an S-expression using [conv1], [conv2], and [conv3] to convert its
+    elements. *)
+
+val sexp_of_list : ('a -> Sexp.t) -> 'a list -> Sexp.t
+(** [sexp_of_list conv lst] converts the value [lst] of type ['a
+    list] to an S-expression.  Uses [conv] to convert values of type
+    ['a] to an S-expression. *)
+
+val sexp_of_array : ('a -> Sexp.t) -> 'a array -> Sexp.t
+(** [sexp_of_array conv ar] converts the value [ar] of type ['a
+    array] to an S-expression.  Uses [conv] to convert values of type
+    ['a] to an S-expression. *)
+
+val sexp_of_hashtbl :
+  ('a -> Sexp.t) -> ('b -> Sexp.t) -> ('a, 'b) Hashtbl.t -> Sexp.t
+(** [sexp_of_hashtbl conv_key conv_value htbl] converts the value [htbl]
+    of type [('a, 'b) Hashtbl.t] to an S-expression.  Uses [conv_key]
+    to convert the hashtable keys of type ['a], and [conv_value] to
+    convert hashtable values of type ['b] to S-expressions. *)
+
+val sexp_of_float32_vec :
+  (float, float32_elt, fortran_layout) Array1.t -> Sexp.t
+(** [sexp_of_float32_vec vec] converts the one-dimensional bigarray
+    [vec] of 32-bit floats in Fortran-layout to an S-expression. *)
+
+val sexp_of_float64_vec :
+  (float, float64_elt, fortran_layout) Array1.t -> Sexp.t
+(** [sexp_of_float64_vec vec] converts the one-dimensional bigarray
+    [vec] of 64-bit floats in Fortran-layout to an S-expression. *)
+
+val sexp_of_vec : (float, float64_elt, fortran_layout) Array1.t -> Sexp.t
+(** [sexp_of_vec vec] same as {!Conv.sexp_of_float64_vec}. *)
+
+val sexp_of_float32_mat :
+  (float, float32_elt, fortran_layout) Array2.t -> Sexp.t
+(** [sexp_of_float32_mat mat] converts the two-dimensional bigarray
+    [mat] of 32-bit floats in Fortran-layout to an S-expression. *)
+
+val sexp_of_float64_mat :
+  (float, float64_elt, fortran_layout) Array2.t -> Sexp.t
+(** [sexp_of_float64_mat mat] converts the two-dimensional bigarray
+    [mat] of 64-bit floats in Fortran-layout to an S-expression. *)
+
+val sexp_of_mat : (float, float64_elt, fortran_layout) Array2.t -> Sexp.t
+(** [sexp_of_mat mat] same as {!Conv.sexp_of_float64_mat}. *)
+
+val sexp_of_abstr : 'a -> Sexp.t
+(** [sexp_of_abstr x] converts the value [x] of abstract type to an
+    S-expression. *)
+
+val sexp_of_fun : ('a -> 'b) -> Sexp.t
+(** [sexp_of_fun f] converts the value [f] of function type to an
+    S-expression. *)
+
+(** Type used for declaring existing types as opaque to sexp converters,
+    i.e. even if there is a defined converter for ['a], it will not
+    be called.  This is useful to e.g. suppress printing of extremely
+    large sub-structures for purely informational, human-readable output.
+*)
+type 'a opaque = 'a
+
+val sexp_of_opaque : ('a -> Sexp.t) -> 'a opaque -> Sexp.t
+(** [sexp_of_opaque _ _] converts opaque OCaml-values to S-expressions. *)
+
+val string_of__of__sexp_of : ('a -> Sexp.t) -> 'a -> string
+(** [string_of__of__sexp_of conv x] converts the OCaml-value [x] to
+    an S-expression represented as a string by using conversion function
+    [conv]. *)
+
+
+(** {6 Conversion of S-expressions to OCaml-values} *)
+
+exception Of_sexp_error of string * Sexp.t
+(** [Of_sexp_error (reason, sexp)] the exception raised when an
+    S-expression could not be successfully converted to an OCaml-value. *)
+
+val record_check_extra_fields : bool ref
+(** [record_check_extra_fields] checks for extra (= unknown) fields
+    in record S-expressions. *)
+
+val of_sexp_error : string -> Sexp.t -> 'a
+(** [of_sexp_error reason sexp] @raise the exception [Of_sexp_error
+    (reason, sexp)]. *)
+
+val unit_of_sexp : Sexp.t -> unit
+(** [unit_of_sexp sexp] converts S-expression [sexp] to a value of type
+    [unit]. *)
+
+val bool_of_sexp : Sexp.t -> bool
+(** [bool_of_sexp sexp] converts S-expression [sexp] to a value of type
+    [bool]. *)
+
+val string_of_sexp : Sexp.t -> string
+(** [string_of_sexp sexp] converts S-expression [sexp] to a value of type
+    [string]. *)
+
+val char_of_sexp : Sexp.t -> char
+(** [char_of_sexp sexp] converts S-expression [sexp] to a value of type
+    [char]. *)
+
+val int_of_sexp : Sexp.t -> int
+(** [int_of_sexp sexp] converts S-expression [sexp] to a value of type
+    [int]. *)
+
+val float_of_sexp : Sexp.t -> float
+(** [float_of_sexp sexp] converts S-expression [sexp] to a value of type
+    [float]. *)
+
+val int32_of_sexp : Sexp.t -> int32
+(** [int32_of_sexp sexp] converts S-expression [sexp] to a value of type
+    [int32]. *)
+
+val int64_of_sexp : Sexp.t -> int64
+(** [int64_of_sexp sexp] converts S-expression [sexp] to a value of type
+    [int64]. *)
+
+val nativeint_of_sexp : Sexp.t -> nativeint
+(** [nativeint_of_sexp sexp] converts S-expression [sexp] to a value
+    of type [nativeint]. *)
+
+val big_int_of_sexp : Sexp.t -> Big_int.big_int
+(** [big_int_of_sexp sexp] converts S-expression [sexp] to a value
+    of type [Big_int.big_int]. *)
+
+val nat_of_sexp : Sexp.t -> Nat.nat
+(** [nat_of_sexp sexp] converts S-expression [sexp] to a value
+    of type [Nat.nat]. *)
+
+val num_of_sexp : Sexp.t -> Num.num
+(** [num_of_sexp sexp] converts S-expression [sexp] to a value
+    of type [Nat.num]. *)
+
+val ratio_of_sexp : Sexp.t -> Ratio.ratio
+(** [ratio_of_sexp sexp] converts S-expression [sexp] to a value
+    of type [Nat.ratio]. *)
+
+val ref_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a ref
+(** [ref_of_sexp conv sexp] converts S-expression [sexp] to a value
+    of type ['a ref] using conversion function [conv], which converts
+    an S-expression to a value of type ['a]. *)
+
+val lazy_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a lazy_t
+(** [lazy_of_sexp conv sexp] converts S-expression [sexp] to a value
+    of type ['a lazy_t] using conversion function [conv], which converts
+    an S-expression to a value of type ['a]. *)
+
+val option_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a option
+(** [option_of_sexp conv sexp] converts S-expression [sexp] to a value
+    of type ['a option] using conversion function [conv], which converts
+    an S-expression to a value of type ['a]. *)
+
+val pair_of_sexp : (Sexp.t -> 'a) -> (Sexp.t -> 'b) -> Sexp.t -> 'a * 'b
+(** [pair_of_sexp conv1 conv2 sexp] converts S-expression [sexp] to a pair
+    of type ['a * 'b] using conversion functions [conv1] and [conv2],
+    which convert S-expressions to values of type ['a] and ['b]
+    respectively. *)
+
+val triple_of_sexp :
+  (Sexp.t -> 'a) -> (Sexp.t -> 'b) -> (Sexp.t -> 'c) -> Sexp.t -> 'a * 'b * 'c
+(** [triple_of_sexp conv1 conv2 conv3 sexp] converts S-expression [sexp]
+    to a triple of type ['a * 'b * 'c] using conversion functions [conv1],
+    [conv2], and [conv3], which convert S-expressions to values of type
+    ['a], ['b], and ['c] respectively. *)
+
+val list_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a list
+(** [list_of_sexp conv sexp] converts S-expression [sexp] to a value
+    of type ['a list] using conversion function [conv], which converts
+    an S-expression to a value of type ['a]. *)
+
+val array_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a array
+(** [array_of_sexp conv sexp] converts S-expression [sexp] to a value
+    of type ['a array] using conversion function [conv], which converts
+    an S-expression to a value of type ['a]. *)
+
+val hashtbl_of_sexp :
+  (Sexp.t -> 'a) -> (Sexp.t -> 'b) -> Sexp.t -> ('a, 'b) Hashtbl.t
+(** [hashtbl_of_sexp conv_key conv_value sexp] converts S-expression
+    [sexp] to a value of type [('a, 'b) Hashtbl.t] using conversion
+    function [conv_key], which converts an S-expression to hashtable
+    key of type ['a], and function [conv_value], which converts an
+    S-expression to hashtable value of type ['b]. *)
+
+val float32_vec_of_sexp :
+  Sexp.t -> (float, float32_elt, fortran_layout) Array1.t
+(** [float32_vec_of_sexp sexp] converts S-expression [sexp] to a
+    one-dimensional bigarray of 32-bit floats in Fortran-layout. *)
+
+val float64_vec_of_sexp :
+  Sexp.t -> (float, float64_elt, fortran_layout) Array1.t
+(** [float64_vec_of_sexp sexp] converts S-expression [sexp] to a
+    one-dimensional bigarray of 64-bit floats in Fortran-layout. *)
+
+val vec_of_sexp : Sexp.t -> (float, float64_elt, fortran_layout) Array1.t
+(** [vec_of_sexp sexp] same as {!float64_vec_of_sexp}. *)
+
+val float32_mat_of_sexp :
+  Sexp.t -> (float, float32_elt, fortran_layout) Array2.t
+(** [float32_mat_of_sexp sexp] converts S-expression [sexp] to a
+    two-dimensional bigarray of 32-bit floats in Fortran-layout. *)
+
+val float64_mat_of_sexp :
+  Sexp.t -> (float, float64_elt, fortran_layout) Array2.t
+(** [float64_mat_of_sexp sexp] converts S-expression [sexp] to a
+    two-dimensional bigarray of 64-bit floats in Fortran-layout. *)
+
+val mat_of_sexp : Sexp.t -> (float, float64_elt, fortran_layout) Array2.t
+(** [mat_of_sexp sexp] same as {!Conv.float64_mat_of_sexp}. *)
+
+val fun_of_sexp : Sexp.t -> ('a -> 'b)
+(** [fun_of_sexp sexp] @raise a conversion error when attempting to
+    convert an S-expression to a function. *)
+
+val of_string__of__of_sexp : (Sexp.t -> 'a) -> string -> 'a
+(** [of_string__of__of_sexp conv str] converts the S-expression [str]
+    represented as a string to an OCaml-value by using conversion function
+    [conv]. *)
diff --git a/ocamlsexp/conv_error.ml b/ocamlsexp/conv_error.ml
new file mode 100644 (file)
index 0000000..caf25d9
--- /dev/null
@@ -0,0 +1,138 @@
+(* File: conv_error.ml
+
+    Copyright (C) 2005-
+
+      Jane Street Holding, LLC
+      Author: Markus Mottl
+      email: mmottl\@janestcapital.com
+      WWW: http://www.janestcapital.com/ocaml
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+(* Conv_error: Module for Handling Errors during Automated S-expression
+   Conversions *)
+
+open Printf
+open Conv
+
+(* Errors concerning tuples *)
+
+let tuple_of_size_n_expected loc n sexp =
+  of_sexp_error (sprintf "%s_of_sexp: tuple of size %d expected" loc n) sexp
+
+
+(* Errors concerning sum types *)
+
+let stag_no_args loc sexp =
+  of_sexp_error (loc ^ "_of_sexp: sum tag does not take arguments") sexp
+
+let stag_incorrect_n_args loc tag sexp =
+  let msg =
+    sprintf "%s_of_sexp: sum tag %S has incorrect number of arguments" loc tag
+  in
+  of_sexp_error msg sexp
+
+let stag_takes_args loc sexp =
+  of_sexp_error (loc ^ "_of_sexp: sum tag must be a structured value") sexp
+
+let nested_list_invalid_sum loc sexp =
+  of_sexp_error (loc ^ "_of_sexp: a nested list is an invalid sum") sexp
+
+let empty_list_invalid_sum loc sexp =
+  of_sexp_error (loc ^ "_of_sexp: the empty list is an invalid sum") sexp
+
+let unexpected_stag loc sexp =
+  of_sexp_error (loc ^ "_of_sexp: unexpected sum tag") sexp
+
+
+(* Errors concerning records *)
+
+let record_only_pairs_expected loc sexp =
+  let msg =
+    loc ^
+      "_of_sexp: record conversion: only pairs expected, \
+      their first element must be an atom" in
+  of_sexp_error msg sexp
+
+let record_superfluous_fields ~what ~loc rev_fld_names sexp =
+  let fld_names_str = String.concat " " (List.rev rev_fld_names) in
+  let msg = sprintf "%s_of_sexp: %s: %s" loc what fld_names_str in
+  of_sexp_error msg sexp
+
+let record_duplicate_fields loc rev_fld_names sexp =
+  record_superfluous_fields ~what:"duplicate fields" ~loc rev_fld_names sexp
+
+let record_extra_fields loc rev_fld_names sexp =
+  record_superfluous_fields ~what:"extra fields" ~loc rev_fld_names sexp
+
+let rec record_get_undefined_loop fields = function
+  | [] -> String.concat " " (List.rev fields)
+  | (true, field) :: rest -> record_get_undefined_loop (field :: fields) rest
+  | _ :: rest -> record_get_undefined_loop fields rest
+
+let record_undefined_elements loc sexp lst =
+  let undefined = record_get_undefined_loop [] lst in
+  let msg =
+    sprintf "%s_of_sexp: the following record elements were undefined: %s"
+      loc undefined
+  in
+  of_sexp_error msg sexp
+
+let record_list_instead_atom loc sexp =
+  let msg = loc ^ "_of_sexp: list instead of atom for record expected" in
+  of_sexp_error msg sexp
+
+let record_poly_field_value loc sexp =
+  let msg =
+    loc ^
+    "_of_sexp: cannot convert values of types resulting from polymorphic \
+    record fields"
+  in
+  of_sexp_error msg sexp
+
+
+(* Errors concerning polymorphic variants *)
+
+exception No_variant_match of string * Sexp.t
+
+let no_variant_match loc sexp =
+  raise (No_variant_match (loc ^ "_of_sexp", sexp))
+
+let ptag_no_args loc sexp =
+  of_sexp_error (
+    loc ^ "_of_sexp: polymorphic variant does not take arguments") sexp
+
+let ptag_incorrect_n_args loc cnstr sexp =
+  let msg =
+    sprintf
+      "%s_of_sexp: polymorphic variant tag %S has incorrect number of arguments"
+      loc cnstr
+  in
+  of_sexp_error msg sexp
+
+let nested_list_invalid_poly_var loc sexp =
+  of_sexp_error (
+    loc ^ "_of_sexp: a nested list is an invalid polymorphic variant") sexp
+
+let empty_list_invalid_poly_var loc sexp =
+  of_sexp_error (
+    loc ^ "_of_sexp: the empty list is an invalid polymorphic variant") sexp
+
+let silly_type loc sexp =
+  of_sexp_error (loc ^ "_of_sexp: trying to convert a silly type") sexp
+
+let empty_type loc sexp =
+  of_sexp_error (loc ^ "_of_sexp: trying to convert an empty type") sexp
diff --git a/ocamlsexp/copyright.txt b/ocamlsexp/copyright.txt
new file mode 100644 (file)
index 0000000..49c4471
--- /dev/null
@@ -0,0 +1,19 @@
+Most of this library was written by:
+
+  Markus Mottl          <markus.mottl@gmail.com>
+
+This work is derived from the library "Tywith", version 0.45.  The library
+"Tywith" was written and is distributed by:
+
+  Martin Sandin         <msandin@hotmail.com>
+
+The original license of "Tywith" can be found in the file
+"LICENSE.Tywith".  Files that were derived from "Tywith" contain a
+reference to the original author.
+
+The following company has sponsored and has copyright in part of this work:
+
+  Jane Street Holding, LLC
+  1 New York Plaza, 33rd Floor 
+  New York, NY 10004
+  USA
diff --git a/ocamlsexp/lexer.mll b/ocamlsexp/lexer.mll
new file mode 100644 (file)
index 0000000..f4fcc61
--- /dev/null
@@ -0,0 +1,174 @@
+{
+  (* File: lexer.mll
+
+      Copyright (C) 2005-
+
+        Jane Street Holding, LLC
+        Author: Markus Mottl
+        email: mmottl@janestcapital.com
+        WWW: http://www.janestcapital.com/ocaml
+
+     This library is free software; you can redistribute it and/or
+     modify it under the terms of the GNU Lesser General Public
+     License as published by the Free Software Foundation; either
+     version 2 of the License, or (at your option) any later version.
+
+     This library is distributed in the hope that it will be useful,
+     but WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     Lesser General Public License for more details.
+
+     You should have received a copy of the GNU Lesser General Public
+     License along with this library; if not, write to the Free Software
+     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  *)
+
+  (** Lexer: Lexer Specification for S-expressions *)
+
+  open Printf
+  open Lexing
+  open Parser
+
+  let char_for_backslash = function
+    | 'n' -> '\n'
+    | 't' -> '\t'
+    | 'b' -> '\b'
+    | 'r' -> '\r'
+    | c   -> c
+
+  let double_nl = "\013\010"
+
+  let dec_code c1 c2 c3 =
+    100 * (Char.code c1 - 48) + 10 * (Char.code c2 - 48) + (Char.code c3 - 48)
+
+  let hex_code c1 c2 =
+    let d1 = Char.code c1 in
+    let val1 =
+      if d1 >= 97 then d1 - 87
+      else if d1 >= 65 then d1 - 55
+      else d1 - 48 in
+    let d2 = Char.code c2 in
+    let val2 =
+      if d2 >= 97 then d2 - 87
+      else if d2 >= 65 then d2 - 55
+      else d2 - 48 in
+    val1 * 16 + val2
+
+  let found_newline lexbuf diff =
+    let curr_p = lexbuf.lex_curr_p in
+    lexbuf.lex_curr_p <-
+      {
+        curr_p with
+        pos_lnum = curr_p.pos_lnum + 1;
+        pos_bol = max 1 (curr_p.pos_cnum - diff);
+      }
+
+  let get_lexeme_len lexbuf = lexbuf.lex_curr_pos - lexbuf.lex_start_pos
+}
+
+let newline = ('\010' | '\013' | "\013\010")
+let space = [' ' '\009' '\012']
+let whitespace = [' ' '\010' '\013' '\009' '\012']
+let backslash_escapes = ['\\' '"' '\'' 'n' 't' 'b' 'r']
+
+rule main buf = parse
+  | newline { found_newline lexbuf 1; main buf lexbuf }
+  | space+ { main buf lexbuf }
+  | ';' [^ '\n' '\r']+ { main buf lexbuf }
+  | '(' { LPAREN }
+  | ')' { RPAREN }
+  | '"'
+      {
+        scan_string buf lexbuf;
+        let str = Buffer.contents buf in
+        Buffer.clear buf;
+        STRING str
+      }
+  | ([^ ';' '(' ')' '"'] # whitespace)+ as str { STRING str }
+  | eof { EOF }
+
+and scan_string buf = parse
+  | '"' { () }
+  | '\\' ['\010' '\013'] [' ' '\009']*
+      {
+        let len = get_lexeme_len lexbuf in
+        found_newline lexbuf (len - 2);
+        scan_string buf lexbuf
+      }
+  | '\\' "\013\010" [' ' '\009']*
+      {
+        let len = get_lexeme_len lexbuf in
+        found_newline lexbuf (len - 3);
+        scan_string buf lexbuf
+      }
+  | '\\' (backslash_escapes as c)
+      {
+        Buffer.add_char buf (char_for_backslash c);
+        scan_string buf lexbuf
+      }
+  | '\\' (['0'-'9'] as c1) (['0'-'9'] as c2) (['0'-'9']  as c3)
+      {
+        let v = dec_code c1 c2 c3 in
+        if v > 255 then (
+          let pos = lexbuf.lex_curr_p in
+          let msg =
+            sprintf
+              "Sexplib.Lexer.scan_string: \
+               illegal escape at line %d char %d: `\\%c%c%c'"
+              pos.pos_lnum (pos.pos_cnum - pos.pos_bol - 3)
+              c1 c2 c3 in
+          failwith msg);
+        Buffer.add_char buf (Char.chr v);
+        scan_string buf lexbuf
+      }
+  | '\\' 'x' (['0'-'9' 'a'-'f' 'A'-'F'] as c1) (['0'-'9' 'a'-'f' 'A'-'F'] as c2)
+      {
+        let v = hex_code c1 c2 in
+        if v > 255 then (
+          let pos = lexbuf.lex_curr_p in
+          let msg =
+            sprintf
+              "Sexplib.Lexer.scan_string: \
+               illegal escape at line %d char %d: `\\x%c%c'"
+              pos.pos_lnum (pos.pos_cnum - pos.pos_bol - 3)
+              c1 c2 in
+          failwith msg);
+        Buffer.add_char buf (Char.chr v);
+        scan_string buf lexbuf
+      }
+  | '\\' (_ as c)
+      {
+        Buffer.add_char buf '\\';
+        Buffer.add_char buf c;
+        scan_string buf lexbuf
+      }
+  | ['\010' '\013'] as c
+      {
+        found_newline lexbuf 1;
+        Buffer.add_char buf c;
+        scan_string buf lexbuf
+      }
+  | "\013\010"
+      {
+        found_newline lexbuf 2;
+        Buffer.add_string buf double_nl;
+        scan_string buf lexbuf
+      }
+  | [^ '\\' '"']+
+      {
+        let ofs = lexbuf.lex_start_pos in
+        let len = lexbuf.lex_curr_pos - ofs in
+        Buffer.add_substring buf lexbuf.lex_buffer ofs len;
+        scan_string buf lexbuf
+      }
+  | eof { failwith "Sexplib.Lexer.scan_string: unterminated string" }
+
+{
+  let main ?buf =
+    let buf =
+      match buf with
+      | None -> Buffer.create 64
+      | Some buf -> Buffer.clear buf; buf
+    in
+    main buf
+}
diff --git a/ocamlsexp/license-tywith.txt b/ocamlsexp/license-tywith.txt
new file mode 100644 (file)
index 0000000..d08a6c1
--- /dev/null
@@ -0,0 +1,26 @@
+---------------------------------------------------------------------------\r
+Copyright (c) 2004 Martin Sandin\r
+All rights reserved.\r
+\r
+Redistribution and use in source and binary forms, with or without\r
+modification, are permitted provided that the following conditions\r
+are met:\r
+1. Redistributions of source code must retain the above copyright\r
+   notice, this list of conditions and the following disclaimer.\r
+2. Redistributions in binary form must reproduce the above copyright\r
+   notice, this list of conditions and the following disclaimer in the\r
+   documentation and/or other materials provided with the distribution.\r
+3. The name of the author may not be used to endorse or promote products\r
+   derived from this software without specific prior written permission.\r
+\r
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\r
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\r
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\r
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\r
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+---------------------------------------------------------------------------\r
diff --git a/ocamlsexp/license.txt b/ocamlsexp/license.txt
new file mode 100644 (file)
index 0000000..67b72ca
--- /dev/null
@@ -0,0 +1,520 @@
+The Library is distributed under the terms of the GNU Lesser General
+Public License version 2.1 (included below).
+
+As a special exception to the GNU Lesser General Public License, you
+may link, statically or dynamically, a "work that uses the Library"
+with a publicly distributed version of the Library to produce an
+executable file containing portions of the Library, and distribute that
+executable file under terms of your choice, without any of the additional
+requirements listed in clause 6 of the GNU Lesser General Public License.
+By "a publicly distributed version of the Library", we mean either the
+unmodified Library as distributed by the authors, or a modified version
+of the Library that is distributed under the conditions defined in clause
+3 of the GNU Lesser General Public License.  This exception does not
+however invalidate any other reasons why the executable file might be
+covered by the GNU Lesser General Public License.
+
+---------------------------------------------------------------------------
+
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                      Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+\f
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+\f
+                 GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+\f
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                           NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/ocamlsexp/modif-orig.txt b/ocamlsexp/modif-orig.txt
new file mode 100644 (file)
index 0000000..9413d40
--- /dev/null
@@ -0,0 +1,223 @@
+I use in a different way sexplib. I don't like camlp4 but I like the
+metaprogramming facility it offers. So I've found a in-the-middle
+solution where I use camlp4 to generate code (via a small script
+I have written, not included here for the moment), save the generated code
+in a file (e.g commons/sexp_common.ml), which allows then to 
+completely remove the dependency to camlp4. This means among
+other things that the file pa_sexp_conv.ml is not here, as
+I include here only the runtime library for sexp, not the
+camlp4 stuff. As I also didn't like their compilation process,
+with the need for findlib, -pack options, etc, I have rewritten a Makefile.
+
+-- pad 
+
+Here are the modifications I've made to the sexplib lib/ directory.
+
+diff -u -p -b -B -r -x .semantic.cache -x .depend -x CVS -x .hg -x .svn -x .git -x _darcs -x *.cm[iao] -x *.[oa] -x *.class /home/pad/reference/dev-ocaml/orig/ocamljane-orig/sexplib310-3.7.4/lib/ /home/pad/c-coccinelle/ocamlsexp
+Only in /home/pad/reference/dev-ocaml/orig/ocamljane-orig/sexplib310-3.7.4/lib/: META
+diff -u -p -b -B -r -x .semantic.cache -x .depend -x CVS -x .hg -x .svn -x .git -x _darcs -x '*.cm[iao]' -x '*.[oa]' -x '*.class' /home/pad/reference/dev-ocaml/orig/ocamljane-orig/sexplib310-3.7.4/lib/Makefile /home/pad/c-coccinelle/ocamlsexp/Makefile
+--- /home/pad/reference/dev-ocaml/orig/ocamljane-orig/sexplib310-3.7.4/lib/Makefile    2009-03-09 19:52:09.000000000 -0500
++++ /home/pad/c-coccinelle/ocamlsexp/Makefile  2009-04-15 22:04:59.000000000 -0500
+@@ -1,36 +1,166 @@
+-OCAMLMAKEFILE = ../OCamlMakefile
++##############################################################################
++# Variables
++##############################################################################
+-SOURCES = \
++SRC= \
+   type.ml \
+-  parser.mly \
+-  lexer.mll \
++  parser.ml \
++  lexer.ml \
+   pre_sexp.ml \
+   sexp_intf.ml \
+-  sexp.mli sexp.ml \
+-  path.mli path.ml \
+-  conv.mli conv.ml \
++  sexp.ml \
++  path.ml \
++  conv.ml \
+   conv_error.ml
+-LIB_PACK_NAME = sexplib
+-INCDIRS = +camlp4
+-OCAMLFLAGS = -for-pack Sexplib
+-PACKS = type-conv
+-RESULT = sexplib
+-
+-TRASH = pa_sexp_conv.cmi pa_sexp_conv.cmo pa_sexp_conv.annot
+-
+-all: \
+-      pack-byte-code pack-native-code \
+-      sexplib.cma sexplib.cmxa \
+-      pa_sexp_conv.cmi pa_sexp_conv.cmo
+-
+-LIBINSTALL_FILES = \
+-  sexp.mli path.mli conv.mli \
+-  sexplib.cmi sexplib.cma sexplib.cmxa sexplib.a \
+-  pa_sexp_conv.cmi pa_sexp_conv.cmo
++#SOURCES = \
++#  parser.mly \
++#  lexer.mll \
++# sexp.mli path.mli conv.mli 
+-install:      libinstall
+-uninstall:    libuninstall
+-clean::       clean-doc
++TARGET=sexplib1
++TARGETPACK=sexplib
++#LIB_PACK_NAME = sexplib
+--include $(OCAMLMAKEFILE)
++##############################################################################
++# Generic variables
++##############################################################################
++
++INCLUDES=
++#-I +camlp4
++SYSLIBS= str.cma unix.cma bigarray.cma num.cma
++#INCDIRS = +camlp4
++#pad: take care for bigarray otherwise get some caml_ba_get_1 error msg
++
++##############################################################################
++#OCAMLFLAGS = -for-pack Sexplib
++
++#PACKS = type-conv
++#RESULT = sexplib
++
++#TRASH = pa_sexp_conv.cmi pa_sexp_conv.cmo pa_sexp_conv.annot
++
++#all: \
++#     pack-byte-code pack-native-code \
++#     sexplib.cma sexplib.cmxa \
++#     pa_sexp_conv.cmi pa_sexp_conv.cmo
++#
++#LIBINSTALL_FILES = \
++#  sexp.mli path.mli conv.mli \
++#  sexplib.cmi sexplib.cma sexplib.cmxa sexplib.a \
++#  pa_sexp_conv.cmi pa_sexp_conv.cmo
++#
++#install:     libinstall
++#uninstall:   libuninstall
++#
++#clean::      clean-doc
++#
++#-include $(OCAMLMAKEFILE)
++
++##############################################################################
++
++##############################################################################
++# Generic variables
++##############################################################################
++
++#dont use -custom, it makes the bytecode unportable.
++OCAMLCFLAGS= -g -dtypes # -w A
++#-for-pack Sexplib
++
++# This flag is also used in subdirectories so don't change its name here.
++OPTFLAGS=
++
++
++OCAMLC=ocamlc$(OPTBIN) $(OCAMLCFLAGS)  $(INCLUDES)  $(SYSINCLUDES) -thread
++OCAMLOPT=ocamlopt$(OPTBIN) $(OPTFLAGS) $(INCLUDES) $(SYSINCLUDES) -thread
++OCAMLLEX=ocamllex #-ml # -ml for debugging lexer, but slightly slower
++OCAMLYACC=ocamlyacc -v
++OCAMLDEP=ocamldep $(INCLUDES)
++OCAMLMKTOP=ocamlmktop -g -custom $(INCLUDES) -thread
++
++#-ccopt -static
++STATIC=
++
++
++##############################################################################
++# Top rules
++##############################################################################
++
++OBJS = $(SRC:.ml=.cmo)
++OPTOBJS = $(SRC:.ml=.cmx)
++
++all: $(TARGET).cma $(TARGETPACK).cmo
++all.opt: $(TARGET).cmxa
++
++$(TARGET).cma: $(OBJS)
++      $(OCAMLC) -a -o $(TARGET).cma $(OBJS)
++
++$(TARGET).cmxa: $(OPTOBJS) $(LIBS:.cma=.cmxa)
++      $(OCAMLOPT) -a -o $(TARGET).cmxa $(OPTOBJS)
++
++$(TARGET).top: $(OBJS) $(LIBS)
++      $(OCAMLMKTOP) -o $(TARGET).top $(SYSLIBS) $(LIBS) $(OBJS)
++
++clean::
++      rm -f $(TARGET).top
++
++
++
++$(TARGETPACK).cmo: $(OBJS)
++      $(OCAMLC) -pack -o $(TARGETPACK).cmo $(OBJS)
++
++# special handling, fun that they use cpp whereas they claim camplp4 can do everything
++pre_sexp.cmo: pre_sexp.ml
++      $(OCAMLC) -pp cpp -c $<
++
++pre_sexp.cmx: pre_sexp.ml
++      $(OCAMLOPT) -pp cpp -c $<
++
++
++
++lexer.ml: lexer.mll
++      $(OCAMLLEX) $<
++clean::
++      rm -f lexer.ml
++beforedepend:: lexer.ml
++
++
++parser.ml parser.mli: parser.mly
++      $(OCAMLYACC) $<
++clean::
++      rm -f parser.ml parser.mli parser.output
++beforedepend:: parser.ml parser.mli
++
++
++
++##############################################################################
++# Generic rules
++##############################################################################
++
++.SUFFIXES: .ml .mli .cmo .cmi .cmx
++
++.ml.cmo:
++      $(OCAMLC) -c $<
++.mli.cmi:
++      $(OCAMLC) -c $<
++.ml.cmx:
++      $(OCAMLOPT) -c $<
++
++.ml.mldepend: 
++      $(OCAMLC) -i $<
++
++clean::
++      rm -f *.cm[ioxa] *.o *.a *.cmxa *.annot
++clean::
++      rm -f *~ .*~ gmon.out #*#
++
++beforedepend::
++
++# need also -pp cpp here
++depend:: beforedepend
++      $(OCAMLDEP) -pp cpp *.mli *.ml    > .depend
++
++distclean:
++      rm -f .depend
++
++-include .depend
+Only in /home/pad/reference/dev-ocaml/orig/ocamljane-orig/sexplib310-3.7.4/lib/: OMakefile
+Only in /home/pad/c-coccinelle/ocamlsexp: copyright.txt
+Only in /home/pad/c-coccinelle/ocamlsexp: license-tywith.txt
+Only in /home/pad/c-coccinelle/ocamlsexp: license.txt
+Only in /home/pad/reference/dev-ocaml/orig/ocamljane-orig/sexplib310-3.7.4/lib/: pa_sexp_conv.ml
+Only in /home/pad/reference/dev-ocaml/orig/ocamljane-orig/sexplib310-3.7.4/lib/: pa_sexp_conv.mli
+
+Diff finished.  Thu Apr 16 10:57:39 2009
diff --git a/ocamlsexp/parser.mly b/ocamlsexp/parser.mly
new file mode 100644 (file)
index 0000000..f53a559
--- /dev/null
@@ -0,0 +1,75 @@
+%{
+  (* File: parser.mly
+
+      Copyright (C) 2005-
+
+        Jane Street Holding, LLC
+        Author: Markus Mottl
+        email: mmottl@janestcapital.com
+        WWW: http://www.janestcapital.com/ocaml
+
+     This library is free software; you can redistribute it and/or
+     modify it under the terms of the GNU Lesser General Public
+     License as published by the Free Software Foundation; either
+     version 2 of the License, or (at your option) any later version.
+
+     This library is distributed in the hope that it will be useful,
+     but WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     Lesser General Public License for more details.
+
+     You should have received a copy of the GNU Lesser General Public
+     License along with this library; if not, write to the Free Software
+     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+  *)
+
+  (** Parser: Grammar Specification for Parsing S-expressions *)
+
+  open Lexing
+
+  let parse_failure what =
+    let pos = symbol_start_pos () in
+    let msg =
+      Printf.sprintf "Sexplib.Parser: failed to parse line %d char %d: %s"
+        pos.pos_lnum (pos.pos_cnum - pos.pos_bol) what in
+    failwith msg
+%}
+
+%token <string> STRING
+%token LPAREN RPAREN EOF
+
+%start sexp
+%type <Type.t> sexp
+
+%start sexp_opt
+%type <Type.t option> sexp_opt
+
+%start sexps
+%type <Type.t list> sexps
+
+%start rev_sexps
+%type <Type.t list> rev_sexps
+
+%%
+
+sexp
+  : STRING { Type.Atom $1 }
+  | LPAREN RPAREN { Type.List [] }
+  | LPAREN rev_sexps_aux RPAREN { Type.List (List.rev $2) }
+  | error { parse_failure "sexp" }
+
+sexp_opt
+  : sexp { Some $1 }
+  | EOF { None }
+
+rev_sexps_aux
+  : sexp { [$1] }
+  | rev_sexps_aux sexp { $2 :: $1 }
+
+rev_sexps
+  : rev_sexps_aux { $1 }
+  | EOF { [] }
+
+sexps
+  : rev_sexps_aux { List.rev $1 }
+  | EOF { [] }
diff --git a/ocamlsexp/path.ml b/ocamlsexp/path.ml
new file mode 100644 (file)
index 0000000..f6eafa8
--- /dev/null
@@ -0,0 +1,175 @@
+(* File: path.ml
+
+    Copyright (C) 2005-
+
+      Jane Street Holding, LLC
+      Author: Markus Mottl
+      email: mmottl\@janestcapital.com
+      WWW: http://www.janestcapital.com/ocaml
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+(* Path: Module for Substitutions within S-expressions *)
+
+open Format
+
+open Sexp
+
+type el = Pos of int | Match of string * int | Rec of string
+type t = el list
+
+let illegal_atom loc sexp =
+  failwith (sprintf "Path.%s: illegal atom: %s" loc (Sexp.to_string sexp))
+
+let extract_pos_lst loc sexp ix lst =
+  let rec loop acc n = function
+    | [] ->
+        let sexp_str = Sexp.to_string sexp in
+        failwith (
+          sprintf "Path.%s: illegal index %d in: %s" loc ix sexp_str)
+    | h :: t ->
+        if n = 0 then
+          let subst = function
+            | None -> List.rev_append acc t
+            | Some x -> List.rev_append acc (x :: t) in
+          subst, h
+        else loop (h :: acc) (n - 1) t in
+  loop [] ix lst
+
+let extract_pos n = function
+  | List lst as sexp ->
+      let subst, el = extract_pos_lst "extract_pos" sexp n lst in
+      (fun x -> List (subst x)), el
+  | Atom _ as sexp -> illegal_atom "extract_pos" sexp
+
+let extract_match tag arg_ix = function
+  | List (Atom str as sexp :: args) when str = tag ->
+      let subst, el = extract_pos_lst "extract_match" (List args) arg_ix args in
+      (fun maybe_x -> List (sexp :: subst maybe_x)), el
+  | List _ as sexp ->
+      let sexp_str = Sexp.to_string sexp in
+      failwith ("Path.extract_match: unexpected nested list in: " ^ sexp_str)
+  | Atom _ as sexp -> illegal_atom "extract_match" sexp
+
+let extract_rec key = function
+  | List lst as sexp ->
+      let rec loop acc = function
+        | [] ->
+            let sexp_str = Sexp.to_string sexp in
+            failwith (
+              sprintf "Path.extract_rec: key \"%s\" not found in: %s"
+                key sexp_str)
+        | List [Atom str as sexp; v] :: rest when str = key ->
+            let subst x = List (List.rev_append acc (List [sexp; x] :: rest)) in
+            subst, v
+        | h :: t -> loop (h :: acc) t in
+      loop [] lst
+  | Atom _ as sexp -> illegal_atom "extract_rec" sexp
+
+let id x = x
+
+let rec subst_option (sup_subst, el) rest =
+  let sub_subst, sub_el = subst_path el rest in
+  let subst x = sup_subst (Some (sub_subst x)) in
+  subst, sub_el
+
+and subst_path sexp = function
+  | Pos n :: t -> subst_option (extract_pos n sexp) t
+  | Match (tag, arg_ix) :: t -> subst_option (extract_match tag arg_ix sexp) t
+  | Rec key :: rest ->
+      let rec_subst, el = extract_rec key sexp in
+      let sub_subst, sub_el = subst_path el rest in
+      let subst x = rec_subst (sub_subst x) in
+      subst, sub_el
+  | [] -> id, sexp
+
+let implode lst =
+  let len = List.length lst in
+  let str = String.create len in
+  let rec loop ix = function
+    | h :: t -> str.[ix] <- h; loop (ix + 1) t
+    | [] -> str in
+  loop 0 lst
+
+let fail_parse msg = failwith ("Path.parse: " ^ msg)
+
+let parse str =
+  let len = String.length str in
+  if len = 0 then fail_parse "path empty"
+  else
+    let rec loop acc dot_ix =
+      match str.[dot_ix] with
+      | '.' ->
+          let dot_ix1 = dot_ix + 1 in
+          if dot_ix1 = len then List.rev acc
+          else
+            let rec parse_dot acc str_acc ix =
+              if ix = len then
+                List.rev_append acc [Rec (implode (List.rev str_acc))]
+              else
+                match str.[ix] with
+                | '[' ->
+                    let rec parse_index index_acc ix =
+                      if ix = len then fail_parse "EOF reading index"
+                      else
+                        match str.[ix], index_acc with
+                        | '0'..'9' as c, None ->
+                            parse_index (Some (int_of_char c - 48)) (ix + 1)
+                        | '0'..'9' as c, Some index_acc ->
+                            let new_index_acc =
+                              Some (10 * index_acc + int_of_char c - 48) in
+                            parse_index new_index_acc (ix + 1)
+                        | ']', None -> fail_parse "empty index"
+                        | ']', Some index_acc ->
+                            let path_el =
+                              if str_acc = [] then Pos index_acc
+                              else
+                                Match (implode (List.rev str_acc), index_acc) in
+                            let ix1 = ix + 1 in
+                            if ix1 = len then List.rev_append acc [path_el]
+                            else loop (path_el :: acc) ix1
+                        | c, _ ->
+                            fail_parse (
+                              sprintf "illegal character in index: %c" c) in
+                    parse_index None (ix + 1)
+                | '\\' ->
+                    let ix1 = ix + 1 in
+                    if ix1 = len then fail_parse "EOF after escape"
+                    else parse_dot acc (str.[ix1] :: str_acc) (ix + 1)
+                | '.' ->
+                    if str_acc = [] then fail_parse "double '.'";
+                    let path_el = Rec (implode (List.rev str_acc)) in
+                    parse_dot (path_el :: acc) [] (ix + 1)
+                | c -> parse_dot acc (c :: str_acc) (ix + 1) in
+            parse_dot acc [] dot_ix1
+      | c -> fail_parse (sprintf "'.' expected; got '%c'" c) in
+    loop [] 0
+
+let get_subst path str sexp =
+  let path =
+    match path, str with
+    | Some path, _ -> path
+    | None, Some str -> parse str
+    | None, None -> [] in
+  subst_path sexp path
+
+let get ?path ?str sexp = snd (get_subst path str sexp)
+
+let replace ?path ?str sexp ~subst =
+  let subst_fun, _ = get_subst path str sexp in
+  subst_fun subst
+
+let replace_no_path ~str sexp ~subst = replace ~str sexp ~subst
diff --git a/ocamlsexp/path.mli b/ocamlsexp/path.mli
new file mode 100644 (file)
index 0000000..7375885
--- /dev/null
@@ -0,0 +1,116 @@
+(* File: path.mli
+
+    Copyright (C) 2005-
+
+      Jane Street Holding, LLC
+      Author: Markus Mottl
+      email: mmottl\@janestcapital.com
+      WWW: http://www.janestcapital.com/ocaml
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+(* WL YM for MM: Some other functions that would be useful: get_opt, insert_record_field,
+   remove_record_field *)
+
+(** Path: Module for Substitutions within S-expressions *)
+
+(** {6 Types} *)
+
+(** Type of substitution elements *)
+type el =
+  | Pos of int  (** [Pos n] denotes [n]th element in a tuple *)
+  | Match of string * int
+      (** [Match (tag, n)] denotes [n]th argument of sum matching [tag] *)
+  | Rec of string  (** [Rec name] denotes the record field having [name] *)
+
+(** Type of substitution paths *)
+type t = el list
+
+
+(** {6 High-level functions} *)
+
+val parse : string -> t
+(** [parse str] @return a substitution path represented by string [str].
+
+    Syntax:
+
+      "." ->
+        separates path elements; must be present at start of string.
+
+      "\[4\]" ->
+        specifies the 4th element in a tuple.
+
+      "some_tag\[4\]" ->
+        tries to match [some_tag], then denotes its 4th argument.
+
+      "name" ->
+        denotes record field having [name]
+
+    Example from test code:
+
+      ".t.x.B[1]" -> choose record field with name [t], then subfield
+      [x].  Match this value against [B], and denote its first argument.
+*)
+
+val get : ?path : t -> ?str : string -> Sexp.t -> Sexp.t
+(** [get ?path ?str sexp] if [path] is provided, use it as path.
+    Otherwise, if [str] is provided, parse it as a path.  If neither
+    is provided, assume an empty path.  @return the sub-expression from
+    S-expression [sexp] denoted by the path. *)
+
+val replace : ?path : t -> ?str : string -> Sexp.t -> subst : Sexp.t -> Sexp.t
+(** [replace ?path ?str sexp ~subst] like [get], but does not extract
+    a sub-expression but substitutes it with [subst].  @return resulting
+    S-expression.  *)
+
+val replace_no_path : str : string -> Sexp.t -> subst : Sexp.t -> Sexp.t
+(** [replace_no_path ~str sexp ~subst] like [replace], but does not take
+    optional arguments.  [str] must be specified. *)
+
+val subst_path : Sexp.t -> t -> (Sexp.t -> Sexp.t) * Sexp.t
+(** [subst_path sexp path] @return the tuple [(subst, sub)], where [subst]
+    is a function that returns an S-expression in which the subexpression
+    denoted by [path] in [sexp] has been substituted by its argument.
+    [sub] is the denoted subexpression.  Note that [subst sub = sexp]. *)
+
+
+(** {6 Low-level functions} *)
+
+val extract_pos : int -> Sexp.t -> (Sexp.t option -> Sexp.t) * Sexp.t
+(** [extract_pos n sexp] @return the tuple [(subst, sub)], where [subst]
+    is a function that returns an S-expression in which the subexpression
+    denoted at position [n] in [sexp], which must be a list, has been
+    substituted by [value] if the optional argument is [Some value], or
+    removes the denoted subexpression if the optional argument is [None].
+    [sub] is the denoted subexpression.  Note that [subst (Some sub) =
+    sexp]. *)
+
+val extract_match :
+  string -> int -> Sexp.t -> (Sexp.t option -> Sexp.t) * Sexp.t
+(** [extract_match tag n sexp] @return the tuple [(subst, sub)], where
+    [subst] is a function that returns an S-expression in which the
+    subexpression denoted by matching [tag] and taking its [n]th argument
+    in [sexp] has been substituted by [value] if the argument is [Some
+    value], or removes the denoted subexpression if the optional argument
+    is [None].  [sub] is the denoted subexpression.  Note that [subst
+    (Some sub) = sexp]. *)
+
+val extract_rec : string -> Sexp.t -> (Sexp.t -> Sexp.t) * Sexp.t
+(** [extract_rec name sexp] @return the tuple [(subst, sub)], where
+    [subst] is a function that returns an S-expression in which the
+    subexpression denoted by matching field name [name] in [sexp] has
+    been substituted by its argument.  [sub] is the denoted subexpression.
+    Note that [subst (Some sub) = sexp]. *)
diff --git a/ocamlsexp/pre_sexp.ml b/ocamlsexp/pre_sexp.ml
new file mode 100644 (file)
index 0000000..dad65cc
--- /dev/null
@@ -0,0 +1,680 @@
+(*pp cpp *)
+
+(* File: sexp.ml
+
+    Copyright (C) 2005-
+
+      Jane Street Holding, LLC
+      Author: Markus Mottl
+      email: mmottl\@janestcapital.com
+      WWW: http://www.janestcapital.com/ocaml
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+(* Sexp: Module for handling S-expressions (I/O, etc.) *)
+
+open Format
+
+include Type
+
+(* Default indentation level for human-readable conversions *)
+
+let default_indent = ref 1
+
+(* Escaping of strings used as atoms in S-expressions *)
+
+let is_special_char c =
+  c <= ' ' || c = '"' || c = '(' || c = ')' || c = ';' || c = '\\'
+
+let must_escape str =
+  let len = String.length str in
+  len = 0 ||
+    let rec loop ix = is_special_char str.[ix] || ix > 0 && loop (ix - 1) in
+    loop (len - 1)
+
+let maybe_esc_str str =
+  if must_escape str then
+    let estr = String.escaped str in
+    let elen = String.length estr in
+    let res = String.create (elen + 2) in
+    String.blit estr 0 res 1 elen;
+    res.[0] <- '"';
+    res.[elen + 1] <- '"';
+    res
+  else str
+
+let pp_maybe_esc_str ppf str = pp_print_string ppf (maybe_esc_str str)
+
+(* Output of S-expressions to formatters *)
+
+let rec pp_hum_indent indent ppf = function
+  | Atom str -> pp_maybe_esc_str ppf str
+  | List (h :: t) ->
+      pp_open_box ppf indent;
+      pp_print_string ppf "(";
+      pp_hum_indent indent ppf h;
+      pp_hum_rest indent ppf t
+  | List [] -> pp_print_string ppf "()"
+
+and pp_hum_rest indent ppf = function
+  | h :: t ->
+      pp_print_space ppf ();
+      pp_hum_indent indent ppf h;
+      pp_hum_rest indent ppf t
+  | [] ->
+      pp_print_string ppf ")";
+      pp_close_box ppf ()
+
+let rec pp_mach_internal may_need_space ppf = function
+  | Atom str ->
+      let str' = maybe_esc_str str in
+      let new_may_need_space = str' == str in
+      if may_need_space && new_may_need_space then pp_print_string ppf " ";
+      pp_print_string ppf str';
+      new_may_need_space
+  | List (h :: t) ->
+      pp_print_string ppf "(";
+      let may_need_space = pp_mach_internal false ppf h in
+      pp_mach_rest may_need_space ppf t;
+      false
+  | List [] -> pp_print_string ppf "()"; false
+
+and pp_mach_rest may_need_space ppf = function
+  | h :: t ->
+      let may_need_space = pp_mach_internal may_need_space ppf h in
+      pp_mach_rest may_need_space ppf t
+  | [] -> pp_print_string ppf ")"
+
+let pp_hum ppf sexp = pp_hum_indent !default_indent ppf sexp
+
+let pp_mach ppf sexp = ignore (pp_mach_internal false ppf sexp)
+let pp = pp_mach
+
+(* Sexp size *)
+
+let rec size_loop (v, c as acc) = function
+  | Atom str -> v + 1, c + String.length str
+  | List lst -> List.fold_left size_loop acc lst
+
+let size sexp = size_loop (0, 0) sexp
+
+
+(* Buffer conversions *)
+
+let to_buffer_hum ~buf ?(indent = !default_indent) sexp =
+  Format.bprintf buf "%a@?" (pp_hum_indent indent) sexp
+
+let to_buffer_mach ~buf sexp =
+  let rec loop may_need_space = function
+    | Atom str ->
+        let str' = maybe_esc_str str in
+        let new_may_need_space = str' == str in
+        if may_need_space && new_may_need_space then Buffer.add_char buf ' ';
+        Buffer.add_string buf str';
+        new_may_need_space
+    | List (h :: t) ->
+        Buffer.add_char buf '(';
+        let may_need_space = loop false h in
+        loop_rest may_need_space t;
+        false
+    | List [] -> Buffer.add_string buf "()"; false
+  and loop_rest may_need_space = function
+    | h :: t ->
+        let may_need_space = loop may_need_space h in
+        loop_rest may_need_space t
+    | [] -> Buffer.add_char buf ')' in
+  ignore (loop false sexp)
+
+let to_buffer = to_buffer_mach
+
+
+(* Output of S-expressions to I/O-channels *)
+
+let buffer () = Buffer.create 4096
+
+let with_new_buffer oc f =
+  let buf = buffer () in
+  f buf;
+  Buffer.output_buffer oc buf
+  
+let output_hum oc sexp =
+  with_new_buffer oc (fun buf -> to_buffer_hum sexp ~buf)
+
+let output_hum_indent indent oc sexp =
+  with_new_buffer oc (fun buf -> to_buffer_hum ~indent sexp ~buf)
+
+let output_mach oc sexp =
+  with_new_buffer oc (fun buf -> to_buffer_mach sexp ~buf)
+
+let output = output_mach
+
+
+(* String conversions *)
+
+let to_string_hum ?indent sexp =
+  let buf = buffer () in
+  to_buffer_hum ?indent sexp ~buf;
+  Buffer.contents buf
+
+let to_string_mach sexp =
+  let buf = buffer () in
+  to_buffer_mach sexp ~buf;
+  Buffer.contents buf
+
+let to_string = to_string_mach
+
+
+(* Scan functions *)
+
+let scan_sexp ?buf lexbuf = Parser.sexp (Lexer.main ?buf) lexbuf
+let scan_sexps ?buf lexbuf = Parser.sexps (Lexer.main ?buf) lexbuf
+
+let get_main_buf buf =
+  let buf =
+    match buf with
+    | None -> Buffer.create 64
+    | Some buf -> buf in
+  Lexer.main ~buf
+
+let scan_fold_sexps ?buf ~f ~init lexbuf =
+  let main = get_main_buf buf in
+  let rec loop acc =
+    match Parser.sexp_opt main lexbuf with
+    | None -> acc
+    | Some sexp -> loop (f sexp acc) in
+  loop init
+
+let scan_iter_sexps ?buf ~f lexbuf =
+  let main = get_main_buf buf in
+  let rec loop () =
+    match Parser.sexp_opt main lexbuf with
+    | None -> ()
+    | Some sexp -> f sexp; loop () in
+  loop ()
+
+let scan_cnv_sexps ?buf ~f lexbuf =
+  let coll sexp acc = f sexp :: acc in
+  List.rev (scan_fold_sexps ?buf ~f:coll ~init:[] lexbuf)
+
+
+(* Partial parsing *)
+
+type parse_pos =
+  {
+    mutable text_line : int;  (** Line position in parsed text *)
+    mutable text_char : int;  (** Character position in parsed text *)
+    mutable buf_pos : int;  (** Reading position in buffer *)
+  }
+
+type 'a parse_result = Done of t * parse_pos | Cont of bool * 'a parse_fun
+and 'a parse_fun = pos : int -> len : int -> 'a -> 'a parse_result
+
+type parse_state =
+  {
+    parse_pos : parse_pos;
+    mutable pstack : t list list;
+    pbuf : Buffer.t;
+  }
+
+type parse_error =
+  {
+    location : string;
+    err_msg : string;
+    parse_state : parse_state;
+  }
+
+exception ParseError of parse_error
+
+let bump_text_line { parse_pos = parse_pos } =
+  parse_pos.text_line <- parse_pos.text_line + 1;
+  parse_pos.text_char <- 1
+
+let bump_text_pos { parse_pos = parse_pos } =
+  parse_pos.text_char <- parse_pos.text_char + 1
+
+let bump_pos_cont state str ~max_pos ~pos cont =
+  bump_text_pos state;
+  cont state str ~max_pos ~pos:(pos + 1)
+
+let bump_line_cont state str ~max_pos ~pos cont =
+  bump_text_line state;
+  cont state str ~max_pos ~pos:(pos + 1)
+
+let add_bump bump state str ~max_pos ~pos c cont =
+  Buffer.add_char state.pbuf c;
+  bump state;
+  cont state str ~max_pos ~pos:(pos + 1)
+
+let add_bump_pos state str ~max_pos ~pos c cont =
+  add_bump bump_text_pos state str ~max_pos ~pos c cont
+
+let add_bump_line state str ~max_pos ~pos c cont =
+  add_bump bump_text_line state str ~max_pos ~pos c cont
+
+let mk_parse_pos { parse_pos = parse_pos } buf_pos =
+  parse_pos.buf_pos <- buf_pos;
+  parse_pos
+
+let bump_found_atom bump state str ~max_pos ~pos cont =
+  let pbuf = state.pbuf in
+  let atom = Atom (Buffer.contents pbuf) in
+  match state.pstack with
+  | [] -> Done (atom, mk_parse_pos state pos)
+  | rev_sexp_lst :: sexp_stack ->
+      Buffer.clear pbuf;
+      state.pstack <- (atom :: rev_sexp_lst) :: sexp_stack;
+      bump state;
+      cont state str ~max_pos ~pos:(pos + 1)
+
+let raise_parse_error state location err_msg =
+  let parse_error =
+    {
+      location = location;
+      err_msg = err_msg;
+      parse_state = state;
+    }
+  in
+  raise (ParseError parse_error)
+
+let raise_unexpected_char state ~loc pos c =
+  let err_msg = sprintf "unexpected character: '%c'" c in
+  let parse_pos = state.parse_pos in
+  parse_pos.buf_pos <- pos;
+  parse_pos.text_char <- parse_pos.text_char + 1;
+  raise_parse_error state loc err_msg
+
+(* Macro for generating parsers *)
+#define MK_PARSER(TYPE, GET_LEN, PARSE, GET_CHAR) \
+  let check_str_bounds loc ~pos ~len (str : TYPE) = \
+    if pos < 0 then invalid_arg (loc ^ ": pos < 0"); \
+    if len < 0 then invalid_arg (loc ^ ": len < 0"); \
+    let str_len = GET_LEN str in \
+    let pos_len = pos + len in \
+    if pos_len > str_len then invalid_arg (loc ^ ": pos + len > str_len"); \
+    pos_len - 1 \
+  \
+  let mk_cont name cont state = \
+    let ws_only = state.pstack = [] && Buffer.length state.pbuf = 0 in \
+    let parse_fun ~pos ~len str = \
+      let max_pos = check_str_bounds name ~pos ~len str in \
+      cont state str ~max_pos ~pos \
+    in \
+    Cont (ws_only, parse_fun) \
+  \
+  let rec PARSE state str ~max_pos ~pos = \
+    if pos > max_pos then mk_cont "parse" PARSE state \
+    else \
+      match GET_CHAR with \
+      | '(' -> \
+          state.pstack <- [] :: state.pstack; \
+          bump_pos_cont state str ~max_pos ~pos PARSE \
+      | ')' as c -> \
+          (match state.pstack with \
+          | [] -> raise_unexpected_char state ~loc:"parse" pos c \
+          | rev_sexp_lst :: sexp_stack -> \
+              let sexp = List (List.rev rev_sexp_lst) in \
+              match sexp_stack with \
+              | [] -> Done (sexp, mk_parse_pos state (pos + 1)) \
+              | higher_rev_sexp_lst :: higher_sexp_stack -> \
+                  state.pstack <- \
+                    (sexp :: higher_rev_sexp_lst) :: higher_sexp_stack; \
+                  bump_pos_cont state str ~max_pos ~pos PARSE) \
+      | ' ' | '\009' | '\012' -> bump_pos_cont state str ~max_pos ~pos PARSE \
+      | '\010' -> bump_line_cont state str ~max_pos ~pos PARSE \
+      | '\013' -> bump_line_cont state str ~max_pos ~pos parse_nl \
+      | ';' -> bump_pos_cont state str ~max_pos ~pos parse_comment \
+      | '"' -> bump_pos_cont state str ~max_pos ~pos parse_quoted \
+      | c -> add_bump_pos state str ~max_pos ~pos c parse_atom \
+  \
+  and parse_nl state str ~max_pos ~pos = \
+    if pos > max_pos then mk_cont "parse_nl" parse_nl state \
+    else \
+      let pos = if GET_CHAR = '\010' then pos + 1 else pos in \
+      PARSE state str ~max_pos ~pos \
+  \
+  and parse_comment state str ~max_pos ~pos = \
+    if pos > max_pos then mk_cont "parse_comment" parse_comment state \
+    else \
+      match GET_CHAR with \
+      | '\010' -> bump_line_cont state str ~max_pos ~pos PARSE \
+      | '\013' -> bump_line_cont state str ~max_pos ~pos parse_nl \
+      | _ -> bump_pos_cont state str ~max_pos ~pos parse_comment \
+  \
+  and parse_atom state str ~max_pos ~pos = \
+    if pos > max_pos then mk_cont "parse_atom" parse_atom state \
+    else \
+      match GET_CHAR with \
+      | ' ' | '\009' | '\012' -> \
+          bump_found_atom bump_text_pos state str ~max_pos ~pos PARSE \
+      | '(' -> \
+          let pbuf = state.pbuf in \
+          let atom = Atom (Buffer.contents pbuf) in \
+          (match state.pstack with \
+          | [] -> Done (atom, mk_parse_pos state pos) \
+          | rev_sexp_lst :: sexp_stack -> \
+              Buffer.clear pbuf; \
+              state.pstack <- [] :: (atom :: rev_sexp_lst) :: sexp_stack; \
+              bump_pos_cont state str ~max_pos ~pos PARSE) \
+      | ')' -> \
+          let pbuf = state.pbuf in \
+          let atom = Atom (Buffer.contents pbuf) in \
+          (match state.pstack with \
+          | [] -> Done (atom, mk_parse_pos state pos) \
+          | rev_sexp_lst :: sexp_stack -> \
+              let sexp = List (List.rev_append rev_sexp_lst [atom]) in \
+              match sexp_stack with \
+              | [] -> Done (sexp, mk_parse_pos state (pos + 1)) \
+              | higher_rev_sexp_lst :: higher_sexp_stack -> \
+                  Buffer.clear pbuf; \
+                  state.pstack <- \
+                    (sexp :: higher_rev_sexp_lst) :: higher_sexp_stack; \
+                  bump_pos_cont state str ~max_pos ~pos PARSE) \
+      | '\010' -> bump_found_atom bump_text_line state str ~max_pos ~pos PARSE \
+      | '\013' -> \
+          bump_found_atom bump_text_line state str ~max_pos ~pos parse_nl \
+      | ';' -> \
+          bump_found_atom bump_text_pos state str ~max_pos ~pos parse_comment \
+      | '"' -> \
+          bump_found_atom bump_text_pos state str ~max_pos ~pos parse_quoted \
+      | c -> add_bump_pos state str ~max_pos ~pos c parse_atom \
+  \
+  and parse_quoted state str ~max_pos ~pos = \
+    if pos > max_pos then mk_cont "parse_quoted" parse_quoted state \
+    else \
+      match GET_CHAR with \
+      | '"' -> \
+          let pbuf = state.pbuf in \
+          let atom = Atom (Buffer.contents pbuf) in \
+          (match state.pstack with \
+          | [] -> Done (atom, mk_parse_pos state (pos + 1)) \
+          | rev_sexp_lst :: sexp_stack -> \
+              Buffer.clear pbuf; \
+              state.pstack <- (atom :: rev_sexp_lst) :: sexp_stack; \
+              bump_pos_cont state str ~max_pos ~pos PARSE) \
+      | '\\' -> bump_pos_cont state str ~max_pos ~pos parse_escaped \
+      | '\010' as c -> add_bump_line state str ~max_pos ~pos c parse_quoted \
+      | '\013' as c -> add_bump_line state str ~max_pos ~pos c parse_quoted_nl \
+      | c -> add_bump_pos state str ~max_pos ~pos c parse_quoted \
+  \
+  and parse_quoted_nl state str ~max_pos ~pos = \
+    if pos > max_pos then mk_cont "parse_quoted_nl" parse_quoted_nl state \
+    else \
+      let pos = \
+        let c = '\010' in \
+        if GET_CHAR = c then ( \
+          Buffer.add_char state.pbuf c; \
+          pos + 1 \
+        ) \
+        else pos \
+      in \
+      parse_quoted state str ~max_pos ~pos \
+  \
+  and parse_escaped state str ~max_pos ~pos = \
+    if pos > max_pos then mk_cont "parse_escaped" parse_escaped state \
+    else \
+      match GET_CHAR with \
+      | '\010' -> bump_line_cont state str ~max_pos ~pos parse_skip_ws \
+      | '\013' -> bump_line_cont state str ~max_pos ~pos parse_skip_ws_nl \
+      | '0' .. '9' as c -> \
+          bump_text_pos state; \
+          let d = Char.code c - 48 in \
+          parse_dec state str ~max_pos ~pos:(pos + 1) ~count:2 ~d \
+      | 'x' -> \
+          bump_text_pos state; \
+          parse_hex state str ~max_pos ~pos:(pos + 1) ~count:2 ~d:0 \
+      | ('\\' | '"' | '\'' ) as c -> \
+          add_bump_pos state str ~max_pos ~pos c parse_quoted \
+      | 'n' -> add_bump_pos state str ~max_pos ~pos '\n' parse_quoted \
+      | 't' -> add_bump_pos state str ~max_pos ~pos '\t' parse_quoted \
+      | 'b' -> add_bump_pos state str ~max_pos ~pos '\b' parse_quoted \
+      | 'r' -> add_bump_pos state str ~max_pos ~pos '\r' parse_quoted \
+      | c -> \
+          Buffer.add_char state.pbuf '\\'; \
+          add_bump_pos state str ~max_pos ~pos c parse_quoted \
+  \
+  and parse_skip_ws state str ~max_pos ~pos = \
+    if pos > max_pos then mk_cont "parse_skip_ws" parse_skip_ws state \
+    else \
+      match GET_CHAR with \
+      | ' ' | '\009' -> bump_pos_cont state str ~max_pos ~pos parse_skip_ws \
+      | _ -> parse_quoted state str ~max_pos ~pos \
+  \
+  and parse_skip_ws_nl state str ~max_pos ~pos = \
+    if pos > max_pos then mk_cont "parse_skip_ws_nl" parse_skip_ws_nl state \
+    else \
+      let pos = if GET_CHAR = '\010' then pos + 1 else pos in \
+      parse_skip_ws state str ~max_pos ~pos \
+  \
+  and parse_dec state str ~max_pos ~pos ~count ~d = \
+    if pos > max_pos then mk_cont "parse_dec" (parse_dec ~count ~d) state \
+    else \
+      match GET_CHAR with \
+      | '0' .. '9' as c -> \
+          let d = 10 * d + Char.code c - 48 in \
+          if count = 1 then \
+            if d > 255 then \
+              let err_msg = sprintf "illegal decimal escape: \\%d" d in \
+              raise_parse_error state "parse_dec" err_msg \
+            else \
+              add_bump_pos state str ~max_pos ~pos (Char.chr d) parse_quoted \
+          else ( \
+            bump_text_pos state; \
+            parse_dec state str ~max_pos ~pos:(pos + 1) ~count:(count - 1) ~d) \
+      | c -> raise_unexpected_char state ~loc:"parse_dec" pos c \
+  \
+  and parse_hex state str ~max_pos ~pos ~count ~d = \
+    if pos > max_pos then mk_cont "parse_hex" (parse_hex ~count ~d) state \
+    else \
+      match GET_CHAR with \
+      | '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' as c -> \
+          let corr = \
+            if c >= 'a' then 87 \
+            else if c >= 'A' then 55 \
+            else 48 \
+          in \
+          let d = 16 * d + Char.code c - corr in \
+          if count = 1 then \
+            if d > 255 then \
+              let err_msg = sprintf "illegal hexadecimal escape: \\%x" d in \
+              raise_parse_error state "parse_hex" err_msg \
+            else \
+              add_bump_pos state str ~max_pos ~pos (Char.chr d) parse_quoted \
+          else ( \
+            bump_text_pos state; \
+            parse_hex state str ~max_pos ~pos:(pos + 1) ~count:(count - 1) ~d) \
+      | c -> raise_unexpected_char state ~loc:"parse_hex" pos c \
+  \
+  let PARSE ?(text_line = 1) ?(text_char = 1) ?(pos = 0) ?len str = \
+    let len = \
+      match len with \
+      | Some len -> len \
+      | None -> GET_LEN str - pos \
+    in \
+    let max_pos = check_str_bounds "parse" ~pos ~len str in \
+    let state = \
+      { \
+        parse_pos = \
+          { \
+            text_line = text_line; \
+            text_char = text_char; \
+            buf_pos = pos; \
+          }; \
+        pstack = []; \
+        pbuf = Buffer.create 128; \
+      } \
+    in \
+    PARSE state str ~max_pos ~pos
+
+MK_PARSER(string, String.length, parse_str, str.[pos])
+
+let parse = parse_str
+
+let plain_parse ~pos ~len str = parse ~pos ~len str
+
+
+(* Partial parsing from bigstrings *)
+
+(* NOTE: this is really an awful duplication of the code for parsing
+   strings, but since OCaml does not inline higher-order functions known
+   at compile, other solutions would sacrifice a lot of efficiency. *)
+
+open Bigarray
+
+type bstr = (char, int8_unsigned_elt, c_layout) Array1.t
+
+MK_PARSER(bstr, Array1.dim, parse_bstr, str.{pos})
+
+
+(* Input functions *)
+
+let reraise_parse_error pe global_pos =
+  let ps = pe.parse_state in
+  let ppos = ps.parse_pos in
+  let new_ppos = { ppos with buf_pos = global_pos + ppos.buf_pos } in
+  let new_ps = { ps with parse_pos = new_ppos } in
+  let new_pe = { pe with parse_state = new_ps } in
+  raise (ParseError new_pe)
+
+let input_sexp ?text_line ?text_char ?(buf_pos = 0) ic =
+  let buf = String.create 1 in
+  let rec loop this_parse =
+    let c = input_char ic in
+    buf.[0] <- c;
+    let parse_res =
+      try this_parse ~pos:0 ~len:1 buf
+      with ParseError pe -> reraise_parse_error pe buf_pos
+    in
+    match parse_res with
+    | Done (sexp, _) -> sexp
+    | Cont (_, this_parse) -> loop this_parse
+  in
+  let this_parse ~pos ~len str = parse ?text_line ?text_char ~pos ~len str in
+  loop this_parse
+
+let input_rev_sexps
+      ?text_line ?text_char
+      ?(buf_pos = 0) ?(buf = String.create 8192) ic =
+  let rev_sexps_ref = ref [] in
+  let buf_len = String.length buf in
+  let is_incomplete_ref = ref false in
+  let buf_pos_ref = ref buf_pos in
+  let rec loop this_parse pos len =
+    if len > 0 then
+      let parse_res =
+        try this_parse ~pos ~len buf
+        with ParseError pe -> reraise_parse_error pe !buf_pos_ref
+      in
+      match parse_res with
+      | Done (sexp, new_pos) ->
+          rev_sexps_ref := sexp :: !rev_sexps_ref;
+          let n_parsed = new_pos.buf_pos - pos in
+          is_incomplete_ref := false;
+          let text_line = new_pos.text_line in
+          let text_char = new_pos.text_char in
+          let this_parse ~pos ~len str =
+            parse ~text_line ~text_char ~pos ~len str
+          in
+          if n_parsed = len then
+            let new_len = input ic buf 0 buf_len in
+            buf_pos_ref := !buf_pos_ref + new_pos.buf_pos;
+            loop this_parse 0 new_len
+          else loop this_parse new_pos.buf_pos (len - n_parsed)
+      | Cont (ws_only, this_parse) ->
+          is_incomplete_ref := not ws_only;
+          buf_pos_ref := !buf_pos_ref + len + pos;
+          loop this_parse 0 (input ic buf 0 buf_len)
+    else if !is_incomplete_ref then raise End_of_file
+    else !rev_sexps_ref
+  in
+  let this_parse ~pos ~len str = parse ?text_line ?text_char ~pos ~len str in
+  loop this_parse 0 (input ic buf 0 buf_len)
+
+let input_sexps ?text_line ?text_char ?buf_pos ?buf ic =
+  let rev_sexps = input_rev_sexps ?text_line ?text_char ?buf_pos ?buf ic in
+  List.rev rev_sexps
+
+(* of_string and of_bstr *)
+
+let of_string_bstr loc this_parse ws_buf get_len get_sub str =
+  match this_parse str with
+  | Done (_, { buf_pos = buf_pos }) when buf_pos <> get_len str ->
+      let prefix_len = min (get_len str - buf_pos) 20 in
+      let prefix = get_sub str buf_pos prefix_len in
+      let msg =
+        sprintf "%s: S-expression followed by data at position %d: %S..."
+          loc buf_pos prefix
+      in
+      failwith msg
+  | Done (sexp, _) -> sexp
+  | Cont (ws_only, this_parse) ->
+      if ws_only then failwith (loc ^ ": whitespace only");
+      match this_parse ~pos:0 ~len:1 ws_buf with
+      | Done (sexp, _) -> sexp
+      | Cont _ -> failwith (loc ^ ": incomplete S-expression")
+
+let of_string str =
+  of_string_bstr "Sexp.of_string" parse " " String.length String.sub str
+
+let get_bstr_sub_str bstr pos len =
+  let str = String.create len in
+  for i = 0 to len - 1 do str.[i] <- bstr.{pos + i} done;
+  str
+
+let bstr_ws_buf = Array1.create char c_layout 1
+let () = bstr_ws_buf.{0} <- ' '
+
+let of_bstr bstr =
+  of_string_bstr "Sexp.of_bstr"
+    parse_bstr bstr_ws_buf Array1.dim get_bstr_sub_str bstr
+
+(* Loading *)
+
+let load_sexp ?(buf = String.create 8192) file =
+  let buf_len = String.length buf in
+  let ic = open_in file in
+  let rec loop this_parse =
+    let len = input ic buf 0 buf_len in
+    if len = 0 then raise End_of_file
+    else
+      match this_parse ~pos:0 ~len buf with
+      | Done (sexp, _) -> sexp
+      | Cont (_, this_parse) -> loop this_parse
+  in
+  try
+    let sexp = loop plain_parse in
+    close_in ic;
+    sexp
+  with exc -> close_in_noerr ic; raise exc
+
+let load_rev_sexps ?buf file =
+  let ic = open_in file in
+  try
+    let sexps = input_rev_sexps ?buf ic in
+    close_in ic;
+    sexps
+  with exc -> close_in_noerr ic; raise exc
+
+let load_sexps ?buf file =
+  let rev_sexps = load_rev_sexps ?buf file in
+  List.rev rev_sexps
+
+
+(* Utilities for automated type conversions *)
+
+let unit = List []
+
+external sexp_of_t : t -> t = "%identity"
+external t_of_sexp : t -> t = "%identity"
diff --git a/ocamlsexp/sexp.ml b/ocamlsexp/sexp.ml
new file mode 100644 (file)
index 0000000..2ba6d73
--- /dev/null
@@ -0,0 +1 @@
+include Pre_sexp
diff --git a/ocamlsexp/sexp.mli b/ocamlsexp/sexp.mli
new file mode 100644 (file)
index 0000000..0cc65ee
--- /dev/null
@@ -0,0 +1,27 @@
+(* File: sexp.mli
+
+    Copyright (C) 2005-
+
+      Jane Street Holding, LLC
+      Author: Markus Mottl
+      email: mmottl\@janestcapital.com
+      WWW: http://www.janestcapital.com/ocaml
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+(** Sexp: Module for handling S-expressions (I/O, etc.) *)
+
+include Sexp_intf.S
diff --git a/ocamlsexp/sexp_intf.ml b/ocamlsexp/sexp_intf.ml
new file mode 100644 (file)
index 0000000..3907e94
--- /dev/null
@@ -0,0 +1,312 @@
+(* File: sexp_intf.ml
+
+    Copyright (C) 2005-
+
+      Jane Street Holding, LLC
+      Author: Markus Mottl
+      email: mmottl\@janestcapital.com
+      WWW: http://www.janestcapital.com/ocaml
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+(** Sexp_intf: interface specification for handling S-expressions (I/O, etc.) *)
+
+open Format
+open Lexing
+
+module type S = sig
+
+  (** Type of S-expressions *)
+  type t = Type.t = Atom of string | List of t list
+
+
+  (** {6 Defaults} *)
+
+  val default_indent : int ref
+  (** [default_indent] reference to default indentation level for
+      human-readable conversions.  Initialisation value: 2. *)
+
+
+  (** {6 S-expression size} *)
+
+  val size : t -> int * int
+  (** [size sexp] @return [(n_atoms, n_chars)], where [n_atoms] is
+      the number of atoms in S-expression [sexp], and [n_chars] is the
+      number of characters in the atoms of the S-expression. *)
+
+
+  (** {6 Scan functions} *)
+
+  val scan_sexp : ?buf : Buffer.t -> lexbuf -> t
+  (** [scan_sexp ?buf lexbuf] scans an S-expression from lex buffer
+      [lexbuf] using the optional string buffer [buf] for storing
+      intermediate strings. *)
+
+  val scan_sexps : ?buf : Buffer.t -> lexbuf -> t list
+  (** [scan_sexps ?buf lexbuf] reads a list of whitespace separated
+      S-expressions from lex buffer [lexbuf] using the optional string
+      buffer [buf] for storing intermediate strings. *)
+
+  val scan_iter_sexps : ?buf : Buffer.t -> f : (t -> unit) -> lexbuf -> unit
+  (** [scan_iter_sexps ?buf ~f lexbuf] iterates over all whitespace
+      separated S-expressions scanned from lex buffer [lexbuf] using
+      function [f], and the optional string buffer [buf] for storing
+      intermediate strings. *)
+
+  val scan_fold_sexps :
+    ?buf : Buffer.t -> f : (t -> 'a -> 'a) -> init : 'a -> lexbuf -> 'a
+  (** [scan_fold_sexps ?buf ~f ~init lexbuf] folds over all whitespace
+      separated S-expressions scanned from lex buffer [lexbuf] using
+      function [f], initial state [init], and the optional string buffer
+      [buf] for storing intermediate strings. *)
+
+  val scan_cnv_sexps : ?buf : Buffer.t -> f : (t -> 'a) -> lexbuf -> 'a list
+  (** [scan_cnv_sexps ?buf ~f lexbuf] maps all whitespace separated
+      S-expressions scanned from lex buffer [lexbuf] to some list using
+      function [f], and the optional string buffer [buf] for storing
+      intermediate strings. *)
+
+
+  (** {6 (Partial) parsing} *)
+
+  (** Position information after complete parse *)
+  type parse_pos = Pre_sexp.parse_pos =
+    private
+      {
+        mutable text_line : int;  (** Line position in parsed text *)
+        mutable text_char : int;  (** Character position in parsed text *)
+        mutable buf_pos : int;  (** Reading position in text buffer *)
+      }
+
+  (** Type of result from calling {!Sexp.parse}. *)
+  type 'a parse_result = 'a Pre_sexp.parse_result =
+    | Done of t * parse_pos  (** [Done (sexp, parse_pos)] finished
+                                 parsing an S-expression.  Current parse
+                                 position is [parse_pos]. *)
+    | Cont of bool * 'a parse_fun  (** [Cont (ws_only, parse_fun)] met the
+                                       end of input before completely
+                                       parsing an S-expression.  The user
+                                       has to call [parse_fun] to continue
+                                       parsing the S-expression in another
+                                       buffer.  If [ws_only] is true, only
+                                       whitespace has been parsed so far (or
+                                       comments!).  NOTE: the continuation
+                                       may only be called once! *)
+
+  and 'a parse_fun = pos : int -> len : int -> 'a -> 'a parse_result
+  (** Type of parsing functions with given offsets and lengths. *)
+
+  (** Type of state maintained during parsing *)
+  type parse_state = Pre_sexp.parse_state =
+    private
+      {
+        parse_pos : parse_pos;  (** Current parse position *)
+        mutable pstack : t list list;  (** Stack of found S-expression lists *)
+        pbuf : Buffer.t;  (** Current atom buffer *)
+      }
+
+  (** Type of parse errors *)
+  type parse_error = Pre_sexp.parse_error =
+    {
+      location : string;  (** Function in which the parse failed *)
+      err_msg : string;  (** Reason why parsing failed *)
+      parse_state : parse_state;  (** State of parser *)
+    }
+
+  (** Exception raised during partial parsing *)
+  exception ParseError of parse_error
+
+  val parse :
+    ?text_line : int -> ?text_char : int -> ?pos : int -> ?len : int -> string
+    -> string parse_result
+  (** [parse ?text_line ?text_char ?pos ?len str] (partially) parses an
+      S-expression in string buffer [str] starting at position [pos]
+      and reading at most [len] characters.  The text position can be
+      initialized with [text_line] and [text_char].  To parse a single
+      atom that is not delimited by whitespace it is necessary to call
+      this function a second time with the returned continuation, and a
+      dummy buffer that contains whitespace.
+
+      @param text_line default = 1
+      @param text_char default = 1
+      @param pos default = 0
+      @param len default = [String.length str - pos]
+  *)
+
+  open Bigarray
+
+  type bstr = (char, int8_unsigned_elt, c_layout) Array1.t
+
+  val parse_bstr :
+    ?text_line : int -> ?text_char : int -> ?pos : int -> ?len : int -> bstr
+    -> bstr parse_result
+  (** [parse_bstr ?text_line ?text_char ?pos ?len str] same as [parse],
+      but operates on bigstrings. *)
+
+  val input_sexp :
+    ?text_line : int -> ?text_char : int -> ?buf_pos : int -> in_channel -> t
+  (** [input_sexp ?text_line ?text_char ?buf_pos ic] parses an S-expression
+      from input channel [ic] using initial position information
+      [text_line], [text_char], and [buf_pos].  NOTE: this function is not
+      as fast on files as {!Sexp.load_sexp}, and is also slightly slower
+      than the scan-functions.  But it is guaranteed that [input_sexp]
+      is only going to read data parseable as an S-expression.  Thus,
+      subsequent input functions will see the data immediately following it.
+
+      @param text_line default = [1]
+      @param text_char default = [1]
+      @param buf_pos default = [0]
+  *)
+
+  val input_sexps :
+    ?text_line : int -> ?text_char : int -> ?buf_pos : int ->
+    ?buf : string -> in_channel -> t list
+  (** [input_sexps ?text_line ?text_char ?buf_pos ??buf ic] parses
+      whitespace separated S-expressions from input channel [ic] until
+      EOF is reached.  Faster than the scan-functions.  NOTE: [buf_pos]
+      is the initial global buffer position used for locating errors and
+      does not refer to [buf].
+
+      @param text_line default = [1]
+      @param text_char default = [1]
+      @param buf_pos default = [0]
+  *)
+
+  val input_rev_sexps :
+    ?text_line : int -> ?text_char : int -> ?buf_pos : int ->
+    ?buf : string -> in_channel -> t list
+  (** [input_rev_sexps ?buf ic] same as {!Sexp.input_sexps}, but returns a
+      reversed list of S-expressions, which is slightly more efficient. *)
+
+
+  (** {6 Loading} *)
+
+  val load_sexp : ?buf : string -> string -> t
+  (** [load_sexp ?buf file] reads one S-expression from file [file] using
+      buffer [buf] for storing intermediate data.  Ignores any trailing
+      data.  Faster than the scan-functions.
+
+      @raise ParseError if the S-expression is unparseable.
+      @raise End_of_file if no S-expression could be read.
+  *)
+
+  val load_sexps : ?buf : string -> string -> t list
+  (** [load_sexps file] reads a list of whitespace separated S-expressions
+      from file [file] using buffer [buf] for storing intermediate data.
+      Faster than the scan-functions.
+
+      @raise ParseError if there is unparseable data in the file.
+      @raise End_of_file if the last S-expression is incomplete.
+  *)
+
+  val load_rev_sexps : ?buf : string -> string -> t list
+  (** [load_rev_sexps file] same as {!Sexp.load_sexps}, but returns a
+      reversed list of S-expressions, which is slightly more efficient. *)
+
+
+  (** {6 Output of S-expressions to I/O-channels} *)
+
+  val output_hum : out_channel -> t -> unit
+  (** [output_hum oc sexp] outputs S-expression [sexp] to output channel
+      [oc] in human readable form. *)
+
+  val output_hum_indent : int -> out_channel -> t -> unit
+  (** [output_hum_indent indent oc sexp] outputs S-expression [sexp]
+      to output channel [oc] in human readable form using indentation level
+      [indent].
+  *)
+
+  val output_mach : out_channel -> t -> unit
+  (** [output_mach oc sexp] outputs S-expression [sexp] to output channel
+      [oc] in machine readable (i.e. most compact) form. *)
+
+  val output : out_channel -> t -> unit
+  (** [output oc sexp] same as [output_mach]. *)
+
+
+  (** {6 Output of S-expressions to formatters} *)
+
+  val pp_hum : formatter -> t -> unit
+  (** [pp_hum ppf sexp] outputs S-expression [sexp] to formatter [ppf]
+      in human readable form. *)
+
+  val pp_hum_indent : int -> formatter -> t -> unit
+  (** [pp_hum_indent n ppf sexp] outputs S-expression [sexp] to formatter
+      [ppf] in human readable form and indentation level [n]. *)
+
+  val pp_mach : formatter -> t -> unit
+  (** [pp_mach ppf sexp] outputs S-expression [sexp] to formatter [ppf]
+      in machine readable (i.e. most compact) form. *)
+
+  val pp : formatter -> t -> unit
+  (** [pp ppf sexp] same as [pp_mach]. *)
+
+
+  (** {6 String and bigstring conversions} *)
+
+  val of_string : string -> t
+  (** [of_string str] converts string [str] to an S-expression. *)
+
+  val of_bstr : bstr -> t
+  (** [of_bstr bstr] converts bigstring [bstr] to an S-expression. *)
+
+  val to_string_hum : ?indent : int -> t -> string
+  (** [to_string_hum ?indent sexp] converts S-expression [sexp] to a
+      string in human readable form with indentation level [indent].
+
+      @param indent default = [!default_indent]
+  *)
+
+  val to_string_mach : t -> string
+  (** [to_string_mach sexp] converts S-expression [sexp] to a string in
+      machine readable (i.e. most compact) form. *)
+
+  val to_string : t -> string
+  (** [to_string sexp] same as [to_string_mach]. *)
+
+
+  (** {6 Buffer conversions} *)
+
+  val to_buffer_hum : buf : Buffer.t -> ?indent : int -> t -> unit
+  (** [to_buffer_hum ~buf ?indent sexp] outputs the S-expression [sexp]
+      converted to a string in human readable form to buffer [buf].
+
+      @param indent default = [!default_indent]
+  *)
+
+  val to_buffer_mach : buf : Buffer.t -> t -> unit
+  (** [to_buffer_mach ~buf sexp] outputs the S-expression [sexp] converted
+      to a string in machine readable (i.e. most compact) form to buffer [buf].
+  *)
+
+  val to_buffer : buf : Buffer.t -> t -> unit
+  (** [to_buffer ~buf sexp] same as {!to_buffer_mach}. *)
+
+
+  (** {6 Utilities for automated type conversions} *)
+
+  val unit : t
+  (** [unit] the unit-value as expressed by an S-expression. *)
+
+  external sexp_of_t : t -> t = "%identity"
+  (** [sexp_of_t sexp] maps S-expressions which are part of a type with
+      automated S-expression conversion to themselves. *)
+
+  external t_of_sexp : t -> t = "%identity"
+  (** [t_of_sexp sexp] maps S-expressions which are part of a type with
+      automated S-expression conversion to themselves. *)
+
+end
diff --git a/ocamlsexp/type.ml b/ocamlsexp/type.ml
new file mode 100644 (file)
index 0000000..8e5ddca
--- /dev/null
@@ -0,0 +1,26 @@
+(* File: type.ml
+
+    Copyright (C) 2005-
+
+      Jane Street Holding, LLC
+      Author: Markus Mottl
+      email: mmottl\@janestcapital.com
+      WWW: http://www.janestcapital.com/ocaml
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+(** Type of S-expressions *)
+type t = Atom of string | List of t list
diff --git a/parsing_c/.depend b/parsing_c/.depend
deleted file mode 100644 (file)
index 7af0138..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-ast_to_flow.cmi: control_flow_c.cmi ../commons/common.cmi ast_c.cmo 
-comment_annotater_c.cmi: parser_c.cmi ast_c.cmo 
-compare_c.cmi: ../commons/common.cmi 
-control_flow_c.cmi: ../commons/ograph_extended.cmi ast_c.cmo 
-cpp_ast_c.cmi: parsing_stat.cmo parse_c.cmi ../commons/common.cmi ast_c.cmo 
-lexer_parser.cmi: ../commons/common.cmi 
-parse_c.cmi: parsing_stat.cmo parsing_hacks.cmi parser_c.cmi \
-    ../commons/common.cmi ast_c.cmo 
-parser_c.cmi: token_c.cmo ast_c.cmo 
-parsing_hacks.cmi: parser_c.cmi ../commons/common.cmi 
-pretty_print_c.cmi: ../commons/ograph_extended.cmi control_flow_c.cmi \
-    ast_c.cmo 
-test_parsing_c.cmi: ../commons/common.cmi 
-token_helpers.cmi: parser_c.cmi ../commons/common.cmi ast_c.cmo 
-type_annoter_c.cmi: ../commons/common.cmi ast_c.cmo 
-type_c.cmi: ast_c.cmo 
-unparse_c.cmi: parse_c.cmi ../commons/common.cmi 
-unparse_cocci.cmi: pretty_print_c.cmi ../parsing_cocci/ast_cocci.cmi \
-    ast_c.cmo 
-unparse_hrule.cmi: ../commons/common.cmi ../parsing_cocci/ast_cocci.cmi \
-    ast_c.cmo 
-visitor_c.cmi: control_flow_c.cmi ../commons/common.cmi ast_c.cmo 
-ast_c.cmo: token_c.cmo ../commons/common.cmi ../parsing_cocci/ast_cocci.cmi 
-ast_c.cmx: token_c.cmx ../commons/common.cmx ../parsing_cocci/ast_cocci.cmx 
-ast_to_flow.cmo: visitor_c.cmi ../commons/ograph_extended.cmi \
-    ../commons/ocollection/oassocb.cmo ../commons/oassoc.cmi \
-    flag_parsing_c.cmo control_flow_c.cmi ../commons/common.cmi ast_c.cmo \
-    ast_to_flow.cmi 
-ast_to_flow.cmx: visitor_c.cmx ../commons/ograph_extended.cmx \
-    ../commons/ocollection/oassocb.cmx ../commons/oassoc.cmx \
-    flag_parsing_c.cmx control_flow_c.cmx ../commons/common.cmx ast_c.cmx \
-    ast_to_flow.cmi 
-comment_annotater_c.cmo: token_helpers.cmi token_c.cmo parser_c.cmi \
-    ../commons/common.cmi ast_c.cmo comment_annotater_c.cmi 
-comment_annotater_c.cmx: token_helpers.cmx token_c.cmx parser_c.cmx \
-    ../commons/common.cmx ast_c.cmx comment_annotater_c.cmi 
-compare_c.cmo: visitor_c.cmi token_helpers.cmi parser_c.cmi parse_c.cmi \
-    lib_parsing_c.cmo flag_parsing_c.cmo ../commons/common.cmi ast_c.cmo \
-    compare_c.cmi 
-compare_c.cmx: visitor_c.cmx token_helpers.cmx parser_c.cmx parse_c.cmx \
-    lib_parsing_c.cmx flag_parsing_c.cmx ../commons/common.cmx ast_c.cmx \
-    compare_c.cmi 
-control_flow_c.cmo: ../commons/ograph_extended.cmi flag_parsing_c.cmo \
-    ../commons/common.cmi ast_c.cmo control_flow_c.cmi 
-control_flow_c.cmx: ../commons/ograph_extended.cmx flag_parsing_c.cmx \
-    ../commons/common.cmx ast_c.cmx control_flow_c.cmi 
-cpp_ast_c.cmo: visitor_c.cmi parse_c.cmi flag_parsing_c.cmo \
-    ../commons/common.cmi ast_c.cmo cpp_ast_c.cmi 
-cpp_ast_c.cmx: visitor_c.cmx parse_c.cmx flag_parsing_c.cmx \
-    ../commons/common.cmx ast_c.cmx cpp_ast_c.cmi 
-flag_parsing_c.cmo: ../commons/common.cmi 
-flag_parsing_c.cmx: ../commons/common.cmx 
-lexer_c.cmo: parser_c.cmi flag_parsing_c.cmo ../commons/common.cmi ast_c.cmo 
-lexer_c.cmx: parser_c.cmx flag_parsing_c.cmx ../commons/common.cmx ast_c.cmx 
-lexer_parser.cmo: flag_parsing_c.cmo ../commons/common.cmi lexer_parser.cmi 
-lexer_parser.cmx: flag_parsing_c.cmx ../commons/common.cmx lexer_parser.cmi 
-lib_parsing_c.cmo: visitor_c.cmi ../globals/flag.cmo ../commons/common.cmi \
-    ../parsing_cocci/ast_cocci.cmi ast_c.cmo 
-lib_parsing_c.cmx: visitor_c.cmx ../globals/flag.cmx ../commons/common.cmx \
-    ../parsing_cocci/ast_cocci.cmx ast_c.cmx 
-parse_c.cmo: visitor_c.cmi token_helpers.cmi token_c.cmo semantic_c.cmo \
-    parsing_stat.cmo parsing_hacks.cmi parser_c.cmi lexer_parser.cmi \
-    lexer_c.cmo flag_parsing_c.cmo ../commons/common.cmi ast_c.cmo \
-    parse_c.cmi 
-parse_c.cmx: visitor_c.cmx token_helpers.cmx token_c.cmx semantic_c.cmx \
-    parsing_stat.cmx parsing_hacks.cmx parser_c.cmx lexer_parser.cmx \
-    lexer_c.cmx flag_parsing_c.cmx ../commons/common.cmx ast_c.cmx \
-    parse_c.cmi 
-parser_c.cmo: token_c.cmo semantic_c.cmo parsing_stat.cmo lexer_parser.cmi \
-    flag_parsing_c.cmo ../commons/common.cmi ast_c.cmo parser_c.cmi 
-parser_c.cmx: token_c.cmx semantic_c.cmx parsing_stat.cmx lexer_parser.cmx \
-    flag_parsing_c.cmx ../commons/common.cmx ast_c.cmx parser_c.cmi 
-parsing_hacks.cmo: token_helpers.cmi token_c.cmo parsing_stat.cmo \
-    parser_c.cmi lexer_parser.cmi flag_parsing_c.cmo ../commons/common.cmi \
-    ast_c.cmo parsing_hacks.cmi 
-parsing_hacks.cmx: token_helpers.cmx token_c.cmx parsing_stat.cmx \
-    parser_c.cmx lexer_parser.cmx flag_parsing_c.cmx ../commons/common.cmx \
-    ast_c.cmx parsing_hacks.cmi 
-parsing_stat.cmo: ../commons/common.cmi 
-parsing_stat.cmx: ../commons/common.cmx 
-pretty_print_c.cmo: ../commons/ograph_extended.cmi lib_parsing_c.cmo \
-    flag_parsing_c.cmo control_flow_c.cmi ../commons/common.cmi ast_c.cmo \
-    pretty_print_c.cmi 
-pretty_print_c.cmx: ../commons/ograph_extended.cmx lib_parsing_c.cmx \
-    flag_parsing_c.cmx control_flow_c.cmx ../commons/common.cmx ast_c.cmx \
-    pretty_print_c.cmi 
-semantic_c.cmo: ../commons/common.cmi 
-semantic_c.cmx: ../commons/common.cmx 
-test_parsing_c.cmo: visitor_c.cmi unparse_c.cmi type_annoter_c.cmi \
-    pretty_print_c.cmi parsing_stat.cmo parse_c.cmi \
-    ../commons/ograph_extended.cmi flag_parsing_c.cmo cpp_ast_c.cmi \
-    compare_c.cmi ../commons/common.cmi comment_annotater_c.cmi \
-    ast_to_flow.cmi ast_c.cmo test_parsing_c.cmi 
-test_parsing_c.cmx: visitor_c.cmx unparse_c.cmx type_annoter_c.cmx \
-    pretty_print_c.cmx parsing_stat.cmx parse_c.cmx \
-    ../commons/ograph_extended.cmx flag_parsing_c.cmx cpp_ast_c.cmx \
-    compare_c.cmx ../commons/common.cmx comment_annotater_c.cmx \
-    ast_to_flow.cmx ast_c.cmx test_parsing_c.cmi 
-token_c.cmo: ../commons/common.cmi 
-token_c.cmx: ../commons/common.cmx 
-token_helpers.cmo: parser_c.cmi ../commons/common.cmi ast_c.cmo \
-    token_helpers.cmi 
-token_helpers.cmx: parser_c.cmx ../commons/common.cmx ast_c.cmx \
-    token_helpers.cmi 
-type_annoter_c.cmo: visitor_c.cmi type_c.cmi parse_c.cmi lib_parsing_c.cmo \
-    flag_parsing_c.cmo ../commons/common.cmi ast_c.cmo type_annoter_c.cmi 
-type_annoter_c.cmx: visitor_c.cmx type_c.cmx parse_c.cmx lib_parsing_c.cmx \
-    flag_parsing_c.cmx ../commons/common.cmx ast_c.cmx type_annoter_c.cmi 
-type_c.cmo: ../commons/common.cmi ast_c.cmo type_c.cmi 
-type_c.cmx: ../commons/common.cmx ast_c.cmx type_c.cmi 
-unparse_c.cmo: visitor_c.cmi unparse_cocci.cmi token_helpers.cmi token_c.cmo \
-    pretty_print_c.cmi parser_c.cmi flag_parsing_c.cmo ../commons/common.cmi \
-    ../parsing_cocci/ast_cocci.cmi ast_c.cmo unparse_c.cmi 
-unparse_c.cmx: visitor_c.cmx unparse_cocci.cmx token_helpers.cmx token_c.cmx \
-    pretty_print_c.cmx parser_c.cmx flag_parsing_c.cmx ../commons/common.cmx \
-    ../parsing_cocci/ast_cocci.cmx ast_c.cmx unparse_c.cmi 
-unparse_cocci.cmo: pretty_print_c.cmi ../commons/common.cmi \
-    ../parsing_cocci/ast_cocci.cmi ast_c.cmo unparse_cocci.cmi 
-unparse_cocci.cmx: pretty_print_c.cmx ../commons/common.cmx \
-    ../parsing_cocci/ast_cocci.cmx ast_c.cmx unparse_cocci.cmi 
-unparse_hrule.cmo: visitor_c.cmi ../parsing_cocci/visitor_ast.cmi \
-    unparse_cocci.cmi ../parsing_cocci/type_cocci.cmi pretty_print_c.cmi \
-    ../globals/flag.cmo ../commons/common.cmi ../parsing_cocci/ast_cocci.cmi \
-    ast_c.cmo unparse_hrule.cmi 
-unparse_hrule.cmx: visitor_c.cmx ../parsing_cocci/visitor_ast.cmx \
-    unparse_cocci.cmx ../parsing_cocci/type_cocci.cmx pretty_print_c.cmx \
-    ../globals/flag.cmx ../commons/common.cmx ../parsing_cocci/ast_cocci.cmx \
-    ast_c.cmx unparse_hrule.cmi 
-visitor_c.cmo: control_flow_c.cmi ../commons/common.cmi ast_c.cmo \
-    visitor_c.cmi 
-visitor_c.cmx: control_flow_c.cmx ../commons/common.cmx ast_c.cmx \
-    visitor_c.cmi 
index 68b0c5a..9850b55 100644 (file)
@@ -7,7 +7,7 @@
 TARGET=parsing_c
 
 
-# - type_cocci.ml ast_cocci.ml  # + unparse_hrule 
+# - type_cocci.ml ast_cocci.ml  # + unparse_hrule
 SRC= flag_parsing_c.ml parsing_stat.ml \
  token_c.ml ast_c.ml control_flow_c.ml type_c.ml \
  visitor_c.ml lib_parsing_c.ml \
@@ -25,26 +25,26 @@ SRC= flag_parsing_c.ml parsing_stat.ml \
 
 
 # ast_cocci.ml and unparse_cocci.ml should be deleted in the futur
-# to make parsing_c really independent of coccinelle. 
+# to make parsing_c really independent of coccinelle.
 # control_flow_c have also coccinelle dependencies.
-# old: parsing_c now depends on cocci_parser because in addition to decorate 
+# old: parsing_c now depends on cocci_parser because in addition to decorate
 # the token in Ast_c with some parse info, we now also make some place to
 # welcome some mcodekind of Ast_cocci.
 LIBS=../commons/commons.cma ../globals/globals.cma \
      ../parsing_cocci/cocci_parser.cma
 
 INCLUDES= -I ../commons -I ../commons/ocamlextra -I ../commons/ocollection \
-  -I ../globals -I  ../parsing_cocci 
+  -I ../globals -I  ../parsing_cocci
 
 #LIBS=../commons/commons.cma
 #INCLUDES= -I ../commons
-SYSLIBS= str.cma unix.cma 
+SYSLIBS= str.cma unix.cma
 
 ##############################################################################
 # Generic variables
 ##############################################################################
 
-#for warning:  -w A 
+#for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
 OCAMLCFLAGS ?= -g -dtypes
 
@@ -134,14 +134,16 @@ locindiv:
 .ml.cmx:
        $(OCAMLOPT) -c $<
 
-.ml.mldepend: 
+.ml.mldepend:
        $(OCAMLC) -i $<
 
 clean::
        rm -f *.cm[ioxa] *.o *.a *.cmxa *.annot
-clean::
        rm -f *~ .*~ gmon.out #*#
 
+distclean::
+       rm -f .depend
+
 beforedepend::
 
 depend:: beforedepend
index 4f4c187..d8824f6 100644 (file)
@@ -16,6 +16,19 @@ open Common
 (*****************************************************************************)
 (* The AST C related types *)
 (*****************************************************************************)
+(*
+ * Some stuff are tagged semantic: which means that they are computed
+ * after parsing. 
+ * 
+ * This means that some elements in this AST are present only if 
+ * some annotation/transformation has been done on the original AST returned
+ * by the parser. Cf type_annotater, comment_annotater, cpp_ast_c, etc.
+ *)
+
+
+(* ------------------------------------------------------------------------- *)
+(* Token/info *)
+(* ------------------------------------------------------------------------- *)
 
 (* To allow some transformations over the AST, we keep as much information 
  * as possible in the AST such as the tokens content and their locations. 
@@ -23,12 +36,11 @@ open Common
  * For instance one tag may say that the unparser should remove this token.
  * 
  * Update: Now I use a ref! in those 'info' so take care.
- * 
  * That means that modifications of the info of tokens can have
  * an effect on the info stored in the ast (which is sometimes 
  * convenient, cf unparse_c.ml or comment_annotater_c.ml)
  * 
- * 
+ * convention: I often use 'ii' for the name of a list of info. 
  * 
  * Sometimes we want to add someting at the beginning or at the end 
  * of a construct. For 'function' and 'decl' we want to add something
@@ -37,29 +49,6 @@ open Common
  * end of a construct. We use fakeInfo for that purpose.
  * To identify those cases I have added a fakestart/fakeend comment.
  * 
- * convention: I often use 'ii' for the name of a list of info. 
- * 
- * update: I now allow ifdefs in the ast but there must be only between
- * "sequencable" elements. They can be put in a type only if this type
- * is used only in a list, like at toplevel, used in 'toplevel list', 
- * or inside compound, used in 'statement list'. I must not allow 
- * ifdef anywhere. For instance I can not make ifdef a statement 
- * cos some instruction like If accept only one statement and the
- * ifdef directive must not take the place of a legitimate instruction.
- * We had a similar phenomena in SmPL where we have the notion
- * of statement and sequencable statement too. Once you have 
- * such a type of sequencable thing, then s/xx list/xx_sequencable list/
- * and introduce the ifdef.
- * 
- * update: those ifdefs are either passed, or present in the AST but in
- * a flat form. To structure those flat ifdefs you have to run
- * a transformation that will put in a tree the statements inside
- * ifdefs branches. Cf cpp_ast_c.ml. This is for instance the difference
- * between a IfdefStmt (flat) and IfdefStmt2 (tree structured).
- * 
- * Some stuff are tagged semantic: which means that they are computed
- * after parsing. 
- * 
  * cocci: Each token will be decorated in the future by the mcodekind
  * of cocci. It is the job of the pretty printer to look at this
  * information and decide to print or not the token (and also the
@@ -73,10 +62,6 @@ open Common
  * because the pending '+' may contain metavariables that refer to some
  * C code.
  * 
- * 
- * All of this means that some elements in this AST are present only if 
- * some annotation/transformation has been done on the original AST returned
- * by the parser. Cf type_annotater, comment_annotater, cpp_ast_c, etc.
  *)
 
 (* forunparser: *)
@@ -103,12 +88,14 @@ type parse_info =
 
 type info = { 
   pinfo : parse_info;
-  (* this tag can be changed, which is how we can express some program
+
+  (* this cocci_tag can be changed, which is how we can express some program
    * transformations by tagging the tokens involved in this transformation. 
    *)
   cocci_tag: (Ast_cocci.mcodekind * metavars_binding) ref;
   (* set in comment_annotater_c.ml *)
   comments_tag: comments_around ref;
+
   (* todo? token_info : sometimes useful to know what token it was *)
   }
 and il = info list
@@ -119,6 +106,24 @@ and il = info list
 and 'a wrap  = 'a * il
 and 'a wrap2 = 'a * il
 
+(* ------------------------------------------------------------------------- *)
+(* Name *)
+(* ------------------------------------------------------------------------- *)
+
+(* was called 'ident' before, but 'name' is I think better
+ * as concatenated strings can be used not only for identifiers and for 
+ * declarators, but also for fields, for labels, etc.
+ *)
+and name = 
+   | RegularName of string wrap
+   | CppConcatenatedName of (string wrap) wrap2 (* the ## separators *) list
+   (* normally only used inside list of things, as in parameters or arguments
+    * in which case, cf cpp-manual, it has a special meaning *)
+   | CppVariadicName of string wrap (* ## s *)
+   | CppIdentBuilder of string wrap (* s ( ) *) * 
+                       ((string wrap) wrap2 list) (* arguments *)
+
+
 (* ------------------------------------------------------------------------- *)
 (* C Type *)
 (* ------------------------------------------------------------------------- *)
@@ -141,15 +146,13 @@ and 'a wrap2 = 'a * il
  * have an exprStatement and a new (local) struct defined. Same for
  * Constructor.
  * 
- * Some stuff are tagged semantic: which means that they are computed
- * after parsing. 
-*)
+ *)
 
 
 and fullType = typeQualifier * typeC
-and  typeC = typeCbis wrap
+ and typeC = typeCbis wrap
 
-and typeCbis =
+  and typeCbis =
   | BaseType        of baseType
 
   | Pointer         of fullType
@@ -162,13 +165,13 @@ and typeCbis =
   | EnumName        of string
   | StructUnionName of structUnion * string 
 
-  | TypeName   of string * fullType option (* semantic: filled later *)
+  | TypeName   of name * fullType option (* semantic: filled later *)
  
   | ParenType of fullType (* forunparser: *)
 
-  (* gccext: TypeOfType may seems useless; why declare a 
+  (* gccext: TypeOfType below may seems useless; Why declare a 
    *     __typeof__(int) x; ? 
-   * But when used with macro, it allows to fix a problem of C which
+   * When used with macros, it allows to fix a problem of C which
    * is that type declaration can be spread around the ident. Indeed it
    * may be difficult to have a macro such as 
    *    '#define macro(type, ident) type ident;' 
@@ -176,7 +179,8 @@ and typeCbis =
    *     macro(char[256], x), 
    * then it will generate invalid code, but with a 
    *       '#define macro(type, ident) __typeof(type) ident;' 
-   * it will work. *)
+   * it will work. 
+   *)
   | TypeOfExpr of expression  
   | TypeOfType of fullType    
 
@@ -207,7 +211,9 @@ and typeCbis =
         and field = fieldbis wrap 
          and fieldbis = 
            | DeclarationField of field_declaration
-           | EmptyField (* gccext: *)
+           (* gccext: *)
+           | EmptyField 
+
             (* cppext: *)
            | MacroStructDeclTodo
 
@@ -224,15 +230,15 @@ and typeCbis =
            * But it seems that gcc allow char i:4. C rule must say that you
            * can cast into int so enum too, ... 
            *)
-           and fieldkind = fieldkindbis wrap (* s : *)
-            and fieldkindbis = 
-                | Simple   of string option * fullType
-                | BitField of string option * fullType * constExpression
-                 (* fullType => BitFieldInt | BitFieldUnsigned *) 
+           and fieldkind = 
+             | Simple   of name option * fullType
+             | BitField of name option * fullType * 
+                 info (* : *) * constExpression
+              (* fullType => BitFieldInt | BitFieldUnsigned *) 
 
 
      (* -------------------------------------- *)    
-     and enumType = (string * constExpression option) wrap (* s = *
+     and enumType = (name * (info (* = *) * constExpression) option
                     wrap2 (* , *) list 
                    (* => string * int list *)
 
@@ -240,8 +246,12 @@ and typeCbis =
      (* -------------------------------------- *)    
      (* return * (params * has "...") *)
      and functionType = fullType * (parameterType wrap2 list * bool wrap)
-        and parameterType = (bool * string option * fullType) wrap (* reg s *)
-              (* => (bool (register) * fullType) list * bool *)
+        and parameterType = 
+        { p_namei: name option;
+          p_register: bool wrap;
+          p_type: fullType;
+        }
+        (* => (bool (register) * fullType) list * bool *)
 
 
 and typeQualifier = typeQualifierbis wrap 
@@ -265,12 +275,12 @@ and expression = (expressionbis * exp_info ref (* semantic: *)) wrap
 
   (* Ident can be a enumeration constant, a simple variable, a name of a func.
    * With cppext, Ident can also be the name of a macro. Sparse says
-   * "an identifier with a meaning is a symbol".
-   *)
-  | Ident          of string  (* todo? more semantic info such as LocalFunc *)
+   * "an identifier with a meaning is a symbol" *)
+  | Ident          of name (* todo? more semantic info such as LocalFunc *)
+
   | Constant       of constant                                  
   | FunCall        of expression * argument wrap2 (* , *) list
-  (* gccext: x ? /* empty */ : y <=> x ? x : y; *)
+  (* gccext: x ? /* empty */ : y <=> x ? x : y;  hence the 'option' below *)
   | CondExpr       of expression * expression option * expression
 
   (* should be considered as statements, bad C langage *)
@@ -287,8 +297,8 @@ and expression = (expressionbis * exp_info ref (* semantic: *)) wrap
   | ArrayAccess    of expression * expression
 
   (* field ident access *)
-  | RecordAccess   of expression * string 
-  | RecordPtAccess of expression * string 
+  | RecordAccess   of expression * name
+  | RecordPtAccess of expression * name
   (* redundant normally, could replace it by DeRef RecordAcces *)
 
   | SizeOfExpr     of expression                                
@@ -318,7 +328,7 @@ and expression = (expressionbis * exp_info ref (* semantic: *)) wrap
    * OCaml int are 31 bits. So simpler to do string. Same reason to have
    * string instead of int list for the String case.
    * 
-   * note: that -2 is not a constant, it is the unary operator '-'
+   * note: -2 is not a constant, it is the unary operator '-'
    * applied to constant 2. So the string must represent a positive
    * integer only. *)
 
@@ -352,7 +362,6 @@ and expression = (expressionbis * exp_info ref (* semantic: *)) wrap
  and constExpression = expression (* => int *)
 
 
-
 (* ------------------------------------------------------------------------- *)
 (* C statement *)
 (* ------------------------------------------------------------------------- *)
@@ -360,10 +369,12 @@ and expression = (expressionbis * exp_info ref (* semantic: *)) wrap
  * wonderful C langage.
  * 
  * note: I use 'and' for type definition cos gccext allow statement as
- * expression, so need mutual recursive type definition. *)
+ * expression, so need mutual recursive type definition. 
+ * 
+ *)
 
 and statement = statementbis wrap 
-and statementbis = 
+ and statementbis = 
   | Labeled       of labeled
   | Compound      of compound   (* new scope *)
   | ExprStatement of exprStatement
@@ -383,7 +394,7 @@ and statementbis =
   
 
 
-  and labeled = Label   of string * statement
+  and labeled = Label   of name * statement
               | Case    of expression * statement 
               | CaseRange of expression * expression * statement (* gccext: *)
              | Default of statement
@@ -394,12 +405,31 @@ and statementbis =
    * Simplify cocci to just have statement list, by integrating Decl in stmt.
    * 
    * update: now introduce also the _sequencable to allow ifdef in the middle.
+   * Indeed, I now allow ifdefs in the ast but they must be only between
+   * "sequencable" elements. They can be put in a type only if this type
+   * is used in a list, like at the toplevel, used in a 'toplevel list', 
+   * or inside a compound, used in a 'statement list'. I must not allow 
+   * ifdef anywhere. For instance I can not make ifdef a statement 
+   * cos some instruction like If accept only one statement and the
+   * ifdef directive must not take the place of a legitimate instruction.
+   * We had a similar phenomena in SmPL where we have the notion
+   * of statement and sequencable statement too. Once you have 
+   * such a type of sequencable thing, then s/xx list/xx_sequencable list/
+   * and introduce the ifdef.
+   * 
+   * update: those ifdefs are either passed, or present in the AST but in
+   * a flat form. To structure those flat ifdefs you have to run
+   * a transformation that will put in a tree the statements inside
+   * ifdefs branches. Cf cpp_ast_c.ml. This is for instance the difference
+   * between a IfdefStmt (flat) and IfdefStmt2 (tree structured).
+   * 
    *)
   and compound = statement_sequencable list 
 
   (* cppext: easier to put at statement_list level than statement level *)
   and statement_sequencable = 
     | StmtElem of statement
+
     (* cppext: *) 
     | CppDirectiveStmt of cpp_directive
     | IfdefStmt of ifdef_directive 
@@ -425,7 +455,7 @@ and statementbis =
     (* cppext: *)
     | MacroIteration of string * argument wrap2 list * statement
 
-  and jump  = Goto of string
+  and jump  = Goto of name
             | Continue | Break 
             | Return   | ReturnExpr of expression
             | GotoComputed of expression (* gccext: goto *exp ';' *)
@@ -444,7 +474,7 @@ and statementbis =
 (* (string * ...) option cos can have empty declaration or struct tag 
  * declaration.
  *   
- * Before I had Typedef constructor, but why make this special case and not 
+ * Before I had Typedef constructor, but why make this special case and not 
  * have StructDef, EnumDef, ... so that 'struct t {...} v' will generate 2 
  * declarations ? So I try to generalise and not have Typedef either. This
  * requires more work in parsing. Better to separate concern.
@@ -455,15 +485,13 @@ and statementbis =
  * accepts it. 
  *)
 
-and local_decl = LocalDecl | NotLocalDecl
-
 and declaration = 
   | DeclList of onedecl wrap2 (* , *) list wrap (* ; fakestart sto *)
   (* cppext: *)
   | MacroDecl of (string * argument wrap2 list) wrap
 
      and onedecl = 
-       { v_namei: (string * initialiser option) wrap (* s = *) option;
+       { v_namei: (name * (info (* = *) * initialiser) option) option;
          v_type: fullType;
          v_storage: storage;
          v_local: local_decl; (* cocci: *)
@@ -473,6 +501,8 @@ and declaration =
      and storagebis    = NoSto | StoTypedef | Sto of storageClass
      and storageClass  = Auto  | Static | Register | Extern
 
+     and local_decl = LocalDecl | NotLocalDecl
+
      and initialiser = initialiserbis wrap
        and initialiserbis = 
           | InitExpr of expression 
@@ -495,15 +525,17 @@ and declaration =
 (* Normally we should define another type functionType2 because there 
  * are more restrictions on what can define a function than a pointer 
  * function. For instance a function declaration can omit the name of the
- * parameter wheras a function definition can not. But, in some cases such
+ * parameter whereas a function definition can not. But, in some cases such
  * as 'f(void) {', there is no name too, so I simplified and reused the 
  * same functionType type for both declaration and function definition.
- * Also old style C does not have type in the parameter.
+ * 
+ * Also old style C does not have type in the parameter, so again simpler
+ * to abuse the functionType and allow missing type.
  *)
-and definition = definitionbis wrap (* ( ) { } fakestart sto *)
+and definition = definitionbis wrap (* ( ) { } fakestart sto *)
   and definitionbis = 
-  { f_name: string;
-    f_type: functionType;
+  { f_name: name;
+    f_type: functionType; (* todo? a functionType2 ? *)
     f_storage: storage;
     f_body: compound;
     f_attr: attribute list; (* gccext: *)
@@ -515,34 +547,19 @@ and definition = definitionbis wrap (* s ( ) { } fakestart sto *)
 (* cppext: cpp directives, #ifdef, #define and #include body *)
 (* ------------------------------------------------------------------------- *)
 and cpp_directive =
-  | Include of includ 
   | Define of define 
+  | Include of includ 
   | Undef of string wrap
   | PragmaAndCo of il 
+(*| Ifdef ? no, ifdefs are handled differently, cf ifdef_directive below *)
 
-(* to specialize if someone need more info *)
-and ifdef_directive = (* or and 'a ifdefed = 'a list wrap *)
-  | IfdefDirective of (ifdefkind * matching_tag) wrap
-  and ifdefkind = 
-    | Ifdef (* todo? of string ? of formula_cpp *)
-    | IfdefElseif (* same *)
-    | IfdefElse (* same *)
-    | IfdefEndif 
-  (* set in Parsing_hacks.set_ifdef_parenthize_info. It internally use 
-   * a global so it means if you parse same file twice you may get
-   * different id. I try now to avoid this pb by resetting it each 
-   * time I parse a file.
-   *)
-  and matching_tag = 
-    IfdefTag of (int (* tag *) * int (* total with this tag *))
-
-and define = string wrap * define_body   (* #define s *)
- and define_body = define_kind * define_val
+and define = string wrap (* #define s *) * (define_kind * define_val)
    and define_kind =
    | DefineVar
    | DefineFunc   of ((string wrap) wrap2 list) wrap (* () *)
    and define_val = 
-     | DefineExpr of expression (* most common case, to define int constant *)
+     (* most common case; e.g. to define int constant *)
+     | DefineExpr of expression 
 
      | DefineStmt of statement
      | DefineType of fullType
@@ -550,6 +567,7 @@ and define = string wrap * define_body   (* #define s *)
 
      | DefineFunction of definition
      | DefineInit of initialiser (* in practice only { } with possible ',' *)
+
      (* TODO DefineMulti of define_val list *)
 
      | DefineText of string wrap
@@ -590,6 +608,23 @@ and includ =
 
 
 
+(* todo? to specialize if someone need more info *)
+and ifdef_directive = (* or and 'a ifdefed = 'a list wrap *)
+  | IfdefDirective of (ifdefkind * matching_tag) wrap
+  and ifdefkind = 
+    | Ifdef (* todo? of string ? of formula_cpp ? *)
+    | IfdefElseif (* same *)
+    | IfdefElse (* same *)
+    | IfdefEndif 
+  (* set in Parsing_hacks.set_ifdef_parenthize_info. It internally use 
+   * a global so it means if you parse the same file twice you may get
+   * different id. I try now to avoid this pb by resetting it each 
+   * time I parse a file.
+   *)
+  and matching_tag = 
+    IfdefTag of (int (* tag *) * int (* total with this tag *))
+
+
 
 
 
@@ -701,6 +736,7 @@ let noType () = ref (None,NotTest)
 let noInstr = (ExprStatement (None), [])
 let noTypedefDef () = None
 
+
 let emptyMetavarsBinding = 
   ([]: metavars_binding)
 
@@ -854,9 +890,9 @@ let compare_pos ii1 ii2 =
     (Real p1, Real p2) ->
       compare p1.Common.charpos p2.Common.charpos
   | (Virt (p1,_), Real p2) ->
-      if (compare p1.Common.charpos p2.Common.charpos) = (-1) then (-1) else 1
+      if (compare p1.Common.charpos p2.Common.charpos) =|= (-1) then (-1) else 1
   | (Real p1, Virt (p2,_)) ->
-      if (compare p1.Common.charpos p2.Common.charpos) = 1 then 1 else (-1)
+      if (compare p1.Common.charpos p2.Common.charpos) =|= 1 then 1 else (-1)
   | (Virt (p1,o1), Virt (p2,o2)) ->
       let poi1 = p1.Common.charpos in
       let poi2 = p2.Common.charpos in
@@ -881,7 +917,7 @@ let info_to_fixpos ii =
 let is_test (e : expression) =
   let (_,info) = unwrap e in
   let (_,test) = !info in
-  test = Test
+  test =*= Test
 
 (*****************************************************************************)
 (* Abstract line *)
@@ -929,6 +965,46 @@ let real_al_info x =
     comments_tag = ref emptyComments;
   }
 
+let al_comments x =
+  let keep_cpp l =
+    List.filter (function (Token_c.TCommentCpp _,_) -> true | _ -> false) l in
+  let al_com (x,i) =
+    (x,{i with Common.charpos = magic_real_number;
+        Common.line = magic_real_number;
+        Common.column = magic_real_number}) in
+  {mbefore = []; (* duplicates mafter of the previous token *)
+    mafter = List.map al_com (keep_cpp x.mafter)}
+
+let al_info_cpp tokenindex x = 
+  { pinfo =
+    (AbstractLineTok
+       {charpos = tokenindex;
+        line = tokenindex;
+        column = tokenindex;
+        file = "";
+        str = str_of_info x});
+    cocci_tag = ref emptyAnnot;
+    comments_tag = ref (al_comments !(x.comments_tag));
+  }
+
+let semi_al_info_cpp x = 
+  { x with
+    cocci_tag = ref emptyAnnot;
+    comments_tag = ref (al_comments !(x.comments_tag));
+  }
+
+let real_al_info_cpp x = 
+  { pinfo =
+    (AbstractLineTok
+       {charpos = magic_real_number;
+        line = magic_real_number;
+        column = magic_real_number;
+        file = "";
+        str = str_of_info x});
+    cocci_tag = ref emptyAnnot;
+    comments_tag =  ref (al_comments !(x.comments_tag));
+  }
+
 
 (*****************************************************************************)
 (* Views *)
@@ -964,15 +1040,6 @@ let rec (unsplit_comma: ('a, il) either list -> 'a wrap2 list) =
 
 
 
-let split_register_param = fun (hasreg, idb, ii_b_s) -> 
-  match hasreg, idb,  ii_b_s with
-  | false, Some s, [i1] -> Left (s, [], i1)
-  | true, Some s, [i1;i2] -> Left (s, [i1], i2)
-  | _, None, ii -> Right ii
-  | _ -> raise Impossible
-
-
-
 (*****************************************************************************)
 (* Helpers, could also be put in lib_parsing_c.ml instead *)
 (*****************************************************************************)
@@ -1012,20 +1079,48 @@ let s_of_inc_file_bis inc_file =
   | Weird s -> s
 
 let fieldname_of_fieldkind fieldkind = 
-  match unwrap fieldkind with
+  match fieldkind with
   | Simple (sopt, ft) -> sopt
-  | BitField (sopt, ft, expr) -> sopt
+  | BitField (sopt, ft, info, expr) -> sopt
 
 
 let s_of_attr attr = 
   attr
   +> List.map (fun (Attribute s, ii) -> s)
   +> Common.join ","
-  
 
-let type_of_parameter param = 
-  let ((b, sopt, typ), ii) = param in 
-  typ
+let str_of_name ident = 
+  match ident with
+  | RegularName (s,ii) -> s
+  | CppConcatenatedName xs -> 
+      xs +> List.map (fun (x,iiop) -> unwrap x) +> Common.join "##"
+  | CppVariadicName (s, ii) -> "##" ^ s
+  | CppIdentBuilder ((s,iis), xs) -> 
+      s ^ "(" ^ 
+        (xs +> List.map (fun ((x,iix), iicomma) -> x) +> Common.join ",") ^
+        ")"
+
+let info_of_name ident = 
+  match ident with
+  | RegularName (s,ii) -> List.hd ii
+  | CppConcatenatedName xs -> 
+      (match xs with
+      | [] -> raise Impossible
+      | ((x,ii1),ii2)::xs -> 
+          List.hd ii1
+      )
+  | CppVariadicName (s, ii) -> 
+      let (iihash, iis) = Common.tuple_of_list2 ii in 
+      iihash
+  | CppIdentBuilder ((s,iis),xs) -> 
+      List.hd iis
+
+let get_s_and_ii_of_name name = 
+  match name with
+  | RegularName (s, iis) -> s, List.hd iis 
+  | _ -> raise Todo
+
+
 let name_of_parameter param = 
-  let ((b, sopt, typ), ii) = param in 
-  sopt
+  param.p_namei +> Common.map_option (str_of_name)
+
index 7ec3cf2..6bd0826 100644 (file)
@@ -174,10 +174,12 @@ let compute_labels_and_create_them st =
     st +> Visitor_c.vk_statement { Visitor_c.default_visitor_c with 
       Visitor_c.kstatement = (fun (k, bigf) st -> 
         match st with
-        | Labeled (Ast_c.Label (s, _st)),ii -> 
+        | Labeled (Ast_c.Label (name, _st)),ii -> 
             (* at this point I put a lbl_0, but later I will put the
              * good labels. *)
-            let newi = !g +> add_node (Label (st,(s,ii))) lbl_0  (s^":") in
+            let s = Ast_c.str_of_name name in
+            let newi = !g +> add_node (Label (st,name, ((),ii))) lbl_0  (s^":") 
+            in
             begin
               (* the C label already exists ? *)
               if (!h#haskey s) then raise (Error (DuplicatedLabel s));
@@ -342,7 +344,8 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) =
 
 
    (* ------------------------- *)        
-  | Labeled (Ast_c.Label (s, st)), ii -> 
+  | Labeled (Ast_c.Label (name, st)), ii -> 
+      let s = Ast_c.str_of_name name in
       let ilabel = xi.labels_assoc#find s in
       let node = mk_node (unwrap (!g#nodes#find ilabel)) lbl [] (s ^ ":") in
       !g#replace_node (ilabel, node);
@@ -350,9 +353,11 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) =
       aux_statement (Some ilabel, xi_lbl) st
 
 
-  | Jump (Ast_c.Goto s), ii -> 
+  | Jump (Ast_c.Goto name), ii -> 
+      let s = Ast_c.str_of_name name in
      (* special_cfg_ast: *)
-     let newi = !g +> add_node (Goto (stmt, (s,ii))) lbl ("goto " ^ s ^ ":") in
+     let newi = !g +> add_node (Goto (stmt, name, ((),ii))) lbl ("goto "^s^":")
+     in
      !g +> add_arc_opt (starti, newi);
 
      let ilabel = 
@@ -385,16 +390,17 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) =
         | Some e -> 
             let ((unwrap_e, typ), ii) = e in
             (match unwrap_e with
-            | FunCall (((Ident f, _typ), _ii), _args) -> 
-                f ^ "(...)"
-            | Assignment (((Ident var, _typ), _ii), SimpleAssign, e) -> 
-                var ^ " = ... ;"
+            | FunCall (((Ident (namef), _typ), _ii), _args) -> 
+                Ast_c.str_of_name namef ^ "(...)"
+            | Assignment (((Ident (namevar), _typ), _ii), SimpleAssign, e) -> 
+                Ast_c.str_of_name namevar ^ " = ... ;"
             | Assignment 
-                (((RecordAccess (((Ident var, _typ), _ii), field), _typ2), 
+                (((RecordAccess (((Ident (namevar), _typ), _ii), field), _typ2),
                   _ii2),
                  SimpleAssign, 
                  e) -> 
-                   var ^ "." ^ field ^ " = ... ;"
+                let sfield = Ast_c.str_of_name field in
+                Ast_c.str_of_name namevar ^ "." ^ sfield ^ " = ... ;"
                    
             | _ -> "statement"
         )
@@ -812,7 +818,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) =
       let context_info =
        match xi.ctx with
          SwitchInfo (startbrace, loopendi, braces, parent_lbl) -> 
-            if x = Ast_c.Break
+            if x =*= Ast_c.Break
            then xi.ctx
            else
              (try 
@@ -867,7 +873,7 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) =
           None
 
       | SwitchInfo (startbrace, loopendi, braces, parent_lbl) ->
-         assert (x = Ast_c.Break);
+         assert (x =*= Ast_c.Break);
           let difference = List.length xi.braces - List.length braces in
           assert (difference >= 0);
           let toend = take difference xi.braces in
@@ -915,8 +921,8 @@ let rec (aux_statement: (nodei option * xinfo) -> statement -> nodei option) =
      let s = 
        match decl with
        | (Ast_c.DeclList 
-             ([{v_namei = Some ((s, _),_); v_type = typ; v_storage = sto}, _], _)) ->
-          "decl:" ^ s
+             ([{v_namei = Some (name, _); v_type = typ; v_storage = sto}, _], _)) ->
+          "decl:" ^ Ast_c.str_of_name name
        | _ -> "decl_novar_or_multivar"
      in
             
@@ -1006,7 +1012,7 @@ let (aux_definition: nodei -> definition -> unit) = fun topi funcdef ->
 
   let lbl_start = [!counter_for_labels] in
 
-  let ({f_name = funcs; 
+  let ({f_name = namefuncs; 
         f_type = functype; 
         f_storage= sto; 
         f_body= compound;
@@ -1015,8 +1021,8 @@ let (aux_definition: nodei -> definition -> unit) = fun topi funcdef ->
         }, ii) = funcdef in
   let iifunheader, iicompound = 
     (match ii with 
-    | is::ioparen::icparen::iobrace::icbrace::iifake::isto -> 
-        is::ioparen::icparen::iifake::isto,     
+    | ioparen::icparen::iobrace::icbrace::iifake::isto -> 
+        ioparen::icparen::iifake::isto,     
         [iobrace;icbrace]
     | _ -> raise Impossible
     )
@@ -1026,14 +1032,14 @@ let (aux_definition: nodei -> definition -> unit) = fun topi funcdef ->
 
   let headi = !g +> add_node 
     (FunHeader ({ 
-      Ast_c.f_name = funcs;
+      Ast_c.f_name = namefuncs;
       f_type = functype;
       f_storage = sto;
       f_attr = attrs;
       f_body = [] (* empty body *);
       f_old_c_style = oldstyle;
       }, iifunheader))
-    lbl_start ("function " ^ funcs) in
+    lbl_start ("function " ^ Ast_c.str_of_name namefuncs) in
   let enteri     = !g +> add_node Enter     lbl_0 "[enter]"     in
   let exiti      = !g +> add_node Exit      lbl_0 "[exit]"      in
   let errorexiti = !g +> add_node ErrorExit lbl_0 "[errorexit]" in
@@ -1069,8 +1075,9 @@ let (aux_definition: nodei -> definition -> unit) = fun topi funcdef ->
  *)
 let specialdeclmacro_to_stmt (s, args, ii) =
   let (iis, iiopar, iicpar, iiptvirg) = tuple_of_list4 ii in
-  let ident = (Ast_c.Ident s, Ast_c.noType()), [iis] in
-  let f = (Ast_c.FunCall (ident, args), Ast_c.noType()), [iiopar;iicpar] in
+  let ident = Ast_c.RegularName (s, [iis]) in
+  let identfinal = (Ast_c.Ident (ident), Ast_c.noType()), [] in
+  let f = (Ast_c.FunCall (identfinal, args), Ast_c.noType()), [iiopar;iicpar] in
   let stmt = Ast_c.ExprStatement (Some f), [iiptvirg] in
   stmt,  (f, [iiptvirg])
 
@@ -1304,7 +1311,7 @@ let (check_control_flow: cflow -> unit) = fun g ->
         (match unwrap (nodes#find nodei),  startbraces with
         | SeqStart (_,i,_), xs  -> i::xs
         | SeqEnd (i,_), j::xs -> 
-            if i = j 
+            if i =|= j 
             then xs
             else 
               begin 
@@ -1321,7 +1328,7 @@ let (check_control_flow: cflow -> unit) = fun g ->
       in
 
    
-      if children#tolist = [] 
+      if null children#tolist
       then 
         if (* (depth = 0) *) startbraces <> []
         then print_trace_error trace2
index d4fb2a3..2885b56 100644 (file)
@@ -113,12 +113,12 @@ let annotate_program toks asts =
    in
 
   (* merge *)
-   assert(List.length toks_with_after = List.length toks_with_before);
+   assert(List.length toks_with_after =|= List.length toks_with_before);
 
    Common.zip toks_with_before toks_with_after 
    +> List.iter (fun ((t1, before), (t2, after)) -> 
 
-     assert(t1 = t2);
+     assert(t1 =*= t2);
 
      let before' = before +> List.map convert_relevant_tokens in
      let after' = after  +> List.map convert_relevant_tokens in
index 0a5196f..bb5894a 100644 (file)
@@ -211,7 +211,7 @@ let compare_ast filename1 filename2  =
     
         );
         (match () with
-        | _ when !pb_notparsed > 0 && !error = 0 -> 
+        | _ when !pb_notparsed > 0 && !error =|= 0 -> 
             PbOnlyInNotParsedCorrectly ""
         | _ when !error > 0 -> Pb ""
         | _ -> Correct
@@ -281,7 +281,7 @@ let compare_token filename1 filename2 =
     | x::xs, y::ys -> 
         let x' = normal_form_token x in
         let y' = normal_form_token y in
-        if x' = y' 
+        if x' =*= y' 
         then loop xs ys
         else 
           let str1, pos1 = 
@@ -378,4 +378,4 @@ let compare_result_to_string (correct, diffxs) =
 
 
 let compare_result_to_bool correct = 
-  correct = Correct
+  correct =*= Correct
index 77843ae..fafae71 100644 (file)
@@ -82,6 +82,7 @@ open Ast_c
 
 (*****************************************************************************)
 
+type fullstatement = statement 
 
 (* ---------------------------------------------------------------------- *)
 (* The string is for debugging. Used by Ograph_extended.print_graph. 
@@ -227,9 +228,9 @@ type node = node1 * string
   | Break    of statement * unit wrap
 
   (* no counter part in cocci *)
-  | CaseRange of statement * (expression * expression) wrap
-  | Label of statement * string wrap
-  | Goto of statement * string wrap
+  | CaseRange of fullstatement * (expression * expression) wrap
+  | Label of fullstatement * name * unit wrap (* : *)
+  | Goto of fullstatement * name * unit wrap (* goto *)
 
 
   | Asm of statement * asmbody wrap
@@ -356,11 +357,11 @@ let extract_fullstatement node =
   | Return     (st, _)
   | ReturnExpr (st, _)
   (* no counter part in cocci *)
-  | Label (st, _)
+  | Label (st, _, _)
   | Case  (st,_)
   | CaseRange (st, _)
   | Default   (st, _)
-  | Goto (st, _)
+  | Goto (st, _, _)
   | Continue (st, _)
   | Break    (st, _)
   | Asm (st,_)
index 3938bb4..aaa324d 100644 (file)
@@ -64,8 +64,8 @@ type node = node1 * string (* For debugging. Used by print_graph *)
 
   (* no counter part in cocci *)
   | CaseRange of statement * (expression * expression) wrap
-  | Label     of statement * string wrap
-  | Goto      of statement * string wrap
+  | Label     of statement * name * unit wrap
+  | Goto      of statement * name * unit wrap
 
 
   | Asm of statement * asmbody wrap
index ec8d3c7..af246f2 100644 (file)
@@ -301,7 +301,7 @@ let unparse_showing_include_content ?
 let is_ifdef_and_same_tag tag x = 
   match x with
   | IfdefStmt (IfdefDirective ((_, tag2),_)) -> 
-      tag = tag2
+      tag =*= tag2
   | StmtElem _ | CppDirectiveStmt _ -> false
   | IfdefStmt2 _ -> raise Impossible
 
@@ -350,17 +350,16 @@ let group_ifdef tag xs =
 let rec cpp_ifdef_statementize ast = 
   Visitor_c.vk_program_s { Visitor_c.default_visitor_c_s with
     Visitor_c.kstatementseq_list_s = (fun (k, bigf) xs -> 
-      
       let rec aux xs = 
         match xs with
         | [] -> []
-        | stseq::xs -> 
+        | stseq::xs ->
             (match stseq with
             | StmtElem st -> 
                 Visitor_c.vk_statement_sequencable_s bigf stseq::aux xs
             | CppDirectiveStmt directive -> 
                 Visitor_c.vk_statement_sequencable_s bigf stseq::aux xs
-            | IfdefStmt ifdef -> 
+            | IfdefStmt ifdef ->
                 (match ifdef with
                 | IfdefDirective ((Ifdef,tag),ii) -> 
 
@@ -369,10 +368,10 @@ let rec cpp_ifdef_statementize ast =
                     then
                       let res = IfdefStmt2 (ifdef::restifdefs, xxs) in
                       Visitor_c.vk_statement_sequencable_s bigf res::aux xs'
-                    else 
+                    else
                       Visitor_c.vk_statement_sequencable_s bigf stseq::aux xs
                       
-                | IfdefDirective (((IfdefElseif|IfdefElse|IfdefEndif),b),ii) -> 
+                | IfdefDirective (((IfdefElseif|IfdefElse|IfdefEndif),b),ii) ->
                     pr2 "weird: first directive is not a ifdef";
                     (* maybe not weird, just that should_ifdefize 
                      * returned false *)
index 7c4e312..6a18e2e 100644 (file)
@@ -31,6 +31,8 @@ open Ast_c (* to factorise tokens, OpAssign, ... *)
  *   TComment (tokinfo lexbuf +> tok_add_s (comment lexbuf)) 
  * 
  * because of the "wierd" order of evaluation of OCaml.
+ * 
+ * 
  *
  * note: can't use Lexer_parser._lexer_hint here to do different
  * things, because now we call the lexer to get all the tokens
@@ -69,7 +71,7 @@ let tokinfo lexbuf  =
     comments_tag = ref Ast_c.emptyComments;
   }
 
-(* must generate a new ref each time, otherwise share *)
+(* cppext: must generate a new ref each time, otherwise share *)
 let no_ifdef_mark () = ref (None: (int * int) option)
 
 let tok_add_s s ii = Ast_c.rewrap_str ((Ast_c.str_of_info ii) ^ s) ii
@@ -218,6 +220,8 @@ rule token = parse
 
         let info' = info +> tok_add_s com in
         let s = Ast_c.str_of_info info' in
+        (* could be more flexible, use [\t ]* instead of hardcoded 
+         * single space. *)
         match s with
         | "/* {{coccinelle:skip_start}} */" -> 
             TCommentSkipTagStart (info')
@@ -243,7 +247,7 @@ rule token = parse
    *                        |  _       { endline lexbuf} 
    *)
 
-  (* todo?:
+  (* less?:
    *  have found a # #else  in "newfile-2.6.c",  legal ?   and also a  #/* ... 
    *    => just "#" -> token {lexbuf} (that is ignore)
    *  il y'a 1 #elif  sans rien  apres
@@ -268,7 +272,7 @@ rule token = parse
    * http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html
    *)
 
-  | "#" spopt "pragma"  sp [^'\n']*  '\n'
+  | "#" spopt "pragma"  sp  [^'\n']* '\n'
   | "#" spopt "ident"   sp  [^'\n']* '\n' 
   | "#" spopt "line"    sp  [^'\n']* '\n' 
   | "#" spopt "error"   sp  [^'\n']* '\n' 
@@ -457,29 +461,35 @@ rule token = parse
   (* only in cpp directives normally *)
   | "\\" '\n' { TCppEscapedNewline (tokinfo lexbuf) }
 
-
-  | ((id as s)  "...")
-      { TDefParamVariadic (s, tokinfo lexbuf) }
-
-
-  (* could generate separate token for #, ## and then extend grammar,
-   * but there can be ident in many different places, in expression
-   * but also in declaration, in function name. So having 3 tokens
+  (* We must generate separate tokens for #, ## and extend the grammar.
+   * Note there can be "elaborated" idents in many different places, in 
+   * expression but also in declaration, in function name. So having 3 tokens
    * for an ident does not work well with how we add info in
-   * ast_c. So better to generate just one token, for now, just one info,
-   * even if have later to reanalyse those tokens and unsplit.
+   * ast_c. Was easier to generate just one token, just one info,
+   * even if have later to reanalyse those tokens and unsplit. But then,
+   * handling C++ lead to having not just a string for ident but something
+   * more complex. Also when we want to parse elaborated function headers
+   * (e.g. void METH(foo)(int x)), we need anyway to go from a string
+   * to something more. So having also for C something more than just
+   * string for ident is natural.
    * 
    * todo: our heuristics in parsing_hacks rely on TIdent. So maybe
    * an easier solution would be to augment the TIdent type such as 
    *   TIdent of string * info * cpp_ident_additionnal_info
+   * 
+   * old:
+   * |  id   ([' ''\t']* "##" [' ''\t']* id)+ 
+   *   { let info = tokinfo lexbuf in
+   *     TIdent (tok lexbuf, info)
+   *   }
+   * |  "##" spopt id
+   *   { let info = tokinfo lexbuf in
+   *     TIdent (tok lexbuf, info)
+   *   }
+   * 
    *)
-
-
-  (* cppext: string concatenation of idents *)
-  |  id   ([' ''\t']* "##" [' ''\t']* id)+ 
-      { let info = tokinfo lexbuf in
-        TIdent (tok lexbuf, info)
-      }
+  (* cppext: string concatenation of idents, also ##args for variadic macro. *)
+  | "##" { TCppConcatOp (tokinfo lexbuf) }
 
   (* cppext: stringification.
    * bugfix: this case must be after the other cases such as #endif
@@ -489,12 +499,11 @@ rule token = parse
       { let info = tokinfo lexbuf in
         TIdent (tok lexbuf, info)
       }
+  (* the ... next to id, e.g. arg..., works with ##, e.g. ##arg *)
+  | ((id as s)  "...")
+      { TDefParamVariadic (s, tokinfo lexbuf) }
+
 
-  (* cppext: gccext: ##args for variadic macro *)
-  |  "##" spopt id
-      { let info = tokinfo lexbuf in
-        TIdent (tok lexbuf, info)
-      }
 
 
 
index 1d328a8..3b4357b 100644 (file)
@@ -29,7 +29,7 @@ let strip_info_visitor _ =
     (* traversal should be deterministic... *)
     (let ctr = ref 0 in 
     (function (k,_) ->
-    function i -> ctr := !ctr + 1; Ast_c.al_info !ctr i));
+    function i -> ctr := !ctr + 1; Ast_c.al_info_cpp !ctr i));
 
     Visitor_c.kexpr_s = (fun (k,_) e -> 
       let (e', ty),ii' = k e in
@@ -70,7 +70,7 @@ let al_ii    x = Visitor_c.vk_ii_s (strip_info_visitor()) x
 
 let semi_strip_info_visitor = (* keep position information *)
   { Visitor_c.default_visitor_c_s with
-    Visitor_c.kinfo_s = (fun (k,_) i -> Ast_c.semi_al_info i);
+    Visitor_c.kinfo_s = (fun (k,_) i -> Ast_c.semi_al_info_cpp i);
 
     Visitor_c.kexpr_s = (fun (k,_) e -> 
       let (e', ty),ii' = k e in
@@ -87,7 +87,8 @@ let semi_al_param     = Visitor_c.vk_param_s     semi_strip_info_visitor
 let semi_al_params    = Visitor_c.vk_params_s    semi_strip_info_visitor
 let semi_al_arguments = Visitor_c.vk_arguments_s semi_strip_info_visitor
 
-let semi_al_program = List.map (Visitor_c.vk_toplevel_s semi_strip_info_visitor)
+let semi_al_program =
+  List.map (Visitor_c.vk_toplevel_s semi_strip_info_visitor)
 
 
 
@@ -97,7 +98,7 @@ let semi_al_program = List.map (Visitor_c.vk_toplevel_s semi_strip_info_visitor)
 let real_strip_info_visitor _ = 
   { Visitor_c.default_visitor_c_s with
     Visitor_c.kinfo_s = (fun (k,_) i ->
-      Ast_c.real_al_info i
+      Ast_c.real_al_info_cpp i
     );
 
     Visitor_c.kexpr_s = (fun (k,_) e -> 
@@ -164,7 +165,7 @@ let max_min_ii_by_pos xs =
   | [] -> failwith "empty list, max_min_ii_by_pos"
   | [x] -> (x, x)
   | x::xs -> 
-      let pos_leq p1 p2 = (Ast_c.compare_pos p1 p2) = (-1) in
+      let pos_leq p1 p2 = (Ast_c.compare_pos p1 p2) =|= (-1) in
       xs +> List.fold_left (fun (maxii,minii) e -> 
         let maxii' = if pos_leq maxii e then e else maxii in
         let minii' = if pos_leq e minii then e else minii in
index e27a9db..6e0b505 100644 (file)
@@ -55,7 +55,7 @@ let print_bad line_error (start_line, end_line) filelines  =
     for i = start_line to end_line do 
       let line = filelines.(i) in 
 
-      if i = line_error 
+      if i =|= line_error 
       then  pr2 ("BAD:!!!!!" ^ " " ^ line) 
       else  pr2 ("bad:" ^ " " ^      line) 
     done
@@ -87,7 +87,7 @@ let mk_info_item a b =
 
 
 let info_same_line line xs = 
-  xs +> List.filter (fun info -> Ast_c.line_of_info info = line)
+  xs +> List.filter (fun info -> Ast_c.line_of_info info =|= line)
 
 
 (*****************************************************************************)
@@ -182,10 +182,10 @@ let print_commentized xs =
            let s = Str.global_substitute 
                (Str.regexp "\n") (fun s -> "") s 
            in
-           if newline = !line
+           if newline =|= !line
            then prerr_string (s ^ " ")
            else begin
-              if !line = -1 
+              if !line =|= -1 
               then pr2_no_nl "passed:" 
               else pr2_no_nl "\npassed:";
               line := newline;
@@ -397,6 +397,10 @@ type class_token =
   | CReservedKwd (type | decl | qualif | flow | misc | attr)
 *)
 
+let ident_to_typename ident =
+  (Ast_c.nQ, (Ast_c.TypeName  (ident, Ast_c.noTypedefDef()), Ast_c.noii))
+                  
+
 (* parse_typedef_fix4 *)
 let consistency_checking2 xs = 
 
@@ -411,7 +415,8 @@ let consistency_checking2 xs =
 
     Visitor_c.kexpr = (fun (k,bigf) x -> 
       match Ast_c.unwrap_expr x with
-      | Ast_c.Ident s -> 
+      | Ast_c.Ident (id) -> 
+          let s = Ast_c.str_of_name id in
           stat +> 
             Common.hfind_default s v1 +> Common.hfind_default CIdent v2 +> 
             (fun aref -> incr aref)
@@ -420,7 +425,8 @@ let consistency_checking2 xs =
     );
     Visitor_c.ktype = (fun (k,bigf) t -> 
       match Ast_c.unwrap_typeC t with
-      | Ast_c.TypeName (s,_typ) -> 
+      | Ast_c.TypeName (name,_typ) -> 
+          let s = Ast_c.str_of_name name in
           stat +> 
             Common.hfind_default s v1 +> Common.hfind_default CTypedef v2 +> 
             (fun aref -> incr aref)
@@ -442,7 +448,7 @@ let consistency_checking2 xs =
     then begin 
       pr2 ("CONFLICT:" ^ k);
       let sorted = xs +> List.sort (fun (ka,va) (kb,vb) -> 
-        if !va = !vb then
+        if !va =|= !vb then
           (match ka, kb with
           | CTypedef, _ -> 1 (* first is smaller *)
           | _, CTypedef -> -1
@@ -474,11 +480,13 @@ let consistency_checking2 xs =
         match x with
         | Ast_c.DefineExpr e -> 
             (match e with
-            | (Ast_c.Ident s, _), ii when List.mem s !ident_to_type -> 
-                let t = (Ast_c.nQ, 
-                        (Ast_c.TypeName  (s, Ast_c.noTypedefDef()), ii)) in
-
-                Ast_c.DefineType t
+            | (Ast_c.Ident (ident), _), _ii  -> 
+                let s = Ast_c.str_of_name ident in 
+                if List.mem s !ident_to_type
+                then
+                  let t = ident_to_typename ident in
+                  Ast_c.DefineType t
+                else k x
             | _ -> k x
             )
         | _ -> k x
@@ -490,12 +498,15 @@ let consistency_checking2 xs =
             (match e with
             | (Ast_c.ParenExpr e, _), iiparen -> 
                 (match e with
-                | (Ast_c.Ident s, _), ii when List.mem s !ident_to_type -> 
-                    let (i2, i3) = tuple_of_list2 iiparen in
-                    let t = (Ast_c.nQ, 
-                            (Ast_c.TypeName  (s, Ast_c.noTypedefDef()), ii)) in
-                    (Ast_c.SizeOfType t, tref), [i1;i2;i3]
-                      
+                | (Ast_c.Ident (ident), _), _ii  -> 
+
+                    let s = Ast_c.str_of_name ident in 
+                    if List.mem s !ident_to_type
+                    then
+                      let t = ident_to_typename ident in
+                      let (i2, i3) = tuple_of_list2 iiparen in
+                      (Ast_c.SizeOfType t, tref), [i1;i2;i3]
+                    else  k x
                 | _ -> k x
                 )
             | _ -> k x
@@ -583,7 +594,7 @@ and find_next_synchro_orig next already_passed =
       pr2 "ERROR-RECOV: end of file while in recovery mode"; 
       already_passed, []
 
-  | (Parser_c.TCBrace i as v)::xs when TH.col_of_tok v = 0 -> 
+  | (Parser_c.TCBrace i as v)::xs when TH.col_of_tok v =|= 0 -> 
       pr2 ("ERROR-RECOV: found sync '}' at line "^i_to_s (TH.line_of_tok v));
 
       (match xs with
@@ -622,7 +633,7 @@ and find_next_synchro_orig next already_passed =
       | _ -> 
           v::already_passed, xs
       )
-  | v::xs when TH.col_of_tok v = 0 && TH.is_start_of_something v  -> 
+  | v::xs when TH.col_of_tok v =|= 0 && TH.is_start_of_something v  -> 
       pr2 ("ERROR-RECOV: found sync col 0 at line "^ i_to_s(TH.line_of_tok v));
       already_passed, v::xs
         
@@ -849,7 +860,7 @@ let rec lexer_function ~pass tr = fun lexbuf ->
     else begin
       let x = List.hd tr.rest_clean  in
       tr.rest_clean <- List.tl tr.rest_clean;
-      assert (x = v);
+      assert (x =*= v);
       
       (match v with
 
@@ -861,8 +872,8 @@ let rec lexer_function ~pass tr = fun lexbuf ->
        * tr.passed, tr.rest, etc.
        *)
       | Parser_c.TDefine (tok) -> 
-          if not (LP.current_context () = LP.InTopLevel) && 
-            (!Flag_parsing_c.cpp_directive_passing || (pass = 2))
+          if not (LP.current_context () =*= LP.InTopLevel) && 
+            (!Flag_parsing_c.cpp_directive_passing || (pass =|= 2))
           then begin
             incr Stat.nDefinePassing;
             pr2_once ("CPP-DEFINE: inside function, I treat it as comment");
@@ -880,8 +891,8 @@ let rec lexer_function ~pass tr = fun lexbuf ->
           end
             
       | Parser_c.TInclude (includes, filename, inifdef, info) -> 
-          if not (LP.current_context () = LP.InTopLevel)  &&
-            (!Flag_parsing_c.cpp_directive_passing || (pass = 2))
+          if not (LP.current_context () =*= LP.InTopLevel)  &&
+            (!Flag_parsing_c.cpp_directive_passing || (pass =|= 2))
           then begin
             incr Stat.nIncludePassing;
             pr2_once ("CPP-INCLUDE: inside function, I treat it as comment");
@@ -910,7 +921,7 @@ let rec lexer_function ~pass tr = fun lexbuf ->
                 if 
                   LP.is_typedef s && 
                     not (!Flag_parsing_c.disable_add_typedef) &&
-                    pass = 1
+                    pass =|= 1
                 then Parser_c.TypedefIdent (s, ii)
                 else Parser_c.TIdent (s, ii)
             | x -> x
@@ -961,7 +972,7 @@ let get_one_elem ~pass tr (file, filelines) =
         Left (Parser_c.celem (lexer_function ~pass tr) lexbuf_fake)
       )
     with e -> begin
-      if (pass = 1 && !Flag_parsing_c.disable_two_pass)|| (pass = 2) 
+      if (pass =|= 1 && !Flag_parsing_c.disable_two_pass)|| (pass =|= 2) 
       then begin 
         (match e with
         (* Lexical is not anymore launched I think *)
@@ -1097,7 +1108,8 @@ let parse_print_error_heuristic2 file =
           then ()
           else 
             (* bugfix: *)
-            if (checkpoint_file = checkpoint2_file) && checkpoint_file = file
+            if (checkpoint_file =$= checkpoint2_file) && 
+                checkpoint_file =$= file
             then print_bad line_error (checkpoint, checkpoint2) filelines
             else pr2 "PB: bad: but on tokens not from original file"
           );
@@ -1106,7 +1118,7 @@ let parse_print_error_heuristic2 file =
     
 
     let diffline = 
-      if (checkpoint_file = checkpoint2_file) && (checkpoint_file = file)
+      if (checkpoint_file =$= checkpoint2_file) && (checkpoint_file =$= file)
       then (checkpoint2 - checkpoint) 
       else 0
         (* TODO? so if error come in middle of something ? where the
index f6f91d5..e01b51f 100644 (file)
@@ -1,7 +1,7 @@
 %{
 (* Yoann Padioleau
  * 
- * Copyright (C) 2002, 2006, 2007, 2008 Yoann Padioleau
+ * Copyright (C) 2002, 2006, 2007, 2008, 2009 Yoann Padioleau
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License (GPL)
@@ -67,7 +67,7 @@ let fake_pi = Common.fake_parse_info
 let addStorageD  = function 
   | ((x,ii), ({storageD = (NoSto,[])} as v)) -> { v with storageD = (x, [ii]) }
   | ((x,ii), ({storageD = (y, ii2)} as v)) ->  
-      if x = y then warning "duplicate storage classes" v
+      if x =*= y then warning "duplicate storage classes" v
       else raise (Semantic ("multiple storage classes", fake_pi))
 
 let addInlineD  = function 
@@ -215,17 +215,18 @@ let (fixOldCDecl: fullType -> fullType) = fun ty ->
        * definition), then you must write a name within the declarator.
        * Otherwise, you can omit the name. *)
       (match params with
-      | [((reg, None, ((_qua, (BaseType Void,_)))),_), _] ->  
+      | [{p_namei = None; p_type = ((_qua, (BaseType Void,_)))},_] ->  
           ty
       | params -> 
-          (params +> List.iter (function 
-          | (((b, None, _),  ii1),ii2) -> 
+          (params +> List.iter (fun (param,_) ->
+            match param with
+            | {p_namei = None} -> 
               (* if majuscule, then certainly macro-parameter *)
               pr2 ("SEMANTIC:parameter name omitted, but I continue"); 
-         | _ -> ()
-          );
+           | _ -> ()
+          ));
            ty)
-      )
+      
         (* todo? can we declare prototype in the decl or structdef,
            ... => length <> but good kan meme *)
   | _ -> 
@@ -237,7 +238,7 @@ let fixFunc (typ, compound, old_style_opt) =
   let (cp,iicp) = compound in
 
   match typ with
-  | ((s,iis)
+  | (name
     (nQ, (FunctionType (fullt, (params,bool)),iifunc)), 
     (st,iist),
     attrs)
@@ -245,10 +246,10 @@ let fixFunc (typ, compound, old_style_opt) =
       let iistart = Ast_c.fakeInfo () in
       assert (nQ =*= nullQualif);
       (match params with
-      | [((reg, None, ((_qua, (BaseType Void,_)))),_), _] ->  ()
+      | [{p_namei= None; p_type =((_qua, (BaseType Void,_)))}, _] ->  ()
       | params -> 
           params +> List.iter (function 
-          | (((bool, Some s, fullt), _), _) -> ()
+          | ({p_namei = Some s}, _) -> ()
          | _ -> ()
                 (* failwith "internal errror: fixOldCDecl not good" *)
           )
@@ -270,22 +271,23 @@ let fixFunc (typ, compound, old_style_opt) =
        *)
       (match Ast_c.unwrap_typeC fullt with 
       | FunctionType _ -> 
+          let s = Ast_c.str_of_name name in
+          let iis = Ast_c.info_of_name name in
           pr2 (spf "WEIRD: %s declared as function returning a function." s);
           pr2 (spf "This is probably because of a macro. Extend standard.h");
           raise (Semantic (spf "error: %s " s, Ast_c.parse_info_of_info iis))
       | _ -> ()
       );
 
-
       (* it must be nullQualif,cos parser construct only this*)
-      {f_name = s;
+      {f_name = name;
        f_type = (fullt, (params, bool));
        f_storage = st;
        f_body = cp;
        f_attr = attrs;
        f_old_c_style = old_style_opt;
       }, 
-      ([iis]++iifunc++iicp++[iistart]++iist) 
+      (iifunc++iicp++[iistart]++iist) 
   | _ -> 
       raise 
         (Semantic 
@@ -310,15 +312,16 @@ let fix_add_params_ident = function
   | ((s, (nQ, (FunctionType (fullt, (params, bool)),_)), st, _attrs)) ->  
 
       (match params with
-      | [((reg, None, ((_qua, (BaseType Void,_)))),_), _] ->  ()
+      | [{p_namei=None; p_type=((_qua, (BaseType Void,_)))}, _] ->  ()
       | params -> 
-        params +> List.iter (function 
-         | (((bool, Some s, fullt), _), _) -> 
-            LP.add_ident s
-        | _ -> 
-             ()
-             (* failwith "internal errror: fixOldCDecl not good" *)
-      )) 
+          params +> List.iter (function 
+          | ({p_namei= Some name}, _) -> 
+              LP.add_ident (Ast_c.str_of_name s)
+         | _ -> 
+              ()
+                (* failwith "internal errror: fixOldCDecl not good" *)
+          )
+      ) 
   | _ -> ()
 
 
@@ -328,6 +331,8 @@ let fix_add_params_ident = function
 (*-------------------------------------------------------------------------- *)
 
 let mk_e e ii = ((e, Ast_c.noType()), ii)
+
+let mk_string_wrap (s,info) = (s, [info])
     
 %}
 
@@ -423,6 +428,8 @@ let mk_e e ii = ((e, Ast_c.noType()), ii)
 /*(* disappear after fix_tokens_define *)*/
 %token <Ast_c.info> TCppEscapedNewline 
 
+%token <Ast_c.info> TCppConcatOp
+
 /*(* appear    after fix_tokens_define *)*/
 %token <Ast_c.info> TOParDefine        
 %token <Ast_c.info> TOBraceDefineInit
@@ -471,6 +478,7 @@ let mk_e e ii = ((e, Ast_c.noType()), ii)
 
 %token <(string * Ast_c.info)>            TMacroAttr
 %token <(string * Ast_c.info)>            TMacroStmt
+%token <(string * Ast_c.info)> TMacroIdentBuilder
 /*(* no need value for the moment *)*/
 %token <(string * Ast_c.info)>            TMacroString 
 %token <(string * Ast_c.info)> TMacroDecl
@@ -591,6 +599,33 @@ ident:
 identifier:
  | TIdent       { $1 }
 
+/*
+(* cppext: string concatenation of idents 
+ * also cppext: gccext: ##args for variadic macro
+ *)
+*/
+ident_cpp:
+ | TIdent       
+     { RegularName (mk_string_wrap $1) }
+ | TIdent TCppConcatOp identifier_cpp_list 
+     {  
+       CppConcatenatedName (
+         match $3 with
+         | [] -> raise Impossible
+         | (x,concatnull)::xs -> 
+             assert(null concatnull);
+             (mk_string_wrap $1, [])::(x,[$2])::xs
+       )
+   }
+ | TCppConcatOp TIdent 
+     { CppVariadicName (fst $2, [$1; snd $2]) }
+ | TMacroIdentBuilder TOPar param_define_list TCPar
+     { CppIdentBuilder ((fst $1, [snd $1;$2;$4]), $3) } 
+
+identifier_cpp_list:
+ | TIdent { [mk_string_wrap $1, []] } 
+ | identifier_cpp_list TCppConcatOp TIdent { $1 ++ [mk_string_wrap $3, [$2]] }
+
 /*(*************************************************************************)*/
 /*(* expr *)*/
 /*(*************************************************************************)*/
@@ -672,8 +707,8 @@ postfix_expr:
  | postfix_expr TOPar argument_list_ne TCPar  
      { mk_e(FunCall ($1, $3)) [$2;$4] }
  | postfix_expr TOPar  TCPar  { mk_e(FunCall ($1, [])) [$2;$3] }
- | postfix_expr TDot   ident  { mk_e(RecordAccess   ($1,fst $3)) [$2;snd $3] }
- | postfix_expr TPtrOp ident  { mk_e(RecordPtAccess ($1,fst $3)) [$2;snd $3] }
+ | postfix_expr TDot   ident_cpp { mk_e(RecordAccess   ($1,$3)) [$2] }
+ | postfix_expr TPtrOp ident_cpp { mk_e(RecordPtAccess ($1,$3)) [$2] }
  | postfix_expr TInc          { mk_e(Postfix ($1, Inc)) [$2] }
  | postfix_expr TDec          { mk_e(Postfix ($1, Dec)) [$2] }
 
@@ -684,7 +719,7 @@ postfix_expr:
      { mk_e(Constructor ($2, List.rev $5)) ([$1;$3;$4;$7] ++ $6) }
 
 primary_expr:
- | identifier  { mk_e(Ident  (fst $1)) [snd $1] }
+ | ident_cpp  { mk_e(Ident  ($1)) [] }
  | TInt    { mk_e(Constant (Int    (fst $1))) [snd $1] }
  | TFloat  { mk_e(Constant (Float  (fst $1))) [snd $1] }
  | TString { mk_e(Constant (String (fst $1))) [snd $1] }
@@ -774,7 +809,7 @@ statement:
    * a Case  (1, (Case (2, i++)))  :(  
    *)*/
 labeled: 
- | ident            TDotDot statement   { Label (fst $1, $3),  [snd $1; $2] }
+ | ident_cpp        TDotDot statement   { Label ($1, $3),  [$2] }
  | Tcase const_expr TDotDot statement   { Case ($2, $4),       [$1; $3] }
  | Tcase const_expr TEllipsis const_expr TDotDot statement 
      { CaseRange ($2, $4, $6), [$1;$3;$5] } /*(* gccext: allow range *)*/
@@ -787,8 +822,8 @@ end_labeled:
     * update: julia fixed the problem by introducing end_labeled 
     * and modifying below stat_or_decl_list
     *)*/
- | ident            TDotDot 
-     { Label (fst $1, (ExprStatement None, [])), [snd $1; $2] }
+ | ident_cpp            TDotDot 
+     { Label ($1, (ExprStatement None, [])), [$2] }
  | Tcase const_expr TDotDot { Case ($2, (ExprStatement None, [])), [$1;$3] }   
  | Tdefault         TDotDot { Default (ExprStatement None, []),    [$1; $2] }  
 
@@ -861,7 +896,7 @@ iteration:
  | Tfor TOPar decl expr_statement expr_opt TCPar statement
      { 
        (* pr2 "DECL in for"; *)
-       MacroIteration ("toto", [], $7),[] (* TODOfake ast, TODO need decl2 ? *)
+       MacroIteration ("toto", [], $7),[$1;$2;$6] (* TODOfake ast, TODO need decl2 ? *)
      }
  /*(* cppext: *)*/
  | TMacroIterator TOPar argument_list_ne TCPar statement
@@ -871,7 +906,7 @@ iteration:
 
 /*(* the ';' in the caller grammar rule will be appended to the infos *)*/
 jump: 
- | Tgoto ident  { Goto (fst $2),  [$1;snd $2] } 
+ | Tgoto ident_cpp  { Goto ($2),  [$1] } 
  | Tcontinue    { Continue,       [$1] }
  | Tbreak       { Break,          [$1] }
  | Treturn      { Return,         [$1] } 
@@ -941,7 +976,9 @@ type_spec2:
   * parse_typedef_fix4: try also to do now some consistency checking in
   * Parse_c
   *)*/                            
- | TypedefIdent   { Right3 (TypeName (fst $1,Ast_c.noTypedefDef())), [snd $1]}
+ | TypedefIdent   
+     { let name = RegularName (mk_string_wrap $1) in
+       Right3 (TypeName (name, Ast_c.noTypedefDef())),[] }
 
  | Ttypeof TOPar assign_expr TCPar { Right3 (TypeOfExpr ($3)), [$1;$2;$4] }
  | Ttypeof TOPar type_name   TCPar { Right3 (TypeOfType ($3)), [$1;$2;$4] }
@@ -1006,7 +1043,7 @@ pointer:
 
 
 direct_d: 
- | identifier
+ | ident_cpp
      { ($1, fun x -> x) }
  | TOPar declarator TCPar      /*(* forunparser: old: $2 *)*/ 
      { (fst $2, fun x -> (nQ, (ParenType ((snd $2) x), [$1;$3]))) }
@@ -1076,18 +1113,26 @@ parameter_type_list:
 
 parameter_decl2: 
  | decl_spec declaratorp
-     { let ((returnType,hasreg),iihasreg) = fixDeclSpecForParam $1 
-       in 
-       (hasreg, Some (fst (fst $2)), ((snd $2) returnType)),    
-        (iihasreg ++ [snd (fst $2)]) 
+     { let ((returnType,hasreg),iihasreg) = fixDeclSpecForParam $1 in
+       let (name, ftyp) = $2 in
+       { p_namei = Some (name);
+         p_type = ftyp returnType;
+         p_register = (hasreg, iihasreg);
+       }
      }
  | decl_spec abstract_declaratorp
-     { let ((returnType,hasreg), iihasreg) = fixDeclSpecForParam $1 
-       in (hasreg, None, ($2 returnType)),      (iihasreg ++ []) 
+     { let ((returnType,hasreg), iihasreg) = fixDeclSpecForParam $1 in 
+       { p_namei = None;
+         p_type = $2 returnType;
+         p_register = hasreg, iihasreg;
+       } 
      }
  | decl_spec
-     { let ((returnType,hasreg), iihasreg) = fixDeclSpecForParam $1 
-       in (hasreg, None, returnType),           (iihasreg ++ []) 
+     { let ((returnType,hasreg), iihasreg) = fixDeclSpecForParam $1 in
+       { p_namei = None;
+         p_type = returnType;
+         p_register = hasreg, iihasreg;
+       }
      }
 
 
@@ -1098,10 +1143,10 @@ parameter_decl2:
 parameter_decl: parameter_decl2 { et "param" ();  $1 }
 
 declaratorp: 
- | declarator  { LP.add_ident (fst (fst $1)); $1 }
+ | declarator  { LP.add_ident (str_of_name (fst $1)); $1 }
  /*(* gccext: *)*/
- | attributes declarator   { LP.add_ident (fst (fst $2)); $2 }
- | declarator attributes   { LP.add_ident (fst (fst $1)); $1 }
+ | attributes declarator   { LP.add_ident (str_of_name (fst $2)); $2 }
+ | declarator attributes   { LP.add_ident (str_of_name (fst $1)); $1 }
 
 abstract_declaratorp:
  | abstract_declarator { $1 }
@@ -1171,15 +1216,16 @@ decl2:
        let (returnType,storage) = fixDeclSpecForDecl $1 in
        let iistart = Ast_c.fakeInfo () in
        DeclList (
-         ($2 +> List.map (fun (((((s,iis),f),attrs), ini), iivirg) -> 
-           let ini, iini = 
+         ($2 +> List.map (fun ((((name,f),attrs), ini), iivirg) -> 
+           let s = str_of_name name in
+           let iniopt = 
              match ini with
-             | None -> None, []
-             | Some (ini, iini) -> Some ini, [iini]
+             | None -> None
+             | Some (ini, iini) -> Some (iini, ini)
            in
-          if fst (unwrap storage) = StoTypedef 
+          if fst (unwrap storage) =*= StoTypedef 
           then LP.add_typedef s;
-           {v_namei = Some ((s, ini), iis::iini);
+           {v_namei = Some (name, iniopt);
             v_type = f returnType;
             v_storage = unwrap storage;
             v_local = local;
@@ -1261,12 +1307,12 @@ init_declarator: init_declarator2  { dt "init" (); $1 }
 /*(*----------------------------*)*/
 
 declaratori: 
- | declarator              { LP.add_ident (fst (fst $1)); $1, Ast_c.noattr }
+ | declarator              { LP.add_ident (str_of_name (fst $1)); $1, Ast_c.noattr }
  /*(* gccext: *)*/
- | declarator gcc_asm_decl { LP.add_ident (fst (fst $1)); $1, Ast_c.noattr }
+ | declarator gcc_asm_decl { LP.add_ident (str_of_name (fst $1)); $1, Ast_c.noattr }
  /*(* gccext: *)*/
- | attributes declarator   { LP.add_ident (fst (fst $2)); $2, $1 }
- | declarator attributes   { LP.add_ident (fst (fst $1)); $1, Ast_c.noattr (* TODO *) }
+ | attributes declarator   { LP.add_ident (str_of_name (fst $2)); $2, $1 }
+ | declarator attributes   { LP.add_ident (str_of_name (fst $1)); $1, Ast_c.noattr (* TODO *) }
 
 
 
@@ -1400,7 +1446,7 @@ field_declaration:
        if fst (unwrap storage) <> NoSto 
        then internal_error "parsing dont allow this";
        
-       FieldDeclList ([(Simple (None, returnType), []) , []], [$2])
+       FieldDeclList ([(Simple (None, returnType)) , []], [$2])
      }
 
 
@@ -1409,15 +1455,11 @@ field_declaration:
 
 struct_declarator: 
  | declaratorsd                    
-     { (fun x -> Simple   (Some (fst (fst $1)), (snd $1) x), [snd (fst $1)]) }
+     { (fun x -> Simple   (Some (fst $1), (snd $1) x)) }
  | dotdot const_expr2            
-     { (fun x -> BitField (None, x, $2),              [$1]) }
+     { (fun x -> BitField (None, x, $1, $2)) }
  | declaratorsd dotdot const_expr2 
-     { (fun x -> BitField (Some (fst(fst $1)),
-                          ((snd $1) x), 
-                          $3),
-                          [snd (fst $1);$2]) 
-     }
+     { (fun x -> BitField (Some (fst $1), ((snd $1) x), $2, $3)) }
 
 
 /*(*----------------------------*)*/
@@ -1456,16 +1498,15 @@ enum_spec:
      { EnumName (fst $2),       [$1; snd $2] }
 
 enumerator: 
- | idente                 { (fst $1, None),      [snd $1]    }
- | idente  TEq const_expr { (fst $1, Some $3),   [snd $1; $2] }
-
+ | idente                 { $1, None     }
+ | idente  TEq const_expr { $1, Some ($2, $3) }
 
 
 /*(*----------------------------*)*/
 /*(* workarounds *)*/
 /*(*----------------------------*)*/
 
-idente: ident { LP.add_ident (fst $1); $1 }
+idente: ident_cpp { LP.add_ident (str_of_name $1); $1 }
 
 
 
@@ -1551,9 +1592,13 @@ cpp_directive:
            (DefineFunc ($4, [$3;$5]), $6)) 
      }
 
- | TUndef { Undef (fst $1, [snd $1]) }
+ | TUndef             { Undef (fst $1, [snd $1]) }
  | TCppDirectiveOther { PragmaAndCo ([$1]) }
 
+
+
+
+
 /*(* perhaps better to use assign_expr ? but in that case need 
    * do a assign_expr_of_string in parse_c
    *)*/
@@ -1598,10 +1643,12 @@ define_val:
  | /*(* empty *)*/ { DefineEmpty }
 
 
+
+
 param_define:
- | TIdent               { fst $1, [snd $1] } 
- | TypedefIdent         { fst $1, [snd $1] } 
- | TDefParamVariadic    { fst $1, [snd $1] } 
+ | TIdent               { mk_string_wrap $1 } 
+ | TypedefIdent         { mk_string_wrap $1 } 
+ | TDefParamVariadic    { mk_string_wrap $1 } 
  | TEllipsis            { "...", [$1] }
  /*(* they reuse keywords :(  *)*/
  | Tregister            { "register", [$1] }
index 4468f7a..866463b 100644 (file)
@@ -280,6 +280,7 @@ type define_def = string * define_param * define_body
      | HintMacroString
      | HintMacroStatement
      | HintAttribute
+     | HintMacroIdentBuilder
 
 
 (* cf also data/test.h *)
@@ -289,6 +290,8 @@ let assoc_hint_string = [
   "YACFE_STRING"     , HintMacroString;
   "YACFE_STATEMENT"  , HintMacroStatement;
   "YACFE_ATTRIBUTE"  , HintAttribute;
+  "YACFE_IDENT_BUILDER"  , HintMacroIdentBuilder;
+
   "MACROSTATEMENT"   , HintMacroStatement; (* backward compatibility *)
 ]
 
@@ -313,6 +316,8 @@ let (token_from_parsinghack_hint:
        Parser_c.TMacroStmt (s, ii)
    | HintAttribute -> 
        Parser_c.TMacroAttr (s, ii)
+   | HintMacroIdentBuilder -> 
+       Parser_c.TMacroIdentBuilder (s, ii)
   
 
 
@@ -438,7 +443,7 @@ and mk_parameters extras acc_before_sep  xs =
   | x::xs -> 
       (match x.tok with 
       (* synchro *)
-      | TOBrace _ when x.col = 0 -> 
+      | TOBrace _ when x.col =|= 0 -> 
           pr2 "PB: found synchro point } in paren";
           [List.rev acc_before_sep], List.rev (extras), (x::xs)
 
@@ -517,7 +522,7 @@ let rec mk_ifdef xs =
           
       | _ -> 
           (* todo? can have some Ifdef in the line ? *)
-          let line, xs = Common.span (fun y -> y.line = x.line) (x::xs) in
+          let line, xs = Common.span (fun y -> y.line =|= x.line) (x::xs) in
           NotIfdefLine line::mk_ifdef xs 
       )
 
@@ -562,7 +567,7 @@ and mk_ifdef_parameters extras acc_before_sep xs =
           let body, extras, xs = mk_ifdef_parameters (x::extras) [] xs in
           (List.rev acc_before_sep)::body, extras, xs 
       | _ -> 
-          let line, xs = Common.span (fun y -> y.line = x.line) (x::xs) in
+          let line, xs = Common.span (fun y -> y.line =|= x.line) (x::xs) in
           mk_ifdef_parameters extras (NotIfdefLine line::acc_before_sep) xs
       )
 
@@ -584,7 +589,7 @@ let rec span_line_paren line = function
       | PToken tok when TH.is_eof tok.tok -> 
           [], x::xs
       | _ -> 
-        if line_of_paren x = line 
+        if line_of_paren x =|= line 
         then
           let (l1, l2) = span_line_paren line xs in
           (x::l1, l2)
@@ -623,7 +628,7 @@ let rec mk_body_function_grouped xs =
           )
           
       | _ -> 
-          let line, xs = Common.span (fun y -> y.line = x.line) (x::xs) in
+          let line, xs = Common.span (fun y -> y.line =|= x.line) (x::xs) in
           NotBodyLine line::mk_body_function_grouped xs 
       )
 
@@ -719,7 +724,7 @@ let rec set_in_function_tag xs =
   | [] -> ()
   (* ) { and the closing } is in column zero, then certainly a function *)
   | BToken ({tok = TCPar _ })::(Braceised (body, tok1, Some tok2))::xs 
-      when tok1.col <> 0 && tok2.col = 0 -> 
+      when tok1.col <> 0 && tok2.col =|= 0 -> 
       body +> List.iter (iter_token_brace (fun tok -> 
         tok.where <- InFunction
       ));
@@ -728,7 +733,7 @@ let rec set_in_function_tag xs =
   | (BToken x)::xs -> set_in_function_tag xs
 
   | (Braceised (body, tok1, Some tok2))::xs 
-      when tok1.col = 0 && tok2.col = 0 -> 
+      when tok1.col =|= 0 && tok2.col =|= 0 -> 
       body +> List.iter (iter_token_brace (fun tok -> 
         tok.where <- InFunction
       ));
@@ -1002,7 +1007,7 @@ let rec find_ifdef_mid xs =
             let counts = xxs +> List.map count_open_close_stuff_ifdef_clause in
             let cnt1, cnt2 = List.hd counts in 
             if cnt1 <> 0 || cnt2 <> 0 && 
-               counts +> List.for_all (fun x -> x = (cnt1, cnt2))
+               counts +> List.for_all (fun x -> x =*= (cnt1, cnt2))
               (*
                 if counts +> List.exists (fun (cnt1, cnt2) -> 
                 cnt1 <> 0 || cnt2 <> 0 
@@ -1567,13 +1572,13 @@ let rec find_macro_lineparen xs =
           Parenthised (xxs,info_parens);
         ] as _line1
         ))
-    ::xs when col1 = 0
+    ::xs when col1 =|= 0
     -> 
       let condition = 
         (* to reduce number of false positive *)
         (match xs with
         | (Line (PToken ({col = col2 } as other)::restline2))::_ -> 
-            TH.is_eof other.tok || (col2 = 0 &&
+            TH.is_eof other.tok || (col2 =|= 0 &&
              (match other.tok with
              | TOBrace _ -> false (* otherwise would match funcdecl *)
              | TCBrace _ when ctx <> InFunction -> false
@@ -1620,7 +1625,7 @@ let rec find_macro_lineparen xs =
     (* when s ==~ regexp_macro *)
     -> 
       let condition = 
-        (col1 = col2 && 
+        (col1 =|= col2 && 
             (match other.tok with
             | TOBrace _ -> false (* otherwise would match funcdecl *)
             | TCBrace _ when ctx <> InFunction -> false
@@ -1635,7 +1640,7 @@ let rec find_macro_lineparen xs =
         || 
         (col2 <= col1 &&
               (match other.tok, restline2 with
-              | TCBrace _, _ when ctx = InFunction -> true
+              | TCBrace _, _ when ctx =*= InFunction -> true
               | Treturn _, _ -> true
               | Tif _, _ -> true
               | Telse _, _ -> true
@@ -1653,7 +1658,7 @@ let rec find_macro_lineparen xs =
       
       if condition
       then 
-        if col1 = 0 then ()
+        if col1 =|= 0 then ()
         else begin
           msg_macro_noptvirg s;
           macro.tok <- TMacroStmt (s, TH.info_of_tok macro.tok);
@@ -1681,7 +1686,7 @@ let rec find_macro_lineparen xs =
     (* when s ==~ regexp_macro *)
       
       let condition = 
-        (col1 = col2 && 
+        (col1 =|= col2 && 
             col1 <> 0 && (* otherwise can match typedef of fundecl*)
             (match other.tok with
             | TPtVirg _ -> false 
@@ -1693,7 +1698,7 @@ let rec find_macro_lineparen xs =
             )) ||
           (col2 <= col1 &&
               (match other.tok with
-              | TCBrace _ when ctx = InFunction -> true
+              | TCBrace _ when ctx =*= InFunction -> true
               | Treturn _ -> true
               | Tif _ -> true
               | Telse _ -> true
@@ -2034,7 +2039,7 @@ and define_line_2 acc line lastinfo xs =
          let acc = (TCommentSpace ii) :: acc in
           define_line_2 acc (line+1) info xs
       | x -> 
-          if line' = line
+          if line' =|= line
           then define_line_2 (x::acc) line info xs 
           else define_line_1 (mark_end_define lastinfo::acc) (x::xs)
       )
@@ -2179,7 +2184,7 @@ let lookahead2 ~pass next before =
   (* typedef inference, parse_typedef_fix3 *)
   (*-------------------------------------------------------------*)
   (* xx xx *)
-  | (TIdent(s,i1)::TIdent(s2,i2)::_ , _) when not_struct_enum before && s = s2
+  | (TIdent(s,i1)::TIdent(s2,i2)::_ , _) when not_struct_enum before && s =$= s2
       && ok_typedef s
       (* (take_safe 1 !passed_tok <> [TOPar]) ->  *)
     -> 
@@ -2218,7 +2223,7 @@ let lookahead2 ~pass next before =
 
   (* [,(] xx [,)] AND param decl *)
   | (TIdent (s, i1)::(TComma _|TCPar _)::_ , (TComma _ |TOPar _)::_ )
-    when not_struct_enum before && (LP.current_context() = LP.InParameter)
+    when not_struct_enum before && (LP.current_context() =*= LP.InParameter)
       && ok_typedef s
       -> 
       msg_typedef s; LP.add_typedef_root s;
@@ -2297,7 +2302,7 @@ let lookahead2 ~pass next before =
 
   (* [(,] xx [   AND parameterdeclaration *)
   | (TIdent (s, i1)::TOCro _::_, (TComma _ |TOPar _)::_)
-      when (LP.current_context() = LP.InParameter)
+      when (LP.current_context() =*= LP.InParameter)
       && ok_typedef s
      -> 
       msg_typedef s; LP.add_typedef_root s;
@@ -2321,7 +2326,7 @@ let lookahead2 ~pass next before =
 
   (*  xx * yy,      AND  in paramdecl *)
   | (TIdent (s, i1)::TMul _::TIdent (s2, i2)::TComma _::_ , _)
-    when not_struct_enum before && (LP.current_context() = LP.InParameter)
+    when not_struct_enum before && (LP.current_context() =*= LP.InParameter)
       && ok_typedef s 
       -> 
 
@@ -2340,7 +2345,7 @@ let lookahead2 ~pass next before =
 
   (*  xx * yy ,     AND in Toplevel  *)
   | (TIdent (s, i1)::TMul _::TIdent (s2, i2)::TComma _::_ , _)
-    when not_struct_enum before && (LP.current_context () = LP.InTopLevel)
+    when not_struct_enum before && (LP.current_context () =*= LP.InTopLevel)
       && ok_typedef s 
       -> 
 
@@ -2400,7 +2405,7 @@ let lookahead2 ~pass next before =
 
   (*  xx * yy)      AND in paramdecl *)
   | (TIdent (s, i1)::TMul _::TIdent (s2, i2)::TCPar _::_ , _)
-      when not_struct_enum before && (LP.current_context () = LP.InParameter)
+      when not_struct_enum before && (LP.current_context () =*= LP.InParameter)
       && ok_typedef s 
         ->
       msg_typedef s; LP.add_typedef_root s;
@@ -2475,7 +2480,7 @@ let lookahead2 ~pass next before =
   | (TIdent (s, i1)::TCPar i2::(TIdent (_,i3)|TInt (_,i3))::_ , 
     (TOPar info)::x::_)  
     when not (TH.is_stuff_taking_parenthized x) &&
-      Ast_c.line_of_info i2 = Ast_c.line_of_info i3
+      Ast_c.line_of_info i2 =|= Ast_c.line_of_info i3
       && ok_typedef s 
       -> 
 
@@ -2565,10 +2570,10 @@ let lookahead2 ~pass next before =
       *)
       (* not !LP._lexer_hint.toplevel *)
       if !Flag_parsing_c.ifdef_directive_passing
-        || (pass = 2)
+        || (pass =|= 2)
       then begin
         
-        if (LP.current_context () = LP.InInitializer)
+        if (LP.current_context () =*= LP.InInitializer)
         then begin 
           pr2_cpp "In Initializer passing"; (* cheat: dont count in stat *)
           incr Stat.nIfdefInitializer;
@@ -2582,7 +2587,7 @@ let lookahead2 ~pass next before =
         
   | (TUndef (id, ii) as x)::_, _ 
       -> 
-        if (pass = 2)
+        if (pass =|= 2)
         then begin
           pr2_cpp("UNDEF: I treat it as comment");
           TCommentCpp (Token_c.CppDirective, ii)
@@ -2591,7 +2596,7 @@ let lookahead2 ~pass next before =
 
   | (TCppDirectiveOther (ii) as x)::_, _ 
       -> 
-        if (pass = 2)
+        if (pass =|= 2)
         then begin
           pr2_cpp ("OTHER directive: I treat it as comment");
           TCommentCpp (Token_c.CppDirective, ii)
@@ -2603,7 +2608,8 @@ let lookahead2 ~pass next before =
     * to count the '('. Because this can be expensive, we do that only
     * when the token contains "for_each". 
     *)
-  | (TIdent (s, i1)::TOPar _::rest, _) when not (LP.current_context () = LP.InTopLevel)
+  | (TIdent (s, i1)::TOPar _::rest, _) 
+     when not (LP.current_context () =*= LP.InTopLevel)
       (* otherwise a function such as static void loopback_enable(int i) { 
        * will be considered as a loop 
        *)
index e18a461..7b41698 100644 (file)
@@ -52,6 +52,7 @@ type define_def = string * define_param * define_body
      | HintMacroString
      | HintMacroStatement
      | HintAttribute
+     | HintMacroIdentBuilder
 
 val regexp_macro: Str.regexp
 val regexp_annot: Str.regexp
index 83eaef3..f67d0f6 100644 (file)
@@ -76,7 +76,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
   
   let rec pp_expression = fun ((exp, typ), ii) -> 
     (match exp, ii with
-    | Ident (c),         [i]     -> pr_elem i
+    | Ident (ident),         []     -> pp_name ident
     (* only a MultiString can have multiple ii *)
     | Constant (MultiString _), is     -> is +> List.iter pr_elem
     | Constant (c),         [i]     -> pr_elem i 
@@ -102,10 +102,10 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
           
     | ArrayAccess    (e1, e2),   [i1;i2] -> 
         pp_expression e1; pr_elem i1; pp_expression e2; pr_elem i2
-    | RecordAccess   (e, s),     [i1;i2] -> 
-        pp_expression e; pr_elem i1; pr_elem i2
-    | RecordPtAccess (e, s),     [i1;i2] -> 
-        pp_expression e; pr_elem i1; pr_elem i2
+    | RecordAccess   (e, name),     [i1] -> 
+        pp_expression e; pr_elem i1; pp_name name;
+    | RecordPtAccess (e, name),     [i1] -> 
+        pp_expression e; pr_elem i1; pp_name name;
          
     | SizeOfExpr  (e),     [i] -> pr_elem i; pp_expression e
     | SizeOfType  (t),     [i1;i2;i3] -> 
@@ -173,10 +173,33 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
        | ArgType param -> pp_param param
        | ArgAction action -> pp_action action)
          
+(* ---------------------- *)
+  and pp_name = function
+    | RegularName (s, ii) -> 
+        let (i1) = Common.tuple_of_list1 ii in
+        pr_elem i1
+    | CppConcatenatedName xs -> 
+        xs +> List.iter (fun ((x,ii1), ii2) -> 
+          ii2 +> List.iter pr_elem;
+          ii1 +> List.iter pr_elem;
+        )
+    | CppVariadicName (s, ii) -> 
+        ii +> List.iter pr_elem
+    | CppIdentBuilder ((s,iis), xs) -> 
+        let (iis, iop, icp) = Common.tuple_of_list3 iis in
+        pr_elem iis;
+        pr_elem iop;
+        xs +> List.iter (fun ((x,iix), iicomma) -> 
+          iicomma +> List.iter pr_elem;
+          iix +> List.iter pr_elem;
+        );
+        pr_elem icp
+
 (* ---------------------- *)
   and pp_statement = function
-    | Labeled (Label (s, st)), [i1;i2] ->
-       pr_outdent(); pr_elem i1; pr_elem i2; pr_nl(); pp_statement st
+    | Labeled (Label (name, st)), ii ->
+        let (i2) = Common.tuple_of_list1 ii in
+       pr_outdent(); pp_name name; pr_elem i2; pr_nl(); pp_statement st
     | Labeled (Case  (e, st)), [i1;i2] -> 
        pr_unindent();
         pr_elem i1; pp_expression e; pr_elem i2; pr_nl(); pr_indent();
@@ -252,8 +275,9 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
         indent_if_needed st (function _ -> pp_statement st);
         pr_elem iifakend
           
-    | Jump (Goto s), [i1;i2;i3]               -> 
-        pr_elem i1; pr_space(); pr_elem i2; pr_elem i3;
+    | Jump (Goto name), ii               -> 
+        let (i1, i3) = Common.tuple_of_list2 ii in
+        pr_elem i1; pr_space(); pp_name name; pr_elem i3;
     | Jump ((Continue|Break|Return)), [i1;i2] -> pr_elem i1; pr_elem i2;
     | Jump (ReturnExpr e), [i1;i2] ->
        pr_elem i1; pr_space(); pp_expression e; pr_elem i2
@@ -280,14 +304,14 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
     | MacroStmt, ii -> 
         ii +> List.iter pr_elem ;
        
-    | ( Labeled (Label (_,_)) | Labeled (Case  (_,_)) 
+    | (Labeled (Case  (_,_)) 
     | Labeled (CaseRange  (_,_,_)) | Labeled (Default _)
     | Compound _ | ExprStatement _ 
     | Selection  (If (_, _, _)) | Selection  (Switch (_, _))
     | Iteration  (While (_, _)) | Iteration  (DoWhile (_, _)) 
     | Iteration  (For ((_,_), (_,_), (_, _), _))
     | Iteration  (MacroIteration (_,_,_))
-    | Jump (Goto _) | Jump ((Continue|Break|Return)) | Jump (ReturnExpr _)
+    | Jump ((Continue|Break|Return)) | Jump (ReturnExpr _)
     | Jump (GotoComputed _)
     | Decl _ 
        ), _ -> raise Impossible
@@ -418,58 +442,58 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
                        first var, we print the whole type *)
                        
                      (match x with
-                     | (Simple (sopt, typ), iis), iivirg -> 
+                     | (Simple (nameopt, typ)), iivirg -> 
                         (* first var cant have a preceding ',' *)
-                         assert (List.length iivirg = 0); 
+                         assert (List.length iivirg =|= 0); 
                          let identinfo = 
-                            (match sopt, iis with 
-                             None,_ -> None 
-                            | (Some s, [iis]) -> Some (s, iis) 
-                            | x -> raise Impossible) in
+                            match nameopt with 
+                           | None -> None 
+                            | Some name -> Some (get_s_and_ii_of_name name)
+                          in
                          pp_type_with_ident identinfo None typ Ast_c.noattr;
                            
-                     | (BitField (sopt, typ, expr), ii), iivirg -> 
+                     | (BitField (nameopt, typ, iidot, expr)), iivirg -> 
                       (* first var cant have a preceding ',' *)
-                         assert (List.length iivirg = 0); 
-                         (match sopt, ii with
-                         | (None , [idot]) -> 
+                         assert (List.length iivirg =|= 0); 
+                         (match nameopt with
+                         | None -> 
                              pp_type typ;
-                             pr_elem idot;
-                             pp_expression expr
-                         | (Some s, [is;idot]) -> 
+                         | Some name -> 
+                              let (s, is) = get_s_and_ii_of_name name in
                              pp_type_with_ident
                                (Some (s, is)) None typ Ast_c.noattr;
-                             pr_elem idot;
-                             pp_expression expr
-                         | x -> raise Impossible
-                       )); (* match x, first onefield_multivars *)
+                         );
+                          pr_elem iidot;
+                         pp_expression expr
+                            
+                      ); (* match x, first onefield_multivars *)
                        
                   (* for other vars *)
                      xs +> List.iter (function
-                       | (Simple (sopt, typ), iis), iivirg -> 
+                       | (Simple (nameopt, typ)), iivirg -> 
                            iivirg +> List.iter pr_elem;
                            let identinfo = 
-                             (match sopt, iis with 
-                             | None,_ -> None 
-                             | (Some s, [iis]) -> Some (s, iis) 
-                             | x -> raise Impossible) 
+                             match nameopt with 
+                             | None -> None 
+                             | Some name -> Some (get_s_and_ii_of_name name)
                            in
                            pp_type_with_ident_rest identinfo typ Ast_c.noattr
 
-                       | (BitField (sopt, typ, expr), ii), iivirg -> 
+                       | (BitField (nameopt, typ, iidot, expr)), iivirg -> 
                            iivirg +> List.iter pr_elem;
-                           (match sopt, ii with
-                           | (Some s, [is;idot]) -> 
+                           (match nameopt with
+                           | Some name -> 
+                                let (s,is) = get_s_and_ii_of_name name in
                                pp_type_with_ident_rest
                                  (Some (s, is)) typ Ast_c.noattr;
-                               pr_elem idot;
+                               pr_elem iidot;
                                pp_expression expr
                            | x -> raise Impossible
                            )); (* iter other vars *)
                        
                  | [] -> raise Impossible
                  ); (* onefield_multivars *)
-                 assert (List.length iiptvirg = 1);
+                 assert (List.length iiptvirg =|= 1);
                  iiptvirg +> List.iter pr_elem;
                    
                    
@@ -501,13 +525,13 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
           | x -> raise Impossible
          );
            
-          enumt +> List.iter (fun (((s, eopt),ii_s_eq), iicomma) -> 
+          enumt +> List.iter (fun ((name, eopt), iicomma) -> 
             assert (List.length iicomma <= 1);
             iicomma +> List.iter (function x -> pr_elem x; pr_space());
-            (match eopt, ii_s_eq with
-            | None, [is] -> pr_elem is;
-            | Some e, [is;ieq] -> pr_elem is; pr_elem ieq; pp_expression e
-            | _ -> raise Impossible
+            pp_name name;
+            eopt +> Common.do_option (fun (ieq, e) -> 
+              pr_elem ieq;
+              pp_expression e;
          ));
            
           (match sopt, iis with
@@ -527,16 +551,17 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
           print_sto_qu_ty (sto, qu, iis);
            
       | (StructUnionName (s, structunion), iis) -> 
-          assert (List.length iis = 2);
+          assert (List.length iis =|= 2);
           print_sto_qu_ty (sto, qu, iis);
            
       | (EnumName  s, iis) -> 
-          assert (List.length iis = 2);
+          assert (List.length iis =|= 2);
           print_sto_qu_ty (sto, qu, iis);
            
-      | (TypeName (s,_typ), iis) -> 
-          assert (List.length iis = 1);  
-          print_sto_qu_ty (sto, qu, iis);
+      | (TypeName (name,_typ), noii) -> 
+          assert (null noii);
+          let (_s, iis) = get_s_and_ii_of_name name in
+          print_sto_qu_ty (sto, qu, [iis]);
            
       | (TypeOfExpr (e), iis) -> 
           print_sto_qu (sto, qu);
@@ -585,7 +610,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
       | (StructUnion (_, sopt, fields),iis)     -> print_ident ident
       | (StructUnionName (s, structunion), iis) -> print_ident ident
       | (EnumName  s, iis)                      -> print_ident ident
-      | (TypeName (s,_typ), iis)                -> print_ident ident
+      | (TypeName (_name,_typ), iis)            -> print_ident ident
       | (TypeOfExpr (e), iis)                   -> print_ident ident
       | (TypeOfType (e), iis)                   -> print_ident ident
            
@@ -675,7 +700,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
       | (StructUnion (_, sopt, fields),iis)  -> ()    
       | (StructUnionName (s, structunion), iis) -> ()    
       | (EnumName  s, iis) -> ()    
-      | (TypeName (s,_typ), iis) -> ()
+      | (TypeName (_name,_typ), iis) -> ()
            
       | TypeOfType _, _ -> ()
       | TypeOfExpr _, _ -> ()
@@ -683,22 +708,22 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
       | (FunctionType _ | Array _ | Pointer _), _ -> raise Impossible
 
       
-  and pp_param ((b, sopt, t), ii_b_s) =
-    match b, sopt, ii_b_s with
-    | false, None, [] -> 
-       pp_type t
-    | true, None, [i1] -> 
-       pr_elem i1;
-       pp_type t
-         
-    | false, Some s, [i1] -> 
-       pp_type_with_ident
-          (Some (s, i1)) None t Ast_c.noattr;
-    | true, Some s, [i1;i2] -> 
-       pr_elem i1;
+  and pp_param param = 
+    let {p_namei = nameopt;
+         p_register = (b,iib);
+         p_type=t;} = param in
+    
+    iib +> List.iter pr_elem;
+
+    match nameopt with
+    | None -> 
+        pp_type t
+    | Some name -> 
+        let (s,i1) = get_s_and_ii_of_name name in
        pp_type_with_ident
-          (Some (s, i2)) None t Ast_c.noattr;
-    | _ -> raise Impossible                
+          (Some (s, i1)) None t Ast_c.noattr
+          
+        
          
          
   and pp_type_right (((qu, iiqu), (ty, iity)) : fullType) = 
@@ -731,7 +756,7 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
     | (StructUnion (_, sopt, fields),iis)-> ()      
     | (StructUnionName (s, structunion), iis) -> ()    
     | (EnumName  s, iis) -> ()    
-    | (TypeName (s,_typ), iis) -> ()
+    | (TypeName (name,_typ), iis) -> ()
            
     | TypeOfType _, _ -> ()
     | TypeOfExpr _, _ -> ()
@@ -743,49 +768,54 @@ let pretty_print_c pr_elem pr_space pr_nl pr_indent pr_outdent pr_unindent =
       
 (* ---------------------- *)
   and pp_decl = function
-    | DeclList ((({v_namei = var; v_type = returnType;
-                    v_storage = storage; v_attr = attrs;
+    | DeclList ((({v_namei = var; 
+                   v_type = returnType;
+                   v_storage = storage; 
+                   v_attr = attrs;
                   },[])::xs), 
-               iivirg::ifakestart::iisto) -> 
-                 
-                 pr_elem ifakestart;
-                 
-      (* old: iisto +> List.iter pr_elem; *)
+              iivirg::ifakestart::iisto) -> 
+       
+       pr_elem ifakestart;
                  
+        (* old: iisto +> List.iter pr_elem; *)
                  
-      (* handling the first var. Special case, we print the whole type *)
-                 (match var with
-                 | Some ((s, ini),  iis::iini) -> 
-                     pp_type_with_ident
-                       (Some (s, iis)) (Some (storage, iisto))
-                       returnType attrs;
-                     ini +> do_option (fun init -> 
-                       List.iter pr_elem iini; pp_init init);
-                 | None -> pp_type returnType
-                 | _ -> raise Impossible
-                       );
+       
+        (* handling the first var. Special case, we print the whole type *)
+       (match var with
+       | Some (name, iniopt) -> 
+            let (s,iis) = get_s_and_ii_of_name name in
+           pp_type_with_ident
+             (Some (s, iis)) (Some (storage, iisto))
+             returnType attrs;
+           iniopt +> do_option (fun (iini, init) -> 
+             pr_elem iini; 
+              pp_init init);
+       | None -> pp_type returnType
+       );
                  
       (* for other vars, we just call pp_type_with_ident_rest. *)
-                 xs +> List.iter (function
-                   | ({v_namei = Some ((s, ini), iis::iini);
-                        v_type = returnType;
-                        v_storage = storage2;
-                        v_attr = attrs;
-                      }, iivirg) ->
-                        
-                        assert (storage2 = storage);
-                        iivirg +> List.iter pr_elem;
-                        pp_type_with_ident_rest
-                          (Some (s, iis)) returnType attrs;
-                        ini +> do_option (fun (init) -> 
-                          List.iter pr_elem iini; pp_init init);
+       xs +> List.iter (function
+       | ({v_namei = Some (name, iniopt);
+           v_type = returnType;
+           v_storage = storage2;
+           v_attr = attrs;
+         }, iivirg) ->
                         
-                        
-                   | x -> raise Impossible
-                 );
-                 
-                 pr_elem iivirg;
-                 
+            let (s,iis) = get_s_and_ii_of_name name in
+           assert (storage2 =*= storage);
+           iivirg +> List.iter pr_elem;
+           pp_type_with_ident_rest
+             (Some (s, iis)) returnType attrs;
+           iniopt +> do_option (fun (iini, init) -> 
+             pr_elem iini; pp_init init
+            );
+           
+           
+       | x -> raise Impossible
+       );
+       
+       pr_elem iivirg;
+       
     | MacroDecl ((s, es), iis::lp::rp::iiend::ifakestart::iisto) -> 
        pr_elem ifakestart;
        iisto +> List.iter pr_elem; (* static and const *)
@@ -860,13 +890,13 @@ and pp_init (init, iinit) =
   and pp_def def = 
     let defbis, ii = def in
     match ii with 
-    | is::iifunc1::iifunc2::i1::i2::ifakestart::isto -> 
-       let {f_name = s;
-              f_type = (returnt, (paramst, (b, iib)));
-              f_storage = sto;
-              f_body = statxs;
-              f_attr = attrs;
-           } = defbis
+    | iifunc1::iifunc2::i1::i2::ifakestart::isto -> 
+       let {f_name = name;
+             f_type = (returnt, (paramst, (b, iib)));
+             f_storage = sto;
+             f_body = statxs;
+             f_attr = attrs;
+       } = defbis
        in
         pr_elem ifakestart;
         
@@ -874,7 +904,7 @@ and pp_init (init, iinit) =
           returnt Ast_c.noattr;
        
         pp_attributes pr_elem pr_space attrs;
-        pr_elem is;
+        pp_name name;
        
         pr_elem iifunc1;
        
@@ -1145,10 +1175,10 @@ and pp_init (init, iinit) =
     | F.Return   (st,((),ii)) -> 
         (* iif ii *)
        pr2 "XXX"
-    | F.Goto  (st, (s,ii)) -> 
+    | F.Goto  (st, name, ((),ii)) -> 
         (* iif ii *)
        pr2 "XXX"
-    | F.Label (st, (s,ii)) -> 
+    | F.Label (st, name, ((),ii)) -> 
         (* iif ii *)
        pr2 "XXX"
     | F.EndStatement iopt -> 
index 10ea3ab..96cc546 100644 (file)
@@ -67,7 +67,7 @@ let test_parse_gen xs ext =
       sprintf "bad = %d, timeout = %B" 
         stat.Parsing_stat.bad stat.Parsing_stat.have_timeout
     in
-    if stat.Parsing_stat.bad = 0 && not stat.Parsing_stat.have_timeout
+    if stat.Parsing_stat.bad =|= 0 && not stat.Parsing_stat.have_timeout
     then Hashtbl.add newscore file (Common.Ok)
     else Hashtbl.add newscore file (Common.Pb s)
   );
@@ -84,7 +84,7 @@ let test_parse_gen xs ext =
     pr2_xxxxxxxxxxxxxxxxx();
     let str = Str.global_replace (Str.regexp "/") "__" dirname in
     let def = if !Flag_parsing_c.filter_define_error then "_def_" else "" in
-    let ext = if ext = "c" then "" else ext in
+    let ext = if ext =$= "c" then "" else ext in
     Common.regression_testing newscore 
       (Filename.concat score_path
        ("score_parsing__" ^str ^ def ^ ext ^ ".marshalled"))
@@ -131,7 +131,7 @@ let test_cfg file =
       match specific_func, e with
       | None, _ -> true
       | Some s, Ast_c.Definition (defbis,_)  -> 
-          s = defbis.Ast_c.f_name
+          s =$= Ast_c.str_of_name (defbis.Ast_c.f_name)
       | _, _ -> false 
     in
           
@@ -284,7 +284,7 @@ let test_attributes file =
   Visitor_c.vk_program { Visitor_c.default_visitor_c with
     Visitor_c.kdef = (fun (k, bigf) (defbis, ii) -> 
       let sattr  = Ast_c.s_of_attr defbis.f_attr in
-      pr2 (spf "%-30s: %s" defbis.f_name sattr);
+      pr2 (spf "%-30s: %s" (Ast_c.str_of_name (defbis.f_name)) sattr);
     );
     Visitor_c.kdecl = (fun (k, bigf) decl -> 
       match decl with
@@ -294,7 +294,7 @@ let test_attributes file =
             let sattr  = Ast_c.s_of_attr onedecl.v_attr in
             let idname = 
               match onedecl.v_namei with
-              | Some ((s,ini), _) -> s
+              | Some (name, ini) -> Ast_c.str_of_name name
               | None -> "novar"
             in
             pr2 (spf "%-30s: %s" idname sattr);
index 65cc96a..cefa5e9 100644 (file)
@@ -235,10 +235,13 @@ let info_of_tok = function
   | TCppEscapedNewline (ii) -> ii
   | TDefParamVariadic (s, i1) ->     i1
 
+  | TCppConcatOp (ii) -> ii
+
   | TOBraceDefineInit (i1) ->     i1
 
   | TUnknown             (i) -> i
 
+  | TMacroIdentBuilder             (s, i) -> i
   | TMacroAttr             (s, i) -> i
   | TMacroAttrStorage             (s, i) -> i
   | TMacroStmt             (s, i) -> i
@@ -375,6 +378,9 @@ let visitor_info_of_tok f = function
 
   | TCppEscapedNewline (i1) -> TCppEscapedNewline (f i1)
   | TDefEOL (i1) -> TDefEOL (f i1)
+
+  | TCppConcatOp (ii) -> TCppConcatOp (f ii)
+
   | TOParDefine (i1) -> TOParDefine (f i1)
   | TIdentDefine  (s, i) -> TIdentDefine (s, f i)
 
@@ -385,6 +391,7 @@ let visitor_info_of_tok f = function
 
   | TUnknown             (i) -> TUnknown                (f i)
 
+  | TMacroIdentBuilder             (s, i) -> TMacroIdentBuilder (s, f i)
   | TMacroAttr           (s, i)   -> TMacroAttr            (s, f i)
   | TMacroAttrStorage           (s, i)   -> TMacroAttrStorage         (s, f i)
   | TMacroStmt           (s, i)   -> TMacroStmt            (s, f i)
@@ -522,7 +529,7 @@ let is_abstract x =
 (* Helpers *)
 (*****************************************************************************)
 let is_same_line_or_close line tok = 
-  line_of_tok tok = line || 
-  line_of_tok tok = line - 1 ||
-  line_of_tok tok = line - 2
+  line_of_tok tok =|= line || 
+  line_of_tok tok =|= line - 1 ||
+  line_of_tok tok =|= line - 2
 
index e08b2c7..0707df8 100644 (file)
@@ -166,7 +166,7 @@ type namedef =
   | StructUnionNameDef of string * (structUnion * structType) wrap
 
   (* cppext: *)
-  | Macro        of string * define_body
+  | Macro        of string * (define_kind * define_val)
 
 
 (* Because have nested scope, have nested list, hence the list list.
@@ -236,7 +236,7 @@ let member_env lookupf env =
 
 let lookup_var s env = 
   let f = function
-    | VarOrFunc (s2, typ) -> if s2 = s then Some typ else None
+    | VarOrFunc (s2, typ) -> if s2 =$= s then Some typ else None
     | _ -> None
   in
   lookup_env f env
@@ -244,28 +244,28 @@ let lookup_var s env =
 let lookup_typedef s env = 
   if !typedef_debug then pr2 ("looking for: " ^ s);
   let f = function
-    | TypeDef (s2, typ) -> if s2 = s then Some typ else None
+    | TypeDef (s2, typ) -> if s2 =$= s then Some typ else None
     | _ -> None
   in
   lookup_env f env
 
 let lookup_structunion (_su, s) env =
   let f = function
-    | StructUnionNameDef (s2, typ) -> if s2 = s then Some typ else None
+    | StructUnionNameDef (s2, typ) -> if s2 =$= s then Some typ else None
     | _ -> None
   in
   lookup_env f env
 
 let lookup_macro s env = 
   let f = function
-    | Macro (s2, typ) -> if s2 = s then Some typ else None
+    | Macro (s2, typ) -> if s2 =$= s then Some typ else None
     | _ -> None
   in
   lookup_env f env
 
 let lookup_enum s env = 
   let f = function
-    | EnumConstant (s2, typ) -> if s2 = s then Some typ else None
+    | EnumConstant (s2, typ) -> if s2 =$= s then Some typ else None
     | _ -> None
   in
   lookup_env f env
@@ -363,7 +363,8 @@ let rec type_unfold_one_step ty env =
          ty
       )
       
-  | TypeName (s,_typ) -> 
+  | TypeName (name, _typ) -> 
+      let s = Ast_c.str_of_name name in
       (try 
           if !typedef_debug then pr2 "type_unfold_one_step: lookup_typedef";
           let (t', env') = lookup_typedef s env in
@@ -416,7 +417,8 @@ let rec typedef_fix ty env =
   | StructUnionName (su, s) -> ty
 
   (* keep the typename but complete with more information *)
-  | TypeName (s, typ) -> 
+  | TypeName (name, typ) -> 
+      let s = Ast_c.str_of_name name in
       (match typ with
       | Some _ -> 
           pr2 ("typedef value already there:" ^ s);
@@ -430,7 +432,7 @@ let rec typedef_fix ty env =
            * can have some weird mutually recursive typedef which
            * each new type alias search for its mutual def.
            *)
-          TypeName (s, Some (typedef_fix t' env')) +> Ast_c.rewrap_typeC ty
+          TypeName (name, Some (typedef_fix t' env')) +> Ast_c.rewrap_typeC ty
         with Not_found -> 
           ty
       ))
@@ -465,8 +467,13 @@ let type_of_s a =
  * normally.
  *)
 let offset (_,(ty,iis)) =
-  match iis with
-    ii::_ -> ii.Ast_c.pinfo
+  match ty, iis with
+  | TypeName (name, _typ), [] -> 
+      (match name with
+      | RegularName (s, [ii]) -> ii.Ast_c.pinfo
+      | _ -> raise Todo
+      )
+  | _, ii::_ -> ii.Ast_c.pinfo
   | _ -> failwith "type has no text; need to think again"
   
 
@@ -526,7 +533,7 @@ let add_in_scope namedef =
 
 (* sort of hackish... *)
 let islocal info =
-  if List.length (!_scoped_env) = List.length !initial_env
+  if List.length (!_scoped_env) =|= List.length !initial_env
   then Ast_c.NotLocalVar
   else Ast_c.LocalVar info
 
@@ -641,14 +648,14 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr ->
      * Also as I don't want a warning on the Ident that are a FunCall,
      * easier to have a rule separate from the Ident rule.
      *)
-    | FunCall (((Ident s, typ), ii) as e1, args) -> 
+    | FunCall (((Ident (ident), typ), _ii) as e1, args) -> 
         
         (* recurse *)
         args +> List.iter (fun (e,ii) -> 
           (* could typecheck if arguments agree with prototype *)
           Visitor_c.vk_argument bigf e
         );
-        
+        let s = Ast_c.str_of_name ident in
         (match lookup_opt_env lookup_var s with
         | Some ((typ,local),_nextenv) -> 
             
@@ -726,7 +733,8 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr ->
 
 
     (* -------------------------------------------------- *)
-    | Ident (s) -> 
+    | Ident (ident) -> 
+        let s = Ast_c.str_of_name ident in
         (match lookup_opt_env lookup_var s with
         | Some ((typ,local),_nextenv) -> 
             make_info_fix (typ,local)
@@ -799,8 +807,10 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr ->
 
     (* -------------------------------------------------- *)
     (* fields *)
-    | RecordAccess  (e, fld) 
-    | RecordPtAccess (e, fld) as x -> 
+    | RecordAccess  (e, namefld) 
+    | RecordPtAccess (e, namefld) as x -> 
+
+        let fld = Ast_c.str_of_name namefld in
 
         k expr; (* recurse to set the types-ref of sub expressions *)
         
@@ -851,7 +861,8 @@ let annotater_expr_visitor_subpart = (fun (k,bigf) expr ->
     (* todo? lub, hmm maybe not, cos type must be e1 *)
     | Assignment (e1, op, e2) -> 
         k expr; 
-        Ast_c.get_type_expr e1
+        (* value of an assignment is the value of the RHS expression *)
+        Ast_c.get_type_expr e2
     | Sequence (e1, e2) -> 
         k expr; 
         Ast_c.get_type_expr e2
@@ -1037,7 +1048,9 @@ let rec visit_toplevel ~just_add_in_env ~depth elem =
              | Ast_c.LocalDecl -> Ast_c.LocalVar (offset t) 
             in
             
-            var +> Common.do_option (fun ((s, ini), ii_s_ini) -> 
+            var +> Common.do_option (fun (name, iniopt) -> 
+              let s = Ast_c.str_of_name name in
+
               match sto with 
               | StoTypedef, _inline -> 
                   add_binding (TypeDef (s,Lib.al_type t)) true;
@@ -1047,7 +1060,7 @@ let rec visit_toplevel ~just_add_in_env ~depth elem =
 
                   if need_annotate_body then begin
                     (* int x = sizeof(x) is legal so need process ini *)
-                    ini +> Common.do_option (fun ini -> 
+                    iniopt +> Common.do_option (fun (info, ini) -> 
                       Visitor_c.vk_ini bigf ini
                     );
                   end
@@ -1079,10 +1092,12 @@ let rec visit_toplevel ~just_add_in_env ~depth elem =
 
       | Enum (sopt, enums), ii -> 
 
-          enums +> List.iter (fun (((s, eopt),ii_s_eq), iicomma) -> 
+          enums +> List.iter (fun ((name, eopt), iicomma) -> 
+
+            let s = Ast_c.str_of_name name in
 
             if need_annotate_body
-            then eopt +> Common.do_option (fun e -> 
+            then eopt +> Common.do_option (fun (ieq, e) -> 
               Visitor_c.vk_expr bigf e
             );
             add_binding (EnumConstant (s, sopt)) true;
@@ -1103,7 +1118,7 @@ let rec visit_toplevel ~just_add_in_env ~depth elem =
       _notyped_var := Hashtbl.create 100;
       match elem with
       | Definition def -> 
-          let {f_name = funcs;
+          let {f_name = name;
                f_type = ((returnt, (paramst, b)) as ftyp);
                f_storage = sto;
                f_body = statxs;
@@ -1113,10 +1128,11 @@ let rec visit_toplevel ~just_add_in_env ~depth elem =
           in
           let (i1, i2) = 
             match ii with 
-            | is::iifunc1::iifunc2::ibrace1::ibrace2::ifakestart::isto -> 
+            | iifunc1::iifunc2::ibrace1::ibrace2::ifakestart::isto -> 
                 iifunc1, iifunc2
             | _ -> raise Impossible
           in
+          let funcs = Ast_c.str_of_name name in
 
           (match oldstyle with 
           | None -> 
@@ -1128,9 +1144,10 @@ let rec visit_toplevel ~just_add_in_env ~depth elem =
 
               if need_annotate_body then
                 do_in_new_scope (fun () -> 
-                  paramst +> List.iter (fun (((b, s, t), _),_) -> 
-                    match s with 
-                    | Some s ->
+                  paramst +> List.iter (fun ({p_namei= nameopt; p_type= t},_)-> 
+                    match nameopt with 
+                    | Some name ->
+                        let s = Ast_c.str_of_name name in
                        let local = Ast_c.LocalVar (offset t) in
                        add_binding (VarOrFunc (s,(Lib.al_type t,local))) true
                     | None -> 
index fe61cd8..8a03971 100644 (file)
@@ -6,7 +6,7 @@ type namedef =
   | StructUnionNameDef of string *
       (Ast_c.structUnion * Ast_c.structType) Ast_c.wrap
 
-  | Macro of string * Ast_c.define_body
+  | Macro of string * (Ast_c.define_kind * Ast_c.define_val)
 
 (* have nested scope, so nested list*)
 type environment = namedef list list 
index 7fc2edc..5edbdd2 100644 (file)
@@ -91,7 +91,7 @@ let rec is_completed_and_simplified ty =
   | StructUnionName (su, s) -> true
 
   (* should have completed with more information *)
-  | TypeName (s, typ) -> 
+  | TypeName (_name, typ) -> 
       (match typ with
       | None -> false
       | Some t -> 
@@ -260,7 +260,10 @@ let (fake_function_type:
           (match Ast_c.get_onlytype_expr e with
           | Some ft -> 
               let paramtype = 
-                (false, None, ft), []
+                { Ast_c.p_namei = None;
+                  p_register = false, Ast_c.noii;
+                  p_type = ft;
+                }
               in
               Some (paramtype, ii)
           | None -> None
@@ -348,10 +351,11 @@ let (type_field:
     fields +> List.iter (fun x -> 
       match Ast_c.unwrap x with
       | DeclarationField (FieldDeclList (onefield_multivars, iiptvirg)) -> 
-          onefield_multivars +> List.iter (fun fieldkind -> 
-            match Ast_c.unwrap (Ast_c.unwrap fieldkind) with
-            | Simple (Some s, t) | BitField (Some s, t, _) -> 
-                if s = fld 
+          onefield_multivars +> List.iter (fun (fieldkind, iicomma) -> 
+            match fieldkind with
+            | Simple (Some name, t) | BitField (Some name, t, _, _) -> 
+                let s = Ast_c.str_of_name name in
+                if s =$= fld 
                 then Common.push2 t res
                 else ()
                   
@@ -417,7 +421,7 @@ let rec function_pointer_type_opt x =
       | FunctionType ft -> Some ft
 
       (* fix *)
-      | TypeName (_s, Some ft2) -> 
+      | TypeName (_name, Some ft2) -> 
           (match Ast_c.unwrap_typeC ft2 with
           | FunctionType ft -> Some ft
           | _ -> None
@@ -428,7 +432,7 @@ let rec function_pointer_type_opt x =
   (* bugfix: for many fields in structure, the field is a typename 
    * like irq_handler_t to a function pointer 
    *)
-  | TypeName (s, Some ft) -> 
+  | TypeName (_name, Some ft) -> 
       function_pointer_type_opt ft
   (* bugfix: in field, usually it has some ParenType *)
 
index 2a4faf6..2c2a238 100644 (file)
@@ -21,6 +21,10 @@ open Ast_c
 module TH = Token_helpers
 
 
+(* should keep comments and directives in between adjacent deleted terms,
+but not comments and directives within deleted terms.  should use the
+labels found in the control-flow graph *)
+
 
 
 (*****************************************************************************)
@@ -193,7 +197,7 @@ let get_fakeInfo_and_tokens celem toks =
         let (before, x, after) = !toks_in +> Common.split_when (fun tok -> 
          info =*= TH.info_of_tok tok)
         in
-        assert(info = TH.info_of_tok x);
+        assert(info =*= TH.info_of_tok x);
         (*old: assert(before +> List.for_all (TH.is_comment)); *)
         before +> List.iter (fun x -> 
           if not (TH.is_comment x)
@@ -263,6 +267,11 @@ let displace_fake_nodes toks =
 (* Tokens2 generation *)
 (*****************************************************************************)
 
+let comment2t2 = function
+    (Token_c.TCommentCpp x,(info : Token_c.info)) ->
+      C2("\n"^info.Common.str^"\n")
+  | x -> failwith (Printf.sprintf "unexpected comment %s" (Common.dump x))
+
 let expand_mcode toks = 
   let toks_out = ref [] in
 
@@ -272,14 +281,14 @@ let expand_mcode toks =
     match t with
     | Fake1 info -> 
         let str = Ast_c.str_of_info info in
-        if str = ""
+        if str =$= ""
         then push2 (Fake2) toks_out
         (* perhaps the fake ',' *)
         else push2 (C2 str) toks_out
           
   
     | T1 tok -> 
-       let (a,b) = !((TH.info_of_tok tok).cocci_tag) in
+       (*let (a,b) = !((TH.info_of_tok tok).cocci_tag) in*)
         (* no tag on expandedTok ! *)
         (if (TH.is_expanded tok && 
             !((TH.info_of_tok tok).cocci_tag) <> Ast_c.emptyAnnot)
@@ -312,12 +321,18 @@ let expand_mcode toks =
       push2 (Cocci2 s) toks_out 
     in
     let pr_c info = 
-      match Ast_c.pinfo_of_info info with
-       Ast_c.AbstractLineTok _ -> push2 (C2 (Ast_c.str_of_info info)) toks_out
-      |        Ast_c.FakeTok (s,_) -> push2 (C2 s) toks_out
+      (match Ast_c.pinfo_of_info info with
+       Ast_c.AbstractLineTok _ ->
+         push2 (C2 (Ast_c.str_of_info info)) toks_out
+      |        Ast_c.FakeTok (s,_) ->
+         push2 (C2 s) toks_out
       |        _ ->
          Printf.printf "line: %s\n" (Common.dump info);
-         failwith "not an abstract line" in
+         failwith "not an abstract line");
+      (!(info.Ast_c.comments_tag)).Ast_c.mafter +>
+      List.iter (fun x -> Common.push2 (comment2t2 x) toks_out) in
+
+
 
     let pr_space _ = push2 (C2 " ") toks_out in
 
@@ -367,18 +382,18 @@ let expand_mcode toks =
 (*****************************************************************************)
 
 let is_minusable_comment = function
-  | T2 (t,_b,_i) -> 
+  | (T2 (t,_b,_i)) -> 
       (match t with
       | Parser_c.TCommentSpace _   (* only whitespace *)
       (* patch: coccinelle *)      
       | Parser_c.TCommentNewline _ (* newline plus whitespace *)
       | Parser_c.TComment _ 
       | Parser_c.TCommentCpp (Token_c.CppAttr, _) 
-      | Parser_c.TCommentCpp (Token_c.CppMacro, _) 
+      | Parser_c.TCommentCpp (Token_c.CppMacro, _)
+      | Parser_c.TCommentCpp (Token_c.CppDirective, _) (* result was false *)
         -> true
 
-      | Parser_c.TCommentMisc _ 
-      | Parser_c.TCommentCpp (Token_c.CppDirective, _)
+      | Parser_c.TCommentMisc _
       | Parser_c.TCommentCpp (Token_c.CppPassingCosWouldGetError, _)
         -> false
 
@@ -390,10 +405,8 @@ let all_coccis = function
     Cocci2 _ | C2 _ | Indent_cocci2 | Unindent_cocci2 -> true
   | _ -> false
 
-let is_minusable_comment_or_plus = function
-(* patch: coccinelle *)
-    T2(Parser_c.TCommentNewline _,_b,_i) -> false
-  | x -> is_minusable_comment x or all_coccis x
+(*previously gave up if the first character was a newline, but not clear why*)
+let is_minusable_comment_or_plus x = is_minusable_comment x or all_coccis x
 
 let set_minus_comment = function
   | T2 (t,false,idx) -> 
@@ -405,9 +418,11 @@ let set_minus_comment = function
 
       | Parser_c.TComment _ 
       | Parser_c.TCommentCpp (Token_c.CppAttr, _) 
-      | Parser_c.TCommentCpp (Token_c.CppMacro, _) 
+      | Parser_c.TCommentCpp (Token_c.CppMacro, _)
+      | Parser_c.TCommentCpp (Token_c.CppDirective, _)
         -> 
-          pr2 ("ERASING_COMMENTS: " ^ str)
+          pr2 (Printf.sprintf "%d: ERASING_COMMENTS: %s"
+                (TH.line_of_tok t) str)
       | _ -> raise Impossible
       );
       T2 (t, true, idx)
@@ -418,7 +433,6 @@ let set_minus_comment = function
 let set_minus_comment_or_plus = function
     Cocci2 _ | C2 _ | Indent_cocci2 | Unindent_cocci2 as x -> x
   | x -> set_minus_comment x
-      
 
 let remove_minus_and_between_and_expanded_and_fake xs =
 
@@ -456,7 +470,7 @@ let remove_minus_and_between_and_expanded_and_fake xs =
   let rec adjust_after_brace = function
       [] -> []
     | ((T2(_,false,_)) as x)::((T2(_,true,_)::_) as xs)
-       when str_of_token2 x = "{" ->
+       when str_of_token2 x =$= "{" ->
         let (between_minus,rest) = Common.span minus_or_comment xs in
         let is_whitespace = function
             T2(Parser_c.TCommentSpace _,_b,_i)
@@ -485,7 +499,7 @@ let remove_minus_and_between_and_expanded_and_fake xs =
   (* The use of is_minusable_comment_or_plus and set_minus_comment_or_plus
      is because the + code can end up anywhere in the middle of the - code;
      it is not necessarily to the far left *)
-  let rec adjust_between_minus xs = 
+  let rec adjust_between_minus xs =
     match xs with
     | [] -> []
     | (T2 (t1,true,idx1))::xs -> 
@@ -496,12 +510,12 @@ let remove_minus_and_between_and_expanded_and_fake xs =
         | [] -> [(T2 (t1, true,idx1))]
 
         | (T2 (t2, true,idx2))::rest ->
-             (T2 (t1, true,idx1))::
-               (List.map set_minus_comment_or_plus between_comments @
-               adjust_between_minus ((T2 (t2, true, idx2))::rest))
-        | x::xs -> 
-             (T2 (t1, true, idx1))::
-               (between_comments @ adjust_between_minus (x::xs))
+            (T2 (t1, true,idx1))::
+            (List.map set_minus_comment_or_plus between_comments @
+             adjust_between_minus ((T2 (t2, true, idx2))::rest))
+        | x::xs ->
+            (T2 (t1, true, idx1))::
+            (between_comments @ adjust_between_minus (x::xs))
         )
 
     | x::xs -> x::adjust_between_minus xs in
@@ -559,7 +573,7 @@ let rec add_space xs =
 let new_tabbing2 space = 
   (list_of_string space)
     +> List.rev
-    +> Common.take_until (fun c -> c = '\n')
+    +> Common.take_until (fun c -> c =<= '\n')
     +> List.rev
     +> List.map string_of_char
     +> String.concat ""
@@ -576,7 +590,7 @@ let rec adjust_indentation xs =
 
   (* try to pick a tabbing unit for the plus code *)
   let adjust_tabbing_unit old_tab new_tab =
-    if !tabbing_unit = None && String.length new_tab > String.length old_tab
+    if !tabbing_unit =*= None && String.length new_tab > String.length old_tab
     then
       let old_tab = list_of_string old_tab in
       let new_tab = list_of_string new_tab in
@@ -592,14 +606,14 @@ let rec adjust_indentation xs =
     let rec loop = function
        ([],new_tab) -> string_of_list (List.rev new_tab)
       |        (_,[]) -> "" (*weird; tabbing unit used up more than the current tab*)
-      |        (t::ts,n::ns) when t = n -> loop (ts,ns)
+      |        (t::ts,n::ns) when t =<= n -> loop (ts,ns)
       |        (_,ns) -> (* mismatch; remove what we can *)
          string_of_list (List.rev ns) in
     loop (tu,current_tab) in
 
   let rec find_first_tab started = function
       [] -> ()
-    | ((T2 (tok,_,_)) as x)::xs when str_of_token2 x = "{" ->
+    | ((T2 (tok,_,_)) as x)::xs when str_of_token2 x =$= "{" ->
        find_first_tab true xs
 (* patch: coccinelle *)
     | ((T2 (Parser_c.TCommentNewline s, _, _)) as x)::_
@@ -614,7 +628,7 @@ let rec adjust_indentation xs =
     | [] ->  []
 (* patch: coccinelle *)
     | ((T2 (tok,_,_)) as x)::(T2 (Parser_c.TCommentNewline s, _, _))::
-      (Cocci2 "{")::xs when started && str_of_token2 x = ")" ->
+      (Cocci2 "{")::xs when started && str_of_token2 x =$= ")" ->
        (* to be done for if, etc, but not for a function header *)
        x::(Cocci2 " {")::(aux started xs)
     | ((T2 (Parser_c.TCommentNewline s, _, _)) as x)::xs ->
@@ -624,7 +638,7 @@ let rec adjust_indentation xs =
        (if started then adjust_tabbing_unit old_tabbing !_current_tabbing);
        let coccis_rest = Common.span all_coccis xs in
        (match coccis_rest with
-         (_::_,((T2 (tok,_,_)) as y)::_) when str_of_token2 y = "}" ->
+         (_::_,((T2 (tok,_,_)) as y)::_) when str_of_token2 y =$= "}" ->
            (* the case where cocci code has been added before a close } *)
            x::aux started (Indent_cocci2::xs)
         | _ -> x::aux started xs)
@@ -642,13 +656,13 @@ let rec adjust_indentation xs =
            aux started xs)
     (* border between existing code and cocci code *)
     | ((T2 (tok,_,_)) as x)::((Cocci2 "\n") as y)::xs
-      when str_of_token2 x = "{" ->
+      when str_of_token2 x =$= "{" ->
        x::aux true (y::Indent_cocci2::xs)
     | ((Cocci2 _) as x)::((T2 (tok,_,_)) as y)::xs
-      when str_of_token2 y = "}" ->
+      when str_of_token2 y =$= "}" ->
        x::aux started (y::Unindent_cocci2::xs)
     (* starting the body of the function *)
-    | ((T2 (tok,_,_)) as x)::xs when str_of_token2 x = "{" ->  x::aux true xs
+    | ((T2 (tok,_,_)) as x)::xs when str_of_token2 x =$= "{" ->  x::aux true xs
     | (Cocci2 "{")::xs -> (Cocci2 "{")::aux true xs
     | ((Cocci2 "\n") as x)::xs -> 
             (* dont inline in expr because of weird eval order of ocaml *)
@@ -663,15 +677,15 @@ let rec find_paren_comma = function
 
   (* do nothing if was like this in original file *)
   | ({ str = "("; idx = Some p1 } as _x1)::({ str = ","; idx = Some p2} as x2)
-    ::xs when p2 = p1 + 1 -> 
+    ::xs when p2 =|= p1 + 1 -> 
       find_paren_comma (x2::xs)
 
   | ({ str = ","; idx = Some p1 } as _x1)::({ str = ","; idx = Some p2} as x2)
-    ::xs when p2 = p1 + 1 -> 
+    ::xs when p2 =|= p1 + 1 -> 
       find_paren_comma (x2::xs)
 
   | ({ str = ","; idx = Some p1 } as _x1)::({ str = ")"; idx = Some p2} as x2)
-    ::xs when p2 = p1 + 1 -> 
+    ::xs when p2 =|= p1 + 1 -> 
       find_paren_comma (x2::xs)
 
   (* otherwise yes can adjust *)
@@ -739,7 +753,7 @@ let print_all_tokens2 pr xs =
     let current_kind = ref KOrigin in
     xs +> List.iter (fun t -> 
       let newkind = kind_of_token2 t in
-      if newkind = !current_kind
+      if newkind =*= !current_kind
       then pr (str_of_token2 t)
       else begin
         pr (end_mark);
index dccb76a..89d25d4 100644 (file)
@@ -106,13 +106,13 @@ let mcode fn arg =
            function (str,line,col) ->
              match line_before with
                None -> print_string str; Some line
-             | Some lb when line = lb -> print_string str; Some line
+             | Some lb when line =|= lb -> print_string str; Some line
              | _ -> print_string "\n"; print_string str; Some line)
          lb comments in
       let line_before = print_comments None info.Ast.strbef in
       (match line_before with
        None -> ()
-      |        Some lb when lb = info.Ast.line -> ()
+      |        Some lb when lb =|= info.Ast.line -> ()
       |        _ -> print_string "\n");
       fn s;
       let _ = print_comments (Some info.Ast.line) info.Ast.straft in
@@ -941,7 +941,7 @@ in
        (if unindent_before x then unindent());
        pr "\n" in
       let newline_before _ =
-       if before = After
+       if before =*= After
        then
          let hd = List.hd xxs in
          match hd with
@@ -952,7 +952,7 @@ in
          | (Ast.DeclarationTag _::_) | (Ast.Token ("}",_)::_) -> prnl hd
           | _ -> () in
       let newline_after _ =
-       if before = Before
+       if before =*= Before
        then
          match List.rev(List.hd(List.rev xxs)) with
            (Ast.StatementTag s::_) ->
index 060d67c..21fd4b7 100644 (file)
@@ -128,7 +128,8 @@ let get_function_name rule env =
 (* Print metavariable declarations *)
 
 let rec print_typedef pr = function
-    (Ast_c.TypeName(s,_),_) ->
+    (Ast_c.TypeName(name,_),_) ->
+      let s = Ast_c.str_of_name name in
       let typedefs =
        try List.assoc !current_outfile !typedefs
        with Not_found ->
@@ -151,34 +152,50 @@ let rewrap_str s ii =
     | Ast_c.AbstractLineTok pi ->
        Ast_c.AbstractLineTok { pi with Common.str = s;})}
 
+let rewrap_prefix_name prefix name = 
+  match name with
+  | Ast_c.RegularName (s, iiname) -> 
+      let iis = Common.tuple_of_list1 iiname in 
+      let iis' = rewrap_str (prefix^s) iis in
+      Ast_c.RegularName (prefix ^ s, [iis'])
+  | Ast_c.CppConcatenatedName _ | Ast_c.CppVariadicName _ 
+  | Ast_c.CppIdentBuilder _
+      -> raise Common.Todo
+
+
 let print_metavar pr = function
-    ((_,Some param,(_,(Ast_c.Pointer(_,(Ast_c.BaseType(Ast_c.Void),_)),_))),_)
+  | {Ast_c.p_namei = Some name;
+     p_type = (_,(Ast_c.Pointer(_,(Ast_c.BaseType(Ast_c.Void),_)),_));
+    }
     ->
+      let param = Ast_c.str_of_name name in
       pr ("expression "^prefix); pr param
-  | (((_,Some param,(_,ty)),il) : Ast_c.parameterType) ->
-      let il =
-       match List.rev il with
-         name::rest -> (rewrap_str (prefix^param) name) :: rest
-       | _ -> failwith "no name" in
+  | ({Ast_c.p_namei = Some name; p_type = (_,ty)} : Ast_c.parameterType) ->
+
+      let name' = rewrap_prefix_name prefix name in 
+
       print_typedef pr ty;
+
       Pretty_print_c.pp_param_gen
        (function x ->
          let str = Ast_c.str_of_info x in
          if not (List.mem str ["const";"volatile"])
          then pr str)
        (function _ -> pr " ")
-       ((false,Some param,
-         (({Ast_c.const = false; Ast_c.volatile = false},[]),ty)),
-        il)
+        {Ast_c.p_register = (false,[]);
+         p_namei = Some name';
+         p_type = (({Ast_c.const = false; Ast_c.volatile = false},[]),ty)
+        }
   | _ -> failwith "function must have named parameters"
 
 let make_exp = function
-    (((_,Some name,ty),param_ii),comma_ii) ->
+    ({Ast_c.p_namei = Some name; p_type = ty}, comma_ii) ->
       let no_info = (None,Ast_c.NotTest) in
-      let nm = prefix^name in
+
+      let name' = rewrap_prefix_name prefix name in
+
       let exp =
-       ((Ast_c.Ident nm,ref no_info),
-        [rewrap_str nm (List.hd(List.rev param_ii))]) in
+       ((Ast_c.Ident (name'),ref no_info),Ast_c.noii) in
       (name,(Common.Left exp,comma_ii))
   | _ -> failwith "bad parameter"
 
@@ -207,15 +224,23 @@ let print_extra_typedefs pr env =
     env
 
 let rename argids env =
-  let argenv = List.map (function arg -> (arg,prefix^arg)) argids in
+  let argenv = List.map (function name -> 
+    let arg = Ast_c.str_of_name name in
+    (arg,prefix^arg)
+  ) argids in
   let lookup x = try List.assoc x argenv with Not_found -> x in
   let bigf =
     { Visitor_c.default_visitor_c_s with
     Visitor_c.kexpr_s = (fun (k,bigf) e -> 
       match e with
-       ((Ast_c.Ident s, info), [ii]) ->
+       ((Ast_c.Ident (name), info), []) ->
+
+          (* pad: assert is_regular_ident ? *)
+          let s = Ast_c.str_of_name name in
+          let ii = Ast_c.info_of_name name in
          let new_name = lookup s in
-         ((Ast_c.Ident new_name, info), [rewrap_str new_name ii])
+          let new_id = Ast_c.RegularName (new_name, [rewrap_str new_name ii]) in
+         ((Ast_c.Ident (new_id), info), Ast_c.noii)
       | _ -> k e) } in
   List.map
     (function (x,vl) ->
@@ -270,8 +295,10 @@ let pp_meta_decl pr env decl =
   match decl with
     Ast.MetaIdDecl(ar, name) ->
       no_arity ar; pr "identifier "; pp_name name; pr ";\n"
-  | Ast.MetaFreshIdDecl(ar, name) ->
-      no_arity ar; pr "fresh identifier "; pp_name name; pr ";\n"
+  | Ast.MetaFreshIdDecl(name, None) ->
+      pr "fresh identifier "; pp_name name; pr ";\n"
+  | Ast.MetaFreshIdDecl(name, Some x) ->
+      pr "fresh identifier "; pp_name name; pr " = \""; pr x; pr "\";\n"
   | Ast.MetaTypeDecl(ar, name) ->
       no_arity ar; pr "type "; pp_name name; pr ";\n"
   | Ast.MetaInitDecl(ar, name) ->
@@ -326,7 +353,7 @@ let print_metavariables pr local_metas paramst env header_req function_name =
   pr (Printf.sprintf "position _p!=same_%s.p;\n" function_name);
   pr "identifier _f;\n";
   let rec loop = function
-      [] | [(((_,_,(_,(Ast_c.BaseType(Ast_c.Void),_))),_),_)] -> []
+      [] | [{Ast_c.p_type =(_,(Ast_c.BaseType(Ast_c.Void),_))},_] -> []
     | ((first,_) as f)::rest ->
        print_metavar pr first; pr ";\n";
        (make_exp f) :: loop rest in
@@ -349,15 +376,15 @@ let print_end pr =
 (* Print call to the defined function *)
 
 let print_param_name pr = function
-    ((_,Some param,_),_) -> pr param
+    {Ast_c.p_namei = Some name} -> pr (Ast_c.str_of_name name)
   | _ -> failwith "function must have named parameters"
 
 let pp_def_gen pr defn isexp =
-  let {Ast_c.f_name = s; f_type = (_, (paramst, (b, iib))); } = defn in
-  pr s; pr "(";
+  let {Ast_c.f_name = name; f_type = (_, (paramst, (b, iib))); } = defn in
+  pr (Ast_c.str_of_name name); pr "(";
   (if b then failwith "not handling variable argument functions");
   (match paramst with
-    [] | [(((_,_,(_,(Ast_c.BaseType(Ast_c.Void),_))),_),_)] -> ()
+    [] | [{Ast_c.p_type = (_,(Ast_c.BaseType(Ast_c.Void),_))},_] -> ()
   | (first,_)::rest ->
       print_param_name pr first;
       List.iter (function (x,_) -> pr ", "; print_param_name pr x) rest);
index 258699d..923b9c4 100644 (file)
@@ -119,7 +119,7 @@ module F = Control_flow_c
  * 
  * The problem is that you don't have control about what is generated 
  * and in our case we sometimes dont want to visit too much. For instance
- * our visitor don't recuse on the type annotation of expressions
+ * our visitor don't recurse on the type annotation of expressions
  * Ok, this could be worked around, but the pb remains, you 
  * don't have control and at some point you may want. In the same
  * way we want to enforce a certain order in the visit (ok this is not good,
@@ -233,13 +233,15 @@ type visitor_c =
 
    kdecl:      (declaration -> unit) * visitor_c -> declaration -> unit;
    kdef:       (definition  -> unit) * visitor_c -> definition  -> unit; 
+   kname     : (name -> unit)        * visitor_c -> name       -> unit;
+
    kini:       (initialiser  -> unit) * visitor_c -> initialiser  -> unit; 
+   kfield: (field -> unit) * visitor_c -> field -> unit;
 
    kcppdirective: (cpp_directive -> unit) * visitor_c -> cpp_directive -> unit;
    kdefineval : (define_val -> unit) * visitor_c -> define_val -> unit;
    kstatementseq: (statement_sequencable   -> unit) * visitor_c -> statement_sequencable   -> unit;
 
-   kfield: (field -> unit) * visitor_c -> field -> unit;
 
    (* CFG *)
    knode: (F.node -> unit) * visitor_c -> F.node -> unit;
@@ -250,19 +252,20 @@ type visitor_c =
  } 
 
 let default_visitor_c = 
-  { kexpr =      (fun (k,_) e  -> k e);
-    kstatement = (fun (k,_) st -> k st);
-    ktype      = (fun (k,_) t  -> k t);
-    kdecl      = (fun (k,_) d  -> k d);
-    kdef       = (fun (k,_) d  -> k d);
-    kini       = (fun (k,_) ie  -> k ie);
-    kinfo      = (fun (k,_) ii  -> k ii);
-    knode      = (fun (k,_) n  -> k n);
-    ktoplevel  = (fun (k,_) p  -> k p);
+  { kexpr         = (fun (k,_) e  -> k e);
+    kstatement    = (fun (k,_) st -> k st);
+    ktype         = (fun (k,_) t  -> k t);
+    kdecl         = (fun (k,_) d  -> k d);
+    kdef          = (fun (k,_) d  -> k d);
+    kini          = (fun (k,_) ie  -> k ie);
+    kname         = (fun (k,_) x -> k x);
+    kinfo         = (fun (k,_) ii  -> k ii);
+    knode         = (fun (k,_) n  -> k n);
+    ktoplevel     = (fun (k,_) p  -> k p);
     kcppdirective = (fun (k,_) p  -> k p);
-    kdefineval = (fun (k,_) p  -> k p);
-    kstatementseq    = (fun (k,_) p  -> k p);
-    kfield    = (fun (k,_) p  -> k p);
+    kdefineval    = (fun (k,_) p  -> k p);
+    kstatementseq = (fun (k,_) p  -> k p);
+    kfield        = (fun (k,_) p  -> k p);
   } 
 
 
@@ -277,7 +280,7 @@ let rec vk_expr = fun bigf expr ->
   and k ((e,_typ), ii) = 
     iif ii;
     match e with
-    | Ident (s) -> ()
+    | Ident (name) -> vk_name bigf name
     | Constant (c) -> ()
     | FunCall  (e, es)         -> 
         exprf e;  
@@ -293,8 +296,8 @@ let rec vk_expr = fun bigf expr ->
     | Binary   (e1, op, e2) -> exprf e1; exprf  e2;
         
     | ArrayAccess    (e1, e2) -> exprf e1; exprf e2;
-    | RecordAccess   (e, s) -> exprf e
-    | RecordPtAccess (e, s) -> exprf e
+    | RecordAccess   (e, name) -> exprf e; vk_name bigf name
+    | RecordPtAccess (e, name) -> exprf e; vk_name bigf name
 
     | SizeOfExpr  (e) -> exprf e
     | SizeOfType  (t) -> vk_type bigf t
@@ -321,7 +324,30 @@ let rec vk_expr = fun bigf expr ->
   in exprf expr
 
 
+(* ------------------------------------------------------------------------ *)
+and vk_name = fun bigf ident -> 
+  let iif ii = vk_ii bigf ii in
 
+  let rec namef x = bigf.kname (k,bigf) x 
+  and k id = 
+    match id with
+    | RegularName (s, ii) -> iif ii
+    | CppConcatenatedName xs -> 
+        xs +> List.iter (fun ((x,ii1), ii2) -> 
+          iif ii2;
+          iif ii1;
+        );
+    | CppVariadicName (s, ii) -> iif ii
+    | CppIdentBuilder ((s,iis), xs) -> 
+        iif iis;
+        xs +> List.iter (fun ((x,iix), iicomma) -> 
+          iif iicomma;
+          iif iix;
+        )
+  in
+  namef ident
+
+(* ------------------------------------------------------------------------ *)
 
 
 and vk_statement = fun bigf (st: Ast_c.statement) -> 
@@ -359,7 +385,7 @@ and vk_statement = fun bigf (st: Ast_c.statement) ->
         vk_argument_list bigf es;
         statf st;
           
-    | Jump (Goto s) -> ()
+    | Jump (Goto name) -> vk_name bigf name
     | Jump ((Continue|Break|Return)) -> ()
     | Jump (ReturnExpr e) -> vk_expr bigf e;
     | Jump (GotoComputed e) -> vk_expr bigf e;
@@ -416,10 +442,14 @@ and vk_type = fun bigf t ->
         )
 
     | Enum  (sopt, enumt) -> 
-        enumt +> List.iter (fun (((s, eopt),ii_s_eq), iicomma) -> 
-          iif ii_s_eq; iif iicomma;
-          eopt +> do_option (vk_expr bigf)
-          );    
+        enumt +> List.iter (fun ((name, eopt), iicomma) -> 
+          vk_name bigf name; 
+          iif iicomma;
+          eopt +> Common.do_option (fun (info, e) -> 
+            iif [info];
+            vk_expr bigf e
+          )
+        );    
         
     | StructUnion (sopt, _su, fields) -> 
         vk_struct_fields bigf fields
@@ -428,7 +458,8 @@ and vk_type = fun bigf t ->
     | EnumName  s -> ()
 
     (* dont go in _typ *)
-    | TypeName (s, _typ) -> ()
+    | TypeName (name,_typ) -> 
+        vk_name bigf name
 
     | ParenType t -> typef t
     | TypeOfExpr e -> vk_expr bigf e
@@ -465,15 +496,20 @@ and vk_decl = fun bigf d ->
 and vk_onedecl = fun bigf onedecl -> 
   let iif ii = vk_ii bigf ii in
   match onedecl with
-  | ({v_namei = var; v_type = t; 
-            v_storage = _sto; v_attr = attrs})  -> 
+  | ({v_namei = var; 
+      v_type = t; 
+      v_storage = _sto; 
+      v_attr = attrs})  -> 
 
     vk_type bigf t;
     attrs +> List.iter (vk_attribute bigf);
-    var +> do_option (fun ((s, ini), ii_s_ini) -> 
-      iif ii_s_ini;
-      ini +> do_option (vk_ini bigf)
-        );
+    var +> Common.do_option (fun (name, iniopt) -> 
+      vk_name bigf name;
+      iniopt +> Common.do_option (fun (info, ini) -> 
+      iif [info];
+      vk_ini bigf ini;
+      );
+    )
 
 and vk_ini = fun bigf ini -> 
   let iif ii = vk_ii bigf ii in
@@ -548,9 +584,12 @@ and vk_struct_fieldkinds = fun bigf onefield_multivars ->
   onefield_multivars +> List.iter (fun (field, iicomma) ->
     iif iicomma;
     match field with
-    | Simple (s, t), ii -> iif ii; vk_type bigf t;
-    | BitField (sopt, t, expr), ii -> 
-        iif ii;
+    | Simple (nameopt, t) -> 
+        Common.do_option (vk_name bigf) nameopt;
+        vk_type bigf t;
+    | BitField (nameopt, t, info, expr) -> 
+        Common.do_option (vk_name bigf) nameopt;
+        vk_info bigf info;
         vk_expr bigf expr;
         vk_type bigf t 
   )
@@ -766,8 +805,8 @@ and vk_node = fun bigf node ->
     | F.Continue (st,((),ii)) -> iif ii
     | F.Default  (st,((),ii)) -> iif ii
     | F.Return   (st,((),ii)) -> iif ii
-    | F.Goto  (st, (s,ii)) -> iif ii
-    | F.Label (st, (s,ii)) -> iif ii
+    | F.Goto  (st, name, ((),ii)) -> vk_name bigf name; iif ii
+    | F.Label (st, name, ((),ii)) -> vk_name bigf name; iif ii
 
     | F.DoHeader (st, info) -> infof info
 
@@ -824,10 +863,12 @@ and vk_argument_list = fun bigf es ->
 
 
 
-and vk_param = fun bigf (((b, s, t), ii_b_s)) ->  
+and vk_param = fun bigf param  ->
   let iif ii = vk_ii bigf ii in
-  iif ii_b_s;
-  vk_type bigf t
+  let {p_namei = swrapopt; p_register = (b, iib); p_type=ft} = param in
+  swrapopt +> Common.do_option (vk_name bigf);
+  iif iib;
+  vk_type bigf ft
 
 and vk_param_list = fun bigf ts -> 
   let iif ii = vk_ii bigf ii in
@@ -913,6 +954,7 @@ type visitor_c_s = {
 
   kdecl_s: (declaration  inout * visitor_c_s) -> declaration inout;
   kdef_s:  (definition   inout * visitor_c_s) -> definition  inout; 
+  kname_s: (name         inout * visitor_c_s) -> name        inout;
 
   kini_s:  (initialiser  inout * visitor_c_s) -> initialiser inout; 
 
@@ -934,6 +976,7 @@ let default_visitor_c_s =
     ktype_s      = (fun (k,_) t  -> k t);
     kdecl_s      = (fun (k,_) d  -> k d);
     kdef_s       = (fun (k,_) d  -> k d);
+    kname_s      = (fun (k,_) x ->  k x);
     kini_s       = (fun (k,_) d  -> k d);
     ktoplevel_s  = (fun (k,_) p  -> k p);
     knode_s      = (fun (k,_) n  -> k n);
@@ -955,7 +998,7 @@ let rec vk_expr_s = fun bigf expr ->
     let typ' = typ in 
     let e' = 
       match unwrap_e with
-      | Ident (s) -> Ident (s)
+      | Ident (name) -> Ident (vk_name_s bigf name)
       | Constant (c) -> Constant (c)
       | FunCall  (e, es)         -> 
           FunCall (exprf e,
@@ -973,8 +1016,10 @@ let rec vk_expr_s = fun bigf expr ->
       | Binary   (e1, op, e2) -> Binary (exprf e1, op, exprf e2)
           
       | ArrayAccess    (e1, e2) -> ArrayAccess (exprf e1, exprf e2)
-      | RecordAccess   (e, s) -> RecordAccess     (exprf e, s) 
-      | RecordPtAccess (e, s) -> RecordPtAccess   (exprf e, s) 
+      | RecordAccess   (e, name) -> 
+          RecordAccess     (exprf e, vk_name_s bigf name) 
+      | RecordPtAccess (e, name) -> 
+          RecordPtAccess   (exprf e, vk_name_s bigf name) 
 
       | SizeOfExpr  (e) -> SizeOfExpr   (exprf e)
       | SizeOfType  (t) -> SizeOfType (vk_type_s bigf t)
@@ -997,6 +1042,7 @@ let rec vk_expr_s = fun bigf expr ->
     (e', typ'), (iif ii)
   in exprf expr
 
+
 and vk_argument_s bigf argument = 
   let iif ii = vk_ii_s bigf ii in
   let rec do_action = function 
@@ -1008,8 +1054,29 @@ and vk_argument_s bigf argument =
   | Right (ArgAction action) -> Right (ArgAction (do_action action))
   )
 
+(* ------------------------------------------------------------------------ *)
+
 
+and vk_name_s = fun bigf ident -> 
+  let iif ii = vk_ii_s bigf ii in
+  let rec namef x = bigf.kname_s (k,bigf) x 
+  and k id = 
+    (match id with
+    | RegularName (s,ii) -> RegularName (s, iif ii)
+    | CppConcatenatedName xs -> 
+        CppConcatenatedName (xs +> List.map (fun ((x,ii1), ii2) -> 
+          (x, iif ii1), iif ii2
+        ))
+    | CppVariadicName (s, ii) -> CppVariadicName (s, iif ii)
+    | CppIdentBuilder ((s,iis), xs) -> 
+        CppIdentBuilder ((s, iif iis),
+                        xs +> List.map (fun ((x,iix), iicomma) -> 
+                          ((x, iif iix), iif iicomma)))
+    )
+  in
+  namef ident
 
+(* ------------------------------------------------------------------------ *)
 
 
 
@@ -1061,7 +1128,7 @@ and vk_statement_s = fun bigf st ->
                 ))
 
             
-      | Jump (Goto s) -> Jump (Goto s)
+      | Jump (Goto name) -> Jump (Goto (vk_name_s bigf name))
       | Jump (((Continue|Break|Return) as x)) -> Jump (x)
       | Jump (ReturnExpr e) -> Jump (ReturnExpr ((vk_expr_s bigf) e))
       | Jump (GotoComputed e) -> Jump (GotoComputed (vk_expr_s bigf e));
@@ -1089,7 +1156,7 @@ and vk_statement_sequencable_s = fun bigf stseq ->
     | IfdefStmt2 (ifdef, xxs) -> 
         let ifdef' = List.map (vk_ifdef_directive_s bigf) ifdef in
         let xxs' = xxs +> List.map (fun xs -> 
-          xs +> List.map (vk_statement_sequencable_s bigf)
+          xs +> vk_statement_sequencable_list_s bigf
         )
         in
         IfdefStmt2(ifdef', xxs')
@@ -1150,18 +1217,23 @@ and vk_type_s = fun bigf t ->
 
       | Enum  (sopt, enumt) -> 
           Enum (sopt,
-               enumt +> List.map (fun (((s, eopt),ii_s_eq), iicomma) -> 
-                 ((s, fmap (vk_expr_s bigf) eopt), iif ii_s_eq),
-                 iif iicomma
+               enumt +> List.map (fun ((name, eopt), iicomma) -> 
+                 
+                 ((vk_name_s bigf name, 
+                  eopt +> Common.fmap (fun (info, e) -> 
+                    vk_info_s bigf info,
+                    vk_expr_s bigf e
+                 )), 
+                 iif iicomma)
+               )
                )
-          )
       | StructUnion (sopt, su, fields) -> 
           StructUnion (sopt, su, vk_struct_fields_s bigf fields)
 
 
       | StructUnionName (s, structunion) -> StructUnionName (s, structunion)
       | EnumName  s -> EnumName  s
-      | TypeName (s, typ) -> TypeName (s, typ)
+      | TypeName (name, typ) -> TypeName (vk_name_s bigf name, typ)
 
       | ParenType t -> ParenType (typef t)
       | TypeOfExpr e -> TypeOfExpr (vk_expr_s bigf e)
@@ -1196,14 +1268,18 @@ and vk_decl_s = fun bigf d ->
           iif ii)
 
 
-  and aux ({v_namei = var; v_type = t; 
-            v_storage = sto; v_local= local; v_attr = attrs}, iicomma) = 
+  and aux ({v_namei = var; 
+            v_type = t; 
+            v_storage = sto; 
+            v_local= local; 
+            v_attr = attrs}, iicomma) = 
     {v_namei = 
-        (var +> map_option (fun ((s, ini), ii_s_ini) -> 
-      (s, ini +> map_option (fun init -> vk_ini_s bigf init)),
-      iif ii_s_ini
-        )
-        );
+      (var +> map_option (fun (name, iniopt) -> 
+        vk_name_s bigf name, 
+        iniopt +> map_option (fun (info, init) -> 
+          vk_info_s bigf info,
+          vk_ini_s bigf init
+        )));
      v_type = vk_type_s bigf t;
      v_storage = sto;
      v_local = local;
@@ -1258,10 +1334,14 @@ and vk_struct_fieldkinds_s = fun bigf onefield_multivars ->
   
   onefield_multivars +> List.map (fun (field, iicomma) ->
     (match field with
-    | Simple (s, t), iis -> Simple (s, vk_type_s bigf t), iif iis
-    | BitField (sopt, t, expr), iis -> 
-        BitField (sopt, vk_type_s bigf t, vk_expr_s bigf expr), 
-        iif iis
+    | Simple (nameopt, t) -> 
+        Simple (Common.map_option (vk_name_s bigf) nameopt, 
+               vk_type_s bigf t)
+    | BitField (nameopt, t, info, expr) -> 
+        BitField (Common.map_option (vk_name_s bigf) nameopt, 
+                 vk_type_s bigf t, 
+                 vk_info_s bigf info,
+                 vk_expr_s bigf expr)
     ), iif iicomma
   )
 
@@ -1492,7 +1572,7 @@ and vk_node_s = fun bigf node ->
                  i_content = copt;
                  }     
       -> 
-        assert (copt = None);
+        assert (copt =*= None);
         F.Include {i_include = (s, iif ii);
                     i_rel_pos = h_rel_pos;
                     i_is_in_ifdef = b;
@@ -1513,8 +1593,10 @@ and vk_node_s = fun bigf node ->
     | F.Continue (st,((),ii)) -> F.Continue (st,((),iif ii))
     | F.Default  (st,((),ii)) -> F.Default  (st,((),iif ii))
     | F.Return   (st,((),ii)) -> F.Return   (st,((),iif ii))
-    | F.Goto  (st, (s,ii)) -> F.Goto  (st, (s,iif ii))
-    | F.Label (st, (s,ii)) -> F.Label (st, (s,iif ii))
+    | F.Goto  (st, name, ((),ii)) -> 
+        F.Goto  (st, vk_name_s bigf name, ((),iif ii))
+    | F.Label (st, name, ((),ii)) -> 
+        F.Label (st, vk_name_s bigf name, ((),iif ii))
     | F.EndStatement iopt -> F.EndStatement (map_option infof iopt)
     | F.DoHeader (st, info) -> F.DoHeader (st, infof info)
     | F.Else info -> F.Else (infof info)
@@ -1539,9 +1621,13 @@ and vk_node_s = fun bigf node ->
   nodef node
   
 (* ------------------------------------------------------------------------ *)
-and vk_param_s = fun bigf ((b, s, t), ii_b_s) -> 
+and vk_param_s = fun bigf param -> 
   let iif ii = vk_ii_s bigf ii in
-  ((b, s, vk_type_s bigf t), iif ii_b_s)
+  let {p_namei = swrapopt; p_register = (b, iib); p_type=ft} = param in
+  { p_namei = swrapopt +> Common.map_option (vk_name_s bigf);
+    p_register = (b, iif iib);
+    p_type = vk_type_s bigf ft;
+  }
 
 let vk_args_splitted_s = fun bigf args_splitted -> 
   let iif ii = vk_ii_s bigf ii in
index a931e58..166cf64 100644 (file)
@@ -4,18 +4,23 @@ type visitor_c = {
   kexpr      : (expression  -> unit)  * visitor_c -> expression  -> unit;
   kstatement : (statement   -> unit)  * visitor_c -> statement   -> unit;
   ktype      : (fullType    -> unit)  * visitor_c -> fullType    -> unit;
+
   kdecl      : (declaration -> unit)  * visitor_c -> declaration -> unit;
   kdef       : (definition  -> unit)  * visitor_c -> definition  -> unit;
+  kname      : (name  -> unit)        * visitor_c -> name        -> unit;
+
   kini       : (initialiser -> unit)  * visitor_c -> initialiser -> unit;
+  kfield     : (field -> unit)        * visitor_c -> field       -> unit;
+
   kcppdirective: (cpp_directive -> unit) * visitor_c -> cpp_directive -> unit;
-  kdefineval : (define_val -> unit) * visitor_c -> define_val -> unit;
+  kdefineval :   (define_val -> unit)    * visitor_c -> define_val    -> unit;
   kstatementseq: (statement_sequencable   -> unit) * visitor_c -> statement_sequencable   -> unit;
-  kfield: (field -> unit) * visitor_c -> field -> unit;
 
 
-  knode      :      
+  knode:      
     (Control_flow_c.node -> unit) * visitor_c -> Control_flow_c.node -> unit;
   ktoplevel: (toplevel -> unit) * visitor_c -> toplevel -> unit;
+
   kinfo      : (info        -> unit)  * visitor_c -> info        -> unit;
 }
 
@@ -27,6 +32,7 @@ val vk_type      : visitor_c -> fullType    -> unit
 val vk_decl      : visitor_c -> declaration -> unit
 val vk_onedecl   : visitor_c -> onedecl -> unit
 val vk_ini       : visitor_c -> initialiser -> unit
+val vk_name      : visitor_c -> name -> unit
 val vk_def       : visitor_c -> definition  -> unit
 val vk_node      : visitor_c -> Control_flow_c.node -> unit
 val vk_info      : visitor_c -> info -> unit
@@ -51,23 +57,29 @@ val vk_define_params_splitted :
 
 
 
-
+(* ------------------------------------------------------------------------ *)
 type 'a inout = 'a -> 'a
 type visitor_c_s = {
   kexpr_s      : expression     inout * visitor_c_s -> expression     inout;
   kstatement_s : statement      inout * visitor_c_s -> statement      inout;
   ktype_s      : fullType       inout * visitor_c_s -> fullType       inout;
+
   kdecl_s      : declaration    inout * visitor_c_s -> declaration    inout;
   kdef_s       : definition     inout * visitor_c_s -> definition     inout;
+  kname_s      : name           inout * visitor_c_s -> name           inout;
+
   kini_s       : initialiser    inout * visitor_c_s -> initialiser    inout;
+
   kcppdirective_s : (cpp_directive inout * visitor_c_s) -> cpp_directive inout;
   kdefineval_s : (define_val inout * visitor_c_s) -> define_val inout;
   kstatementseq_s: (statement_sequencable inout * visitor_c_s) -> statement_sequencable inout;
   kstatementseq_list_s: 
     (statement_sequencable list inout * visitor_c_s) -> statement_sequencable list inout;
+
   knode_s      : 
     Control_flow_c.node inout * visitor_c_s -> Control_flow_c.node    inout;
   ktoplevel_s  : toplevel inout * visitor_c_s -> toplevel inout;
+
   kinfo_s      : info           inout * visitor_c_s -> info           inout;
   }
 
index aa6bc06..777990c 100644 (file)
@@ -16,11 +16,9 @@ get_constants2.cmi: ast_cocci.cmi
 index.cmi: ast0_cocci.cmi 
 insert_plus.cmi: ast0_cocci.cmi 
 iso_compile.cmi: iso_pattern.cmi 
-iso_pattern.cmi: visitor_ast0.cmi ast_cocci.cmi ast0_cocci.cmi 
+iso_pattern.cmi: visitor_ast0_types.cmo ast_cocci.cmi ast0_cocci.cmi 
 merge.cmi: ast_cocci.cmi ast0_cocci.cmi 
 parse_cocci.cmi: ast_cocci.cmi 
-parser_cocci_menhir.cmi: parse_aux.cmo data.cmi ../commons/common.cmi \
-    ast_cocci.cmi ast0_cocci.cmi 
 plus.cmi: ast_cocci.cmi 
 pretty_print_cocci.cmi: ast_cocci.cmi 
 simple_assignments.cmi: ast0_cocci.cmi 
@@ -32,37 +30,41 @@ unify_ast.cmi: ast_cocci.cmi
 unitary_ast0.cmi: ast0_cocci.cmi 
 unparse_ast0.cmi: ast0_cocci.cmi 
 visitor_ast.cmi: ast_cocci.cmi 
-visitor_ast0.cmi: ast_cocci.cmi ast0_cocci.cmi 
-adjust_pragmas.cmo: visitor_ast0.cmi ast0_cocci.cmi adjust_pragmas.cmi 
-adjust_pragmas.cmx: visitor_ast0.cmx ast0_cocci.cmx adjust_pragmas.cmi 
+visitor_ast0.cmi: visitor_ast0_types.cmo ast_cocci.cmi ast0_cocci.cmi 
+adjust_pragmas.cmo: visitor_ast0_types.cmo visitor_ast0.cmi ast0_cocci.cmi \
+    adjust_pragmas.cmi 
+adjust_pragmas.cmx: visitor_ast0_types.cmx visitor_ast0.cmx ast0_cocci.cmx \
+    adjust_pragmas.cmi 
 arity.cmo: ast_cocci.cmi ast0_cocci.cmi arity.cmi 
 arity.cmx: ast_cocci.cmx ast0_cocci.cmx arity.cmi 
 ast0_cocci.cmo: type_cocci.cmi ../globals/flag.cmo ast_cocci.cmi \
     ast0_cocci.cmi 
 ast0_cocci.cmx: type_cocci.cmx ../globals/flag.cmx ast_cocci.cmx \
     ast0_cocci.cmi 
-ast0toast.cmo: visitor_ast0.cmi visitor_ast.cmi type_cocci.cmi \
-    ../globals/flag.cmo ast_cocci.cmi ast0_cocci.cmi ast0toast.cmi 
-ast0toast.cmx: visitor_ast0.cmx visitor_ast.cmx type_cocci.cmx \
-    ../globals/flag.cmx ast_cocci.cmx ast0_cocci.cmx ast0toast.cmi 
+ast0toast.cmo: visitor_ast0_types.cmo visitor_ast0.cmi visitor_ast.cmi \
+    type_cocci.cmi ../globals/flag.cmo ast_cocci.cmi ast0_cocci.cmi \
+    ast0toast.cmi 
+ast0toast.cmx: visitor_ast0_types.cmx visitor_ast0.cmx visitor_ast.cmx \
+    type_cocci.cmx ../globals/flag.cmx ast_cocci.cmx ast0_cocci.cmx \
+    ast0toast.cmi 
 ast_cocci.cmo: type_cocci.cmi ../commons/common.cmi ast_cocci.cmi 
 ast_cocci.cmx: type_cocci.cmx ../commons/common.cmx ast_cocci.cmi 
-check_meta.cmo: visitor_ast0.cmi type_cocci.cmi ../commons/common.cmi \
-    ast_cocci.cmi ast0_cocci.cmi check_meta.cmi 
-check_meta.cmx: visitor_ast0.cmx type_cocci.cmx ../commons/common.cmx \
-    ast_cocci.cmx ast0_cocci.cmx check_meta.cmi 
-comm_assoc.cmo: visitor_ast0.cmi unparse_ast0.cmi ../globals/flag.cmo \
-    ast_cocci.cmi ast0_cocci.cmi comm_assoc.cmi 
-comm_assoc.cmx: visitor_ast0.cmx unparse_ast0.cmx ../globals/flag.cmx \
-    ast_cocci.cmx ast0_cocci.cmx comm_assoc.cmi 
+check_meta.cmo: visitor_ast0_types.cmo visitor_ast0.cmi type_cocci.cmi \
+    ../commons/common.cmi ast_cocci.cmi ast0_cocci.cmi check_meta.cmi 
+check_meta.cmx: visitor_ast0_types.cmx visitor_ast0.cmx type_cocci.cmx \
+    ../commons/common.cmx ast_cocci.cmx ast0_cocci.cmx check_meta.cmi 
+comm_assoc.cmo: visitor_ast0_types.cmo visitor_ast0.cmi unparse_ast0.cmi \
+    ../globals/flag.cmo ast_cocci.cmi ast0_cocci.cmi comm_assoc.cmi 
+comm_assoc.cmx: visitor_ast0_types.cmx visitor_ast0.cmx unparse_ast0.cmx \
+    ../globals/flag.cmx ast_cocci.cmx ast0_cocci.cmx comm_assoc.cmi 
 compute_lines.cmo: ast_cocci.cmi ast0_cocci.cmi compute_lines.cmi 
 compute_lines.cmx: ast_cocci.cmx ast0_cocci.cmx compute_lines.cmi 
-context_neg.cmo: visitor_ast0.cmi unparse_ast0.cmi index.cmi \
-    ../globals/flag.cmo compute_lines.cmi ../commons/common.cmi ast_cocci.cmi \
-    ast0_cocci.cmi context_neg.cmi 
-context_neg.cmx: visitor_ast0.cmx unparse_ast0.cmx index.cmx \
-    ../globals/flag.cmx compute_lines.cmx ../commons/common.cmx ast_cocci.cmx \
-    ast0_cocci.cmx context_neg.cmi 
+context_neg.cmo: visitor_ast0_types.cmo visitor_ast0.cmi unparse_ast0.cmi \
+    index.cmi ../globals/flag.cmo compute_lines.cmi ../commons/common.cmi \
+    ast_cocci.cmi ast0_cocci.cmi context_neg.cmi 
+context_neg.cmx: visitor_ast0_types.cmx visitor_ast0.cmx unparse_ast0.cmx \
+    index.cmx ../globals/flag.cmx compute_lines.cmx ../commons/common.cmx \
+    ast_cocci.cmx ast0_cocci.cmx context_neg.cmi 
 data.cmo: type_cocci.cmi ast_cocci.cmi ast0_cocci.cmi data.cmi 
 data.cmx: type_cocci.cmx ast_cocci.cmx ast0_cocci.cmx data.cmi 
 disjdistr.cmo: visitor_ast.cmi ../globals/flag.cmo ../commons/common.cmi \
@@ -73,12 +75,12 @@ free_vars.cmo: visitor_ast.cmi type_cocci.cmi ../commons/common.cmi \
     ast_cocci.cmi free_vars.cmi 
 free_vars.cmx: visitor_ast.cmx type_cocci.cmx ../commons/common.cmx \
     ast_cocci.cmx free_vars.cmi 
-function_prototypes.cmo: visitor_ast0.cmi iso_pattern.cmi insert_plus.cmi \
-    context_neg.cmi compute_lines.cmi ast_cocci.cmi ast0toast.cmi \
-    ast0_cocci.cmi function_prototypes.cmi 
-function_prototypes.cmx: visitor_ast0.cmx iso_pattern.cmx insert_plus.cmx \
-    context_neg.cmx compute_lines.cmx ast_cocci.cmx ast0toast.cmx \
-    ast0_cocci.cmx function_prototypes.cmi 
+function_prototypes.cmo: visitor_ast0_types.cmo visitor_ast0.cmi \
+    iso_pattern.cmi insert_plus.cmi context_neg.cmi compute_lines.cmi \
+    ast_cocci.cmi ast0toast.cmi ast0_cocci.cmi function_prototypes.cmi 
+function_prototypes.cmx: visitor_ast0_types.cmx visitor_ast0.cmx \
+    iso_pattern.cmx insert_plus.cmx context_neg.cmx compute_lines.cmx \
+    ast_cocci.cmx ast0toast.cmx ast0_cocci.cmx function_prototypes.cmi 
 get_constants.cmo: visitor_ast.cmi type_cocci.cmi ../globals/flag.cmo \
     ../commons/common.cmi ast_cocci.cmi get_constants.cmi 
 get_constants.cmx: visitor_ast.cmx type_cocci.cmx ../globals/flag.cmx \
@@ -89,28 +91,24 @@ get_constants2.cmx: visitor_ast.cmx type_cocci.cmx ../globals/flag.cmx \
     ../commons/common.cmx ast_cocci.cmx get_constants2.cmi 
 index.cmo: ast_cocci.cmi ast0_cocci.cmi index.cmi 
 index.cmx: ast_cocci.cmx ast0_cocci.cmx index.cmi 
-insert_plus.cmo: visitor_ast0.cmi pretty_print_cocci.cmi context_neg.cmi \
-    ast_cocci.cmi ast0toast.cmi ast0_cocci.cmi insert_plus.cmi 
-insert_plus.cmx: visitor_ast0.cmx pretty_print_cocci.cmx context_neg.cmx \
-    ast_cocci.cmx ast0toast.cmx ast0_cocci.cmx insert_plus.cmi 
-iso_compile.cmo: visitor_ast0.cmi ../commons/common.cmi ast_cocci.cmi \
-    ast0_cocci.cmi iso_compile.cmi 
-iso_compile.cmx: visitor_ast0.cmx ../commons/common.cmx ast_cocci.cmx \
-    ast0_cocci.cmx iso_compile.cmi 
-iso_pattern.cmo: visitor_ast0.cmi unparse_ast0.cmi type_cocci.cmi \
-    flag_parsing_cocci.cmo ../globals/flag.cmo \
+insert_plus.cmo: visitor_ast0_types.cmo visitor_ast0.cmi \
+    pretty_print_cocci.cmi context_neg.cmi ast_cocci.cmi ast0toast.cmi \
+    ast0_cocci.cmi insert_plus.cmi 
+insert_plus.cmx: visitor_ast0_types.cmx visitor_ast0.cmx \
+    pretty_print_cocci.cmx context_neg.cmx ast_cocci.cmx ast0toast.cmx \
+    ast0_cocci.cmx insert_plus.cmi 
+iso_compile.cmo: visitor_ast0_types.cmo visitor_ast0.cmi \
+    ../commons/common.cmi ast_cocci.cmi ast0_cocci.cmi iso_compile.cmi 
+iso_compile.cmx: visitor_ast0_types.cmx visitor_ast0.cmx \
+    ../commons/common.cmx ast_cocci.cmx ast0_cocci.cmx iso_compile.cmi 
+iso_pattern.cmo: visitor_ast0_types.cmo visitor_ast0.cmi unparse_ast0.cmi \
+    type_cocci.cmi flag_parsing_cocci.cmo ../globals/flag.cmo \
     ../commons/ocamlextra/dumper.cmi compute_lines.cmi ../commons/common.cmi \
     ast_cocci.cmi ast0_cocci.cmi iso_pattern.cmi 
-iso_pattern.cmx: visitor_ast0.cmx unparse_ast0.cmx type_cocci.cmx \
-    flag_parsing_cocci.cmx ../globals/flag.cmx \
+iso_pattern.cmx: visitor_ast0_types.cmx visitor_ast0.cmx unparse_ast0.cmx \
+    type_cocci.cmx flag_parsing_cocci.cmx ../globals/flag.cmx \
     ../commons/ocamlextra/dumper.cmx compute_lines.cmx ../commons/common.cmx \
     ast_cocci.cmx ast0_cocci.cmx iso_pattern.cmi 
-lexer_cocci.cmo: parser_cocci_menhir.cmi parse_aux.cmo ../globals/flag.cmo \
-    data.cmi ../commons/common.cmi ast_cocci.cmi ast0_cocci.cmi 
-lexer_cocci.cmx: parser_cocci_menhir.cmx parse_aux.cmx ../globals/flag.cmx \
-    data.cmx ../commons/common.cmx ast_cocci.cmx ast0_cocci.cmx 
-lexer_script.cmo: parser_cocci_menhir.cmi data.cmi ast_cocci.cmi 
-lexer_script.cmx: parser_cocci_menhir.cmx data.cmx ast_cocci.cmx 
 main.cmo: parse_cocci.cmi 
 main.cmx: parse_cocci.cmx 
 merge.cmo: visitor_ast0.cmi ast_cocci.cmi ast0_cocci.cmi merge.cmi 
@@ -119,67 +117,69 @@ parse_aux.cmo: type_cocci.cmi semantic_cocci.cmo ../globals/flag.cmo data.cmi \
     ../commons/common.cmi ast_cocci.cmi ast0_cocci.cmi 
 parse_aux.cmx: type_cocci.cmx semantic_cocci.cmx ../globals/flag.cmx data.cmx \
     ../commons/common.cmx ast_cocci.cmx ast0_cocci.cmx 
-parse_cocci.cmo: visitor_ast0.cmi unitary_ast0.cmi type_infer.cmi \
-    test_exps.cmi single_statement.cmi simple_assignments.cmi \
-    semantic_cocci.cmo pretty_print_cocci.cmi parser_cocci_menhir.cmi \
-    parse_aux.cmo lexer_script.cmo lexer_cocci.cmo iso_pattern.cmi \
+parse_cocci.cmo: visitor_ast0_types.cmo visitor_ast0.cmi unitary_ast0.cmi \
+    type_infer.cmi test_exps.cmi single_statement.cmi simple_assignments.cmi \
+    semantic_cocci.cmo pretty_print_cocci.cmi parse_aux.cmo iso_pattern.cmi \
     iso_compile.cmi insert_plus.cmi get_constants2.cmi get_constants.cmi \
     function_prototypes.cmi free_vars.cmi flag_parsing_cocci.cmo \
     ../globals/flag.cmo disjdistr.cmi data.cmi context_neg.cmi \
-    ../globals/config.cmo compute_lines.cmi ../commons/common.cmi \
-    comm_assoc.cmi check_meta.cmi ast_cocci.cmi ast0toast.cmi ast0_cocci.cmi \
-    arity.cmi adjust_pragmas.cmi parse_cocci.cmi 
-parse_cocci.cmx: visitor_ast0.cmx unitary_ast0.cmx type_infer.cmx \
-    test_exps.cmx single_statement.cmx simple_assignments.cmx \
-    semantic_cocci.cmx pretty_print_cocci.cmx parser_cocci_menhir.cmx \
-    parse_aux.cmx lexer_script.cmx lexer_cocci.cmx iso_pattern.cmx \
+    compute_lines.cmi ../commons/common.cmi comm_assoc.cmi check_meta.cmi \
+    ast_cocci.cmi ast0toast.cmi ast0_cocci.cmi arity.cmi adjust_pragmas.cmi \
+    parse_cocci.cmi 
+parse_cocci.cmx: visitor_ast0_types.cmx visitor_ast0.cmx unitary_ast0.cmx \
+    type_infer.cmx test_exps.cmx single_statement.cmx simple_assignments.cmx \
+    semantic_cocci.cmx pretty_print_cocci.cmx parse_aux.cmx iso_pattern.cmx \
     iso_compile.cmx insert_plus.cmx get_constants2.cmx get_constants.cmx \
     function_prototypes.cmx free_vars.cmx flag_parsing_cocci.cmx \
     ../globals/flag.cmx disjdistr.cmx data.cmx context_neg.cmx \
-    ../globals/config.cmx compute_lines.cmx ../commons/common.cmx \
-    comm_assoc.cmx check_meta.cmx ast_cocci.cmx ast0toast.cmx ast0_cocci.cmx \
-    arity.cmx adjust_pragmas.cmx parse_cocci.cmi 
-parser_cocci_menhir.cmo: type_cocci.cmi top_level.cmi semantic_cocci.cmo \
-    parse_aux.cmo data.cmi ../commons/common.cmi ast_cocci.cmi ast0_cocci.cmi \
-    parser_cocci_menhir.cmi 
-parser_cocci_menhir.cmx: type_cocci.cmx top_level.cmx semantic_cocci.cmx \
-    parse_aux.cmx data.cmx ../commons/common.cmx ast_cocci.cmx ast0_cocci.cmx \
-    parser_cocci_menhir.cmi 
+    compute_lines.cmx ../commons/common.cmx comm_assoc.cmx check_meta.cmx \
+    ast_cocci.cmx ast0toast.cmx ast0_cocci.cmx arity.cmx adjust_pragmas.cmx \
+    parse_cocci.cmi 
 plus.cmo: visitor_ast.cmi ast_cocci.cmi plus.cmi 
 plus.cmx: visitor_ast.cmx ast_cocci.cmx plus.cmi 
 pretty_print_cocci.cmo: type_cocci.cmi ../globals/flag.cmo \
     ../commons/common.cmi ast_cocci.cmi pretty_print_cocci.cmi 
 pretty_print_cocci.cmx: type_cocci.cmx ../globals/flag.cmx \
     ../commons/common.cmx ast_cocci.cmx pretty_print_cocci.cmi 
-simple_assignments.cmo: visitor_ast0.cmi ../globals/flag.cmo \
-    ../commons/common.cmi ast_cocci.cmi ast0_cocci.cmi simple_assignments.cmi 
-simple_assignments.cmx: visitor_ast0.cmx ../globals/flag.cmx \
-    ../commons/common.cmx ast_cocci.cmx ast0_cocci.cmx simple_assignments.cmi 
-single_statement.cmo: visitor_ast0.cmi iso_pattern.cmi flag_parsing_cocci.cmo \
-    compute_lines.cmi ast_cocci.cmi ast0_cocci.cmi single_statement.cmi 
-single_statement.cmx: visitor_ast0.cmx iso_pattern.cmx flag_parsing_cocci.cmx \
-    compute_lines.cmx ast_cocci.cmx ast0_cocci.cmx single_statement.cmi 
-test_exps.cmo: visitor_ast0.cmi ast_cocci.cmi ast0_cocci.cmi test_exps.cmi 
-test_exps.cmx: visitor_ast0.cmx ast_cocci.cmx ast0_cocci.cmx test_exps.cmi 
+simple_assignments.cmo: visitor_ast0_types.cmo visitor_ast0.cmi \
+    ../globals/flag.cmo ../commons/common.cmi ast_cocci.cmi ast0_cocci.cmi \
+    simple_assignments.cmi 
+simple_assignments.cmx: visitor_ast0_types.cmx visitor_ast0.cmx \
+    ../globals/flag.cmx ../commons/common.cmx ast_cocci.cmx ast0_cocci.cmx \
+    simple_assignments.cmi 
+single_statement.cmo: visitor_ast0_types.cmo visitor_ast0.cmi iso_pattern.cmi \
+    flag_parsing_cocci.cmo compute_lines.cmi ast_cocci.cmi ast0_cocci.cmi \
+    single_statement.cmi 
+single_statement.cmx: visitor_ast0_types.cmx visitor_ast0.cmx iso_pattern.cmx \
+    flag_parsing_cocci.cmx compute_lines.cmx ast_cocci.cmx ast0_cocci.cmx \
+    single_statement.cmi 
+test_exps.cmo: visitor_ast0_types.cmo visitor_ast0.cmi ast_cocci.cmi \
+    ast0_cocci.cmi test_exps.cmi 
+test_exps.cmx: visitor_ast0_types.cmx visitor_ast0.cmx ast_cocci.cmx \
+    ast0_cocci.cmx test_exps.cmi 
 top_level.cmo: ast0_cocci.cmi top_level.cmi 
 top_level.cmx: ast0_cocci.cmx top_level.cmi 
 type_cocci.cmo: type_cocci.cmi 
 type_cocci.cmx: type_cocci.cmi 
-type_infer.cmo: visitor_ast0.cmi type_cocci.cmi ast_cocci.cmi ast0_cocci.cmi \
-    type_infer.cmi 
-type_infer.cmx: visitor_ast0.cmx type_cocci.cmx ast_cocci.cmx ast0_cocci.cmx \
-    type_infer.cmi 
+type_infer.cmo: visitor_ast0_types.cmo visitor_ast0.cmi type_cocci.cmi \
+    ast_cocci.cmi ast0_cocci.cmi type_infer.cmi 
+type_infer.cmx: visitor_ast0_types.cmx visitor_ast0.cmx type_cocci.cmx \
+    ast_cocci.cmx ast0_cocci.cmx type_infer.cmi 
 unify_ast.cmo: visitor_ast.cmi ast_cocci.cmi unify_ast.cmi 
 unify_ast.cmx: visitor_ast.cmx ast_cocci.cmx unify_ast.cmi 
-unitary_ast0.cmo: visitor_ast0.cmi ../globals/flag.cmo ast_cocci.cmi \
-    ast0_cocci.cmi unitary_ast0.cmi 
-unitary_ast0.cmx: visitor_ast0.cmx ../globals/flag.cmx ast_cocci.cmx \
-    ast0_cocci.cmx unitary_ast0.cmi 
+unitary_ast0.cmo: visitor_ast0_types.cmo visitor_ast0.cmi ../globals/flag.cmo \
+    ast_cocci.cmi ast0_cocci.cmi unitary_ast0.cmi 
+unitary_ast0.cmx: visitor_ast0_types.cmx visitor_ast0.cmx ../globals/flag.cmx \
+    ast_cocci.cmx ast0_cocci.cmx unitary_ast0.cmi 
 unparse_ast0.cmo: type_cocci.cmi pretty_print_cocci.cmi ../commons/common.cmi \
     ast0_cocci.cmi unparse_ast0.cmi 
 unparse_ast0.cmx: type_cocci.cmx pretty_print_cocci.cmx ../commons/common.cmx \
     ast0_cocci.cmx unparse_ast0.cmi 
-visitor_ast.cmo: ast_cocci.cmi visitor_ast.cmi 
-visitor_ast.cmx: ast_cocci.cmx visitor_ast.cmi 
-visitor_ast0.cmo: ast_cocci.cmi ast0_cocci.cmi visitor_ast0.cmi 
-visitor_ast0.cmx: ast_cocci.cmx ast0_cocci.cmx visitor_ast0.cmi 
+visitor_ast.cmo: ast_cocci.cmi ast0_cocci.cmi visitor_ast.cmi 
+visitor_ast.cmx: ast_cocci.cmx ast0_cocci.cmx visitor_ast.cmi 
+visitor_ast0.cmo: visitor_ast0_types.cmo ast_cocci.cmi ast0_cocci.cmi \
+    visitor_ast0.cmi 
+visitor_ast0.cmx: visitor_ast0_types.cmx ast_cocci.cmx ast0_cocci.cmx \
+    visitor_ast0.cmi 
+visitor_ast0_types.cmo: ast_cocci.cmi ast0_cocci.cmi 
+visitor_ast0_types.cmx: ast_cocci.cmx ast0_cocci.cmx 
index b0044d9..cf02ae3 100644 (file)
@@ -26,7 +26,7 @@ LEXER_SOURCES = lexer_cocci.mll
 SCRIPT_LEXER_SOURCES = lexer_script.mll
 PARSER_SOURCES = parser_cocci_menhir.mly
 SOURCES = flag_parsing_cocci.ml type_cocci.ml ast_cocci.ml ast0_cocci.ml \
-pretty_print_cocci.ml unparse_ast0.ml \
+pretty_print_cocci.ml unparse_ast0.ml visitor_ast0_types.ml \
 visitor_ast.ml visitor_ast0.ml compute_lines.ml comm_assoc.ml \
 iso_pattern.ml iso_compile.ml single_statement.ml simple_assignments.ml \
 ast0toast.ml check_meta.ml top_level.ml type_infer.ml test_exps.ml \
@@ -37,7 +37,7 @@ $(LEXER_SOURCES:.mll=.ml) $(PARSER_SOURCES:.mly=.ml) \
 $(SCRIPT_LEXER_SOURCES:.mll=.ml) \
 get_constants.ml get_constants2.ml parse_cocci.ml
 
-LIBS=../commons/commons.cma ../globals/globals.cma 
+LIBS=../commons/commons.cma ../globals/globals.cma
 SYSLIBS = str.cma unix.cma
 
 #MENHIR_PATH=$(shell ocamlfind query menhirLib)
@@ -77,7 +77,7 @@ $(LIB): $(GENERATED) $(OBJS)
        $(OCAMLC) -I $(MENHIR_PATH) -a -o $(LIB) $(MENHIR) $(OBJS)
 
 
-$(OPTLIB): $(GENERATED) $(OPTOBJS) 
+$(OPTLIB): $(GENERATED) $(OPTOBJS)
        $(OCAMLOPT) -I $(MENHIR_PATH) -a -o $(OPTLIB) $(MENHIRO) $(OPTOBJS)
 
 
@@ -89,7 +89,7 @@ $(EXEC): $(OBJS) main.cmo $(LIBS)
 
 clean::
        rm -f $(LIB)
-       rm -f $(OPTLIB) $(LIB:.cma=.a)  
+       rm -f $(OPTLIB) $(LIB:.cma=.a)
        rm -f $(TARGET)
 
 
@@ -122,7 +122,10 @@ clean::
 # clean rule for others files
 clean::
        rm -f *.cm[iox] *.o *.annot
-       rm -f *~ .*~ #*# 
+       rm -f *~ .*~ #*#
+
+distclean::
+       rm -f .depend
 
 depend: $(GENERATED)
        $(OCAMLDEP) *.mli *.ml > .depend
index d4a9f8c..8688e5c 100644 (file)
@@ -3,6 +3,7 @@ given None, because they can accomodate their own directives or comments *)
 
 module Ast0 = Ast0_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 
 let call_right processor data s cont =
   match processor data with
@@ -243,9 +244,6 @@ let rec left_decl decl =
       call_right left_decl d decl (function decl -> Ast0.UniqueDecl(decl))
 
 let process =
-  let donothing r k e = k e in
-  let mcode x = x in
-
   let statement r k s =
     let s = k s in
     Ast0.rewrap s
@@ -295,9 +293,6 @@ let process =
       | _ -> Ast0.unwrap s) in
 
   let res = V0.rebuilder
-      mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-      donothing donothing donothing donothing donothing donothing
-      donothing donothing donothing donothing donothing donothing statement
-      donothing donothing in
+      {V0.rebuilder_functions with VT0.rebuilder_stmtfn = statement} in
 
-  List.map res.V0.rebuilder_top_level
+  List.map res.VT0.rebuilder_rec_top_level
index 462a24d..cee3396 100644 (file)
@@ -384,6 +384,8 @@ and parsed_rule =
        (rule * Ast.metavar list) * Ast.ruletype
   | ScriptRule of
       string * Ast.dependency * (string * Ast.meta_name) list * string
+  | InitialScriptRule of string * string
+  | FinalScriptRule of string * string
 
 (* --------------------------------------------------------------------- *)
 
index bd78144..f6db914 100644 (file)
@@ -360,6 +360,8 @@ and parsed_rule =
   | ScriptRule of
       string * Ast_cocci.dependency * (string * Ast_cocci.meta_name) list *
        string
+  | InitialScriptRule of string * string
+  | FinalScriptRule of string * string
 
 (* --------------------------------------------------------------------- *)
 
index 33c0349..d8a0ed9 100644 (file)
@@ -28,6 +28,7 @@ rule_elems, and on subterms if the context is ? also. *)
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 module V = Visitor_ast
 
 let unitary = Type_cocci.Unitary
@@ -163,7 +164,7 @@ let inline_mcodes =
              (einfo.Ast0.attachable_end,einfo.Ast0.mcode_end)
        | (Ast.NOTHING,_,_) -> ())
     | Ast0.PLUS -> () in
-  V0.combiner bind option_default
+  V0.flat_combiner bind option_default
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     mcode mcode
     do_nothing do_nothing do_nothing do_nothing do_nothing do_nothing
@@ -188,28 +189,28 @@ let check_allminus =
   let expression r k e =
     match Ast0.unwrap e with
       Ast0.DisjExpr(starter,expr_list,mids,ender) ->
-       List.for_all r.V0.combiner_expression expr_list
+       List.for_all r.VT0.combiner_rec_expression expr_list
     | _ -> k e in
 
   let declaration r k e =
     match Ast0.unwrap e with
       Ast0.DisjDecl(starter,decls,mids,ender) ->
-       List.for_all r.V0.combiner_declaration decls
+       List.for_all r.VT0.combiner_rec_declaration decls
     | _ -> k e in
 
   let typeC r k e =
     match Ast0.unwrap e with
       Ast0.DisjType(starter,decls,mids,ender) ->
-       List.for_all r.V0.combiner_typeC decls
+       List.for_all r.VT0.combiner_rec_typeC decls
     | _ -> k e in
 
   let statement r k e =
     match Ast0.unwrap e with
       Ast0.Disj(starter,statement_dots_list,mids,ender) ->
-       List.for_all r.V0.combiner_statement_dots statement_dots_list
+       List.for_all r.VT0.combiner_rec_statement_dots statement_dots_list
     | _ -> k e in
 
-  V0.combiner bind option_default
+  V0.flat_combiner bind option_default
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     mcode mcode
     donothing donothing donothing donothing donothing donothing
@@ -434,7 +435,7 @@ and base_typeC t =
        (typeC ty,mcode lp1,mcode star,mcode rp1,
         mcode lp2,parameter_list params,mcode rp2)
   | Ast0.FunctionType(ret,lp,params,rp) ->
-      let allminus = check_allminus.V0.combiner_typeC t in
+      let allminus = check_allminus.VT0.combiner_rec_typeC t in
       Ast.FunctionType
        (allminus,get_option typeC ret,mcode lp,
         parameter_list params,mcode rp)
@@ -472,7 +473,7 @@ and declaration d =
     | Ast0.UnInit(stg,ty,id,sem) ->
        (match Ast0.unwrap ty with
          Ast0.FunctionType(tyx,lp1,params,rp1) ->
-           let allminus = check_allminus.V0.combiner_declaration d in
+           let allminus = check_allminus.VT0.combiner_rec_declaration d in
            Ast.UnInit(get_option mcode stg,
                       rewrap ty (do_isos (Ast0.get_iso ty))
                         (Ast.Type
@@ -597,7 +598,7 @@ and statement s =
        Ast0.Decl((_,bef),decl) ->
          Ast.Atomic(rewrap_rule_elem s
                       (Ast.Decl(convert_mcodekind bef,
-                                check_allminus.V0.combiner_statement s,
+                                check_allminus.VT0.combiner_rec_statement s,
                                 declaration decl)))
       | Ast0.Seq(lbrace,body,rbrace) ->
          let lbrace = mcode lbrace in
@@ -744,7 +745,7 @@ and statement s =
          let lbrace = mcode lbrace in
          let (decls,body) = separate_decls seqible body in
          let rbrace = mcode rbrace in
-         let allminus = check_allminus.V0.combiner_statement s in
+         let allminus = check_allminus.VT0.combiner_rec_statement s in
          Ast.FunDecl(rewrap_rule_elem s
                        (Ast.FunHeader(convert_mcodekind bef,
                                       allminus,fi,name,lp,params,rp)),
@@ -934,10 +935,10 @@ and top_level t =
 down to the mcodes.  The functions above can only be used when there is no
 attached + code, eg in + code itself. *)
 let ast0toast_toplevel x =
-  inline_mcodes.V0.combiner_top_level x;
+  inline_mcodes.VT0.combiner_rec_top_level x;
   top_level x
 
 let ast0toast name deps dropped exists x is_exp ruletype =
-  List.iter inline_mcodes.V0.combiner_top_level x;
+  List.iter inline_mcodes.VT0.combiner_rec_top_level x;
   Ast.CocciRule
     (name,(deps,dropped,exists),List.map top_level x,is_exp,ruletype)
index ff69cc6..164be27 100644 (file)
@@ -35,7 +35,7 @@ type 'a wrap =
       node_line : line;
       free_vars : meta_name list; (*free vars*)
       minus_free_vars : meta_name list; (*minus free vars*)
-      fresh_vars : meta_name list; (*fresh vars*)
+      fresh_vars : (meta_name * string (*seed*) option) list; (*fresh vars*)
       inherited : meta_name list; (*inherited vars*)
       saved_witness : meta_name list; (*witness vars*)
       bef_aft : dots_bef_aft;
@@ -72,8 +72,8 @@ and keep_binding = Type_cocci.keep_binding
 and multi = bool (*true if a nest is one or more, false if it is zero or more*)
 
 and end_info =
-    meta_name list (*free vars*) * meta_name list (*inherited vars*) *
-      meta_name list (*witness vars*) * mcodekind
+    meta_name list (*free vars*) * (meta_name * string option) list (*fresh*) *
+      meta_name list (*inherited vars*) * mcodekind
 
 (* --------------------------------------------------------------------- *)
 (* Metavariables *)
@@ -82,7 +82,7 @@ and arity = UNIQUE | OPT | MULTI | NONE
 
 and metavar =
     MetaIdDecl of arity * meta_name (* name *)
-  | MetaFreshIdDecl of arity * meta_name (* name *)
+  | MetaFreshIdDecl of meta_name (* name *) * string option (* seed *)
   | MetaTypeDecl of arity * meta_name (* name *)
   | MetaInitDecl of arity * meta_name (* name *)
   | MetaListlenDecl of meta_name (* name *)
@@ -237,7 +237,7 @@ and base_typeC =
   | StructUnionName of structUnion mcode * ident option (* name *)
   | StructUnionDef  of fullType (* either StructUnionName or metavar *) *
        string mcode (* { *) * declaration dots * string mcode (* } *)
-  | TypeName        of string mcode
+  | TypeName        of string mcode (* pad: should be 'of ident' ? *)
 
   | MetaType        of meta_name mcode * keep_binding * inherited
 
@@ -517,6 +517,8 @@ and rulename =
   | GeneratedRulename of string option * dependency *
        string list * string list * exists * bool
   | ScriptRulename of string * dependency
+  | InitialScriptRulename of string
+  | FinalScriptRulename of string
 
 and ruletype = Normal | Generated
 
@@ -525,6 +527,8 @@ and rule =
        (dependency * string list (* dropped isos *) * exists) * top_level list
        * bool list * ruletype
   | ScriptRule of string * dependency * (string * meta_name) list * string
+  | InitialScriptRule of string (*language*) * string (*code*)
+  | FinalScriptRule of string (*language*) * string (*code*)
 
 and dependency =
     Dep of string (* rule applies for the current binding *)
@@ -622,7 +626,7 @@ let get_wcfvs (whencode : ('a wrap, 'b wrap) whencode list) =
 
 let get_meta_name = function
     MetaIdDecl(ar,nm) -> nm
-  | MetaFreshIdDecl(ar,nm) -> nm
+  | MetaFreshIdDecl(nm,seed) -> nm
   | MetaTypeDecl(ar,nm) -> nm
   | MetaInitDecl(ar,nm) -> nm
   | MetaListlenDecl(nm) -> nm
index cb06c36..ce55a57 100644 (file)
@@ -11,7 +11,7 @@ type 'a wrap =
       node_line : line;
       free_vars : meta_name list; (*free vars*)
       minus_free_vars : meta_name list; (*minus free vars*)
-      fresh_vars : meta_name list; (*fresh vars*)
+      fresh_vars : (meta_name * string (*seed*) option) list; (*fresh vars*)
       inherited : meta_name list; (*inherited vars*)
       saved_witness : meta_name list; (*witness vars*)
       bef_aft : dots_bef_aft;
@@ -47,8 +47,8 @@ and keep_binding = Type_cocci.keep_binding
 and multi = bool (*true if a nest is one or more, false if it is zero or more*)
 
 and end_info =
-    meta_name list (*free vars*) * meta_name list (*inherited vars*) *
-      meta_name list (*witness vars*) * mcodekind
+    meta_name list (*free vars*) * (meta_name * string option) list (*fresh*) *
+      meta_name list (*inherited vars*) * mcodekind
 
 (* --------------------------------------------------------------------- *)
 (* Metavariables *)
@@ -57,7 +57,7 @@ and arity = UNIQUE | OPT | MULTI | NONE
 
 and metavar =
     MetaIdDecl of arity * meta_name (* name *)
-  | MetaFreshIdDecl of arity * meta_name (* name *)
+  | MetaFreshIdDecl of meta_name (* name *) * string option (* seed *)
   | MetaTypeDecl of arity * meta_name (* name *)
   | MetaInitDecl of arity * meta_name (* name *)
   | MetaListlenDecl of meta_name (* name *)
@@ -480,6 +480,8 @@ and rulename =
        string list * string list * exists * bool
       (* true if the whole thing is an expression *)
   | ScriptRulename of string * dependency
+  | InitialScriptRulename of string
+  | FinalScriptRulename of string
 
 and ruletype = Normal | Generated
 
@@ -488,6 +490,8 @@ and rule =
        (dependency * string list (* dropped isos *) * exists) *
        top_level list * bool list (* true if generates an exp *) * ruletype
   | ScriptRule of string * dependency * (string * meta_name) list * string
+  | InitialScriptRule of string * string
+  | FinalScriptRule of string * string
 
 and dependency =
     Dep of string (* rule applies for the current binding *)
@@ -558,7 +562,7 @@ val get_wcfvs : ('a wrap,'b wrap) whencode list -> meta_name list
 val set_fvs : meta_name list -> 'a wrap -> 'a wrap
 val get_mfvs : 'a wrap -> meta_name list
 val set_mfvs : meta_name list -> 'a wrap -> 'a wrap
-val get_fresh : 'a wrap -> meta_name list
+val get_fresh : 'a wrap -> (meta_name * string option) list
 val get_inherited : 'a wrap -> meta_name list
 val get_saved : 'a wrap -> meta_name list
 val get_dots_bef_aft : statement -> dots_bef_aft
@@ -581,12 +585,12 @@ val no_info : info
 
 val make_meta_rule_elem :
     string -> mcodekind ->
-      (meta_name list * meta_name list * meta_name list) ->
+      (meta_name list * (meta_name * string option) list * meta_name list) ->
       rule_elem
 
 val make_meta_decl :
     string -> mcodekind ->
-      (meta_name list * meta_name list * meta_name list) ->
+      (meta_name list * (meta_name * string option) list * meta_name list) ->
       declaration
 
 val make_term : 'a -> 'a wrap
index daa2a2e..c1bf4b9 100644 (file)
@@ -28,6 +28,7 @@ fresh are used.  What is the issue about error variables? (don't remember) *)
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 
 (* all fresh identifiers *)
 let fresh_table = (Hashtbl.create(50) : ((string * string), unit) Hashtbl.t)
@@ -416,13 +417,13 @@ let positions table rules =
   let bind x y = () in
   let donothing r k e = k e in
   let fn =
-    V0.combiner bind option_default
+    V0.flat_combiner bind option_default
       mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
       donothing donothing donothing donothing donothing donothing
       donothing donothing donothing donothing donothing donothing donothing
       donothing donothing in
 
-  List.iter fn.V0.combiner_top_level rules
+  List.iter fn.VT0.combiner_rec_top_level rules
 
 let dup_positions rules =
   let mcode x =
@@ -441,33 +442,33 @@ let dup_positions rules =
     match Ast0.unwrap e with
       Ast0.DisjExpr(_,explist,_,_) ->
        List.fold_left Common.union_set option_default
-         (List.map r.V0.combiner_expression explist)
+         (List.map r.VT0.combiner_rec_expression explist)
     | _ -> k e in
 
   let typeC r k e = (* not sure relevent because "only after iso" *)
     match Ast0.unwrap e with
       Ast0.DisjType(_,types,_,_) ->
        List.fold_left Common.union_set option_default
-         (List.map r.V0.combiner_typeC types)
+         (List.map r.VT0.combiner_rec_typeC types)
     | _ -> k e in
 
   let declaration r k e =
     match Ast0.unwrap e with
       Ast0.DisjDecl(_,decls,_,_) ->
        List.fold_left Common.union_set option_default
-         (List.map r.V0.combiner_declaration decls)
+         (List.map r.VT0.combiner_rec_declaration decls)
     | _ -> k e in
 
   let statement r k e =
     match Ast0.unwrap e with
       Ast0.Disj(_,stmts,_,_) ->
        List.fold_left Common.union_set option_default
-         (List.map r.V0.combiner_statement_dots stmts)
+         (List.map r.VT0.combiner_rec_statement_dots stmts)
     | _ -> k e in
 
   let donothing r k e = k e in
   let fn =
-    V0.combiner bind option_default
+    V0.flat_combiner bind option_default
       mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
       donothing donothing donothing donothing donothing donothing
       donothing expression typeC donothing donothing declaration statement
@@ -476,7 +477,7 @@ let dup_positions rules =
   let res =
     List.sort compare
       (List.fold_left Common.union_set option_default
-        (List.map fn.V0.combiner_top_level rules)) in
+        (List.map fn.VT0.combiner_rec_top_level rules)) in
   let rec loop = function
       [] | [_] -> ()
     | ((rule,name) as x)::y::_ when x = y ->
index 124b8d8..60857d0 100644 (file)
@@ -28,6 +28,7 @@ Nested is not used before this phase. *)
 module Ast = Ast_cocci
 module Ast0 = Ast0_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 
 let comm_assoc =
   [Ast.Arith(Ast.Plus);Ast.Arith(Ast.Mul);Ast.Arith(Ast.And);Ast.Arith(Ast.Or);
@@ -46,8 +47,6 @@ let nopos mc =
   match Ast0.get_pos mc with Ast0.MetaPos _ -> false | Ast0.NoMetaPos -> true
 
 let process_binops rule_name =
-  let donothing r k e = k e in
-  let mcode x = x in
   let expr r k e1 =
     let e = k e1 in
     match Ast0.unwrap e with
@@ -73,13 +72,9 @@ let process_binops rule_name =
             e)
        | _ -> e)
     | _ -> e in
-  V0.rebuilder
-    mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-    donothing donothing donothing donothing donothing donothing
-    donothing expr donothing donothing donothing donothing donothing
-    donothing donothing
+  V0.rebuilder {V0.rebuilder_functions with VT0.rebuilder_exprfn = expr}
 
 let comm_assoc rule rule_name dropped_isos =
   if List.mem "comm_assoc" dropped_isos
   then rule
-  else List.map (process_binops rule_name).V0.rebuilder_top_level rule
+  else List.map (process_binops rule_name).VT0.rebuilder_rec_top_level rule
index 9341b33..93de14b 100644 (file)
@@ -29,6 +29,7 @@ plus subtrees. *)
 module Ast = Ast_cocci
 module Ast0 = Ast0_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 module U = Unparse_ast0
 
 (* --------------------------------------------------------------------- *)
@@ -143,12 +144,12 @@ let collect_plus_lines top =
       Ast0.PLUS -> insert info.Ast0.pos_info.Ast0.line_start
     | _ -> () in
   let fn =
-    V0.combiner bind option_default
+    V0.flat_combiner bind option_default
       mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
       donothing donothing donothing donothing donothing donothing
       donothing donothing donothing donothing donothing donothing donothing
       donothing donothing in
-  fn.V0.combiner_top_level top
+  fn.VT0.combiner_rec_top_level top
 
 (* --------------------------------------------------------------------- *)
 
@@ -330,7 +331,7 @@ let classify is_minus all_marked table code =
       | Ast0.Estars(dots,whencode) ->
          k (Ast0.rewrap e (Ast0.Estars(dots,None)))
       | Ast0.DisjExpr(starter,expr_list,_,ender) ->
-         disj_cases e starter expr_list r.V0.combiner_expression ender
+         disj_cases e starter expr_list r.VT0.combiner_rec_expression ender
       |        _ -> k e) in
 
   (* not clear why we have the next two cases, since DisjDecl and
@@ -339,7 +340,7 @@ let classify is_minus all_marked table code =
     compute_result Ast0.decl e
       (match Ast0.unwrap e with
        Ast0.DisjDecl(starter,decls,_,ender) ->
-         disj_cases e starter decls r.V0.combiner_declaration ender
+         disj_cases e starter decls r.VT0.combiner_rec_declaration ender
       | Ast0.Ddots(dots,whencode) ->
          k (Ast0.rewrap e (Ast0.Ddots(dots,None)))
        (* Need special cases for the following so that the type will be
@@ -353,14 +354,14 @@ let classify is_minus all_marked table code =
           reordering their components. *)
       |        Ast0.Init(stg,ty,id,eq,ini,sem) ->
          bind (match stg with Some stg -> mcode stg | _ -> option_default)
-           (bind (r.V0.combiner_typeC ty)
-              (bind (r.V0.combiner_ident id)
+           (bind (r.VT0.combiner_rec_typeC ty)
+              (bind (r.VT0.combiner_rec_ident id)
                  (bind (mcode eq)
-                    (bind (r.V0.combiner_initialiser ini) (mcode sem)))))
+                    (bind (r.VT0.combiner_rec_initialiser ini) (mcode sem)))))
       | Ast0.UnInit(stg,ty,id,sem) ->
          bind (match stg with Some stg -> mcode stg | _ -> option_default)
-           (bind (r.V0.combiner_typeC ty)
-              (bind (r.V0.combiner_ident id) (mcode sem)))
+           (bind (r.VT0.combiner_rec_typeC ty)
+              (bind (r.VT0.combiner_rec_ident id) (mcode sem)))
       |        _ -> k e) in
 
   let param r k e =
@@ -368,14 +369,14 @@ let classify is_minus all_marked table code =
       (match Ast0.unwrap e with
        Ast0.Param(ty,Some id) ->
          (* needed for the same reason as in the Init and UnInit cases *)
-         bind (r.V0.combiner_typeC ty) (r.V0.combiner_ident id)
+         bind (r.VT0.combiner_rec_typeC ty) (r.VT0.combiner_rec_ident id)
       |        _ -> k e) in
 
   let typeC r k e =
     compute_result Ast0.typeC e
       (match Ast0.unwrap e with
        Ast0.DisjType(starter,types,_,ender) ->
-         disj_cases e starter types r.V0.combiner_typeC ender
+         disj_cases e starter types r.VT0.combiner_rec_typeC ender
       |        _ -> k e) in
 
   let initialiser r k i =
@@ -397,7 +398,7 @@ let classify is_minus all_marked table code =
       | Ast0.Stars(dots,whencode) ->
          k (Ast0.rewrap s (Ast0.Stars(dots,[])))
       | Ast0.Disj(starter,statement_dots_list,_,ender) ->
-         disj_cases s starter statement_dots_list r.V0.combiner_statement_dots
+         disj_cases s starter statement_dots_list r.VT0.combiner_rec_statement_dots
            ender
        (* cases for everything with extra mcode *)
       |        Ast0.FunDecl((info,bef),_,_,_,_,_,_,_,_)
@@ -416,14 +417,14 @@ let classify is_minus all_marked table code =
   let do_top builder r k e = compute_result builder e (k e) in
 
   let combiner =
-    V0.combiner bind option_default
+    V0.flat_combiner bind option_default
       mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
       (do_nothing Ast0.dotsExpr) (do_nothing Ast0.dotsInit)
       (do_nothing Ast0.dotsParam) (do_nothing Ast0.dotsStmt)
       (do_nothing Ast0.dotsDecl) (do_nothing Ast0.dotsCase)
       (do_nothing Ast0.ident) expression typeC initialiser param declaration
       statement (do_nothing Ast0.case_line) (do_top Ast0.top) in
-  combiner.V0.combiner_top_level code
+  combiner.VT0.combiner_rec_top_level code
 
 (* --------------------------------------------------------------------- *)
 (* Traverse the hash tables and find corresponding context nodes that have
@@ -753,7 +754,7 @@ let contextify_all =
   let mcode x = () in
   let do_nothing r k e = Ast0.set_mcodekind e (default_context()); k e in
 
-  V0.combiner bind option_default
+  V0.flat_combiner bind option_default
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     do_nothing do_nothing do_nothing do_nothing do_nothing do_nothing
     do_nothing do_nothing do_nothing do_nothing do_nothing do_nothing
@@ -762,8 +763,6 @@ let contextify_all =
 let contextify_whencode =
   let bind x y = () in
   let option_default = () in
-  let mcode x = () in
-  let do_nothing r k e = k e in
 
   let expression r k e =
     k e;
@@ -772,21 +771,21 @@ let contextify_whencode =
     | Ast0.Edots(_,Some whencode)
     | Ast0.Ecircles(_,Some whencode)
     | Ast0.Estars(_,Some whencode) ->
-       contextify_all.V0.combiner_expression whencode
+       contextify_all.VT0.combiner_rec_expression whencode
     | _ -> () in
 
   let initialiser r k i =
     match Ast0.unwrap i with
       Ast0.Idots(dots,Some whencode) ->
-       contextify_all.V0.combiner_initialiser whencode
+       contextify_all.VT0.combiner_rec_initialiser whencode
     | _ -> k i in
 
   let whencode = function
-      Ast0.WhenNot sd -> contextify_all.V0.combiner_statement_dots sd
-    | Ast0.WhenAlways s -> contextify_all.V0.combiner_statement s
+      Ast0.WhenNot sd -> contextify_all.VT0.combiner_rec_statement_dots sd
+    | Ast0.WhenAlways s -> contextify_all.VT0.combiner_rec_statement s
     | Ast0.WhenModifier(_) -> ()
-    | Ast0.WhenNotTrue(e) -> contextify_all.V0.combiner_expression e
-    | Ast0.WhenNotFalse(e) -> contextify_all.V0.combiner_expression e in
+    | Ast0.WhenNotTrue(e) -> contextify_all.VT0.combiner_rec_expression e
+    | Ast0.WhenNotFalse(e) -> contextify_all.VT0.combiner_rec_expression e in
 
   let statement r k (s : Ast0.statement) =
     k s;
@@ -798,13 +797,11 @@ let contextify_whencode =
 
   let combiner =
     V0.combiner bind option_default
-      mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-      do_nothing do_nothing do_nothing do_nothing do_nothing do_nothing
-      do_nothing
-      expression
-      do_nothing initialiser do_nothing do_nothing statement do_nothing
-      do_nothing in
-  combiner.V0.combiner_top_level
+      {V0.combiner_functions with
+       VT0.combiner_exprfn = expression;
+       VT0.combiner_initfn = initialiser;
+       VT0.combiner_stmtfn = statement} in
+  combiner.VT0.combiner_rec_top_level
 
 (* --------------------------------------------------------------------- *)
 
index 1a208c9..98ca9fe 100644 (file)
@@ -65,6 +65,9 @@ let add_id_meta:
     (Ast.meta_name -> iconstraints -> Ast0.pure -> unit) ref =
   ref (fun _ -> failwith "uninitialized add_meta")
 
+let add_fresh_id_meta: (Ast.meta_name -> unit) ref =
+  ref (fun _ -> failwith "uninitialized add_meta")
+
 let add_type_meta: (Ast.meta_name -> Ast0.pure -> unit) ref =
   ref (fun _ -> failwith "uninitialized add_meta")
 
index 6dcb387..174babc 100644 (file)
@@ -34,6 +34,8 @@ val clear_meta: (unit -> unit) ref
 val add_id_meta:
     (Ast_cocci.meta_name -> iconstraints -> Ast0_cocci.pure -> unit) ref
 
+val add_fresh_id_meta: (Ast_cocci.meta_name -> unit) ref
+
 val add_type_meta: (Ast_cocci.meta_name -> Ast0_cocci.pure -> unit) ref
 
 val add_init_meta: (Ast_cocci.meta_name -> Ast0_cocci.pure -> unit) ref
index 1b693e7..9a033bd 100644 (file)
@@ -385,7 +385,8 @@ let disj rules =
   List.map
     (function (mv,r) ->
       match r with
-        Ast.ScriptRule _ -> (mv, r)
+        Ast.ScriptRule _
+      | Ast.InitialScriptRule _ | Ast.FinalScriptRule _ -> (mv, r)
       | Ast.CocciRule (nm, rule_info, r, isexp, ruletype) ->
          let res =
            List.map
index 371a7f8..84db93b 100644 (file)
@@ -27,3 +27,5 @@ let sgrep_mode = ref false (* no longer supported, subsumed by sgrep2 *)
 
 let show_SP = ref false
 let show_iso_failures = ref true
+
+let iso_limit = ref (None : int option) (*(Some 3)*)
index f3fbd5f..108d0c9 100644 (file)
@@ -514,11 +514,19 @@ let astfvs metavars bound =
     List.fold_left
       (function prev ->
        function
-           Ast.MetaFreshIdDecl(_,_) as x -> (Ast.get_meta_name x)::prev
+           Ast.MetaFreshIdDecl(_,seed) as x ->
+             ((Ast.get_meta_name x),seed)::prev
          | _ -> prev)
       [] metavars in
 
-  let collect_fresh = List.filter (function x -> List.mem x fresh) in
+  let collect_fresh l =
+    List.rev
+      (List.fold_left
+       (function prev ->
+         function x ->
+           try let v = List.assoc x fresh in (x,v)::prev
+           with Not_found -> prev)
+       [] l) in
 
   (* cases for the elements of anything *)
   let astfvrule_elem recursor k re =
@@ -642,7 +650,8 @@ let collect_astfvs rules =
       [] -> []
     | (metavars, rule)::rules ->
         match rule with
-          Ast.ScriptRule (_,_,_,_) ->
+          Ast.ScriptRule (_,_,_,_)
+       | Ast.InitialScriptRule (_,_) | Ast.FinalScriptRule (_,_) ->
            (* bound stays as is because script rules have no names, so no
               inheritance is possible *)
            rule::(loop bound rules)
@@ -692,7 +701,8 @@ let get_neg_pos_list (_,rule) used_after_list =
              "a variable cannot be used both as a position and a constraint");
          neg_positions)
        minirules
-  | Ast.ScriptRule _ -> [] (*no negated positions*)
+  | Ast.ScriptRule _ | Ast.InitialScriptRule _ | Ast.FinalScriptRule _ ->
+      (*no negated positions*) []
 
 (* ---------------------------------------------------------------- *)
 
@@ -719,6 +729,7 @@ let collect_top_level_used_after metavar_rule_list =
             match r with
               Ast.ScriptRule (_,_,mv,_) ->
                 List.map (function (_,(r,v)) -> (r,v)) mv
+            | Ast.InitialScriptRule (_,_) | Ast.FinalScriptRule (_,_) -> []
             | Ast.CocciRule (_,_,rule,_,_) ->
                Common.union_set (nub (collect_all_rule_refs rule))
                  (collect_in_plus rule) in
@@ -765,7 +776,9 @@ let collect_used_after metavar_rule_list =
     (function (metavars,r) ->
       function used_after ->
         match r with
-          Ast.ScriptRule (_,_,mv,_) -> ([], [used_after])
+          Ast.ScriptRule (_,_,_,_)
+       | Ast.InitialScriptRule (_,_) | Ast.FinalScriptRule (_,_) ->
+           ([], [used_after])
         | Ast.CocciRule (name, rule_info, minirules, _,_) ->
           collect_local_used_after metavars minirules used_after
     )
@@ -782,7 +795,8 @@ let free_vars rules =
     List.map
       (function (mv, r) ->
          match r with
-           Ast.ScriptRule _ -> []
+           Ast.ScriptRule _
+        | Ast.InitialScriptRule _ | Ast.FinalScriptRule _ -> []
          | Ast.CocciRule (_,_,rule,_,_) ->
            let positions =
              List.fold_left
@@ -796,7 +810,8 @@ let free_vars rules =
       (function (mv,r) ->
        function ua ->
           match r with
-            Ast.ScriptRule _ -> r
+            Ast.ScriptRule _
+         | Ast.InitialScriptRule _ | Ast.FinalScriptRule _ -> r
           | Ast.CocciRule (nm, rule_info, r, is_exp,ruletype) ->
              Ast.CocciRule
                (nm, rule_info, classify_variables mv r (List.concat ua),
index 788c685..95fe86b 100644 (file)
@@ -23,6 +23,7 @@
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 
 type id = Id of string | Meta of (string * string)
 
@@ -73,7 +74,8 @@ let get_all_functions rule =
     | _ -> [] in
   List.map
     (function (nm,def,vl) ->
-      (nm,(def,(Iso_pattern.rebuild_mcode None).V0.rebuilder_statement vl)))
+      (nm,
+       (def,(Iso_pattern.rebuild_mcode None).VT0.rebuilder_rec_statement vl)))
     res
 
 (* --------------------------------------------------------------------- *)
@@ -156,7 +158,7 @@ and strip =
             Ast0.MetaParamList(nm,lenname,Ast0.Pure)
         | e -> e)) in
 
-  V0.rebuilder
+  V0.flat_rebuilder
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     donothing donothing donothing donothing donothing donothing
     ident donothing typeC donothing param donothing donothing
@@ -165,8 +167,8 @@ and strip =
 and changed_proto = function
     (mname,mdef,mproto,None) -> true
   | (mname,mdef,mproto,Some pproto) ->
-      not ((strip.V0.rebuilder_statement mproto) =
-          (strip.V0.rebuilder_statement pproto))
+      not ((strip.VT0.rebuilder_rec_statement mproto) =
+          (strip.VT0.rebuilder_rec_statement pproto))
 
 (* --------------------------------------------------------------------- *)
 (* make rules *)
@@ -180,7 +182,7 @@ let rec drop_param_name p =
     | p -> p)
 
 let drop_names dec =
-  let dec = (Iso_pattern.rebuild_mcode None).V0.rebuilder_statement dec in
+  let dec = (Iso_pattern.rebuild_mcode None).VT0.rebuilder_rec_statement dec in
   match Ast0.unwrap dec with
     Ast0.Decl(info,uninit) ->
       (match Ast0.unwrap uninit with
index e191e32..ac9e629 100644 (file)
@@ -301,7 +301,9 @@ let get_constants rules =
         (function (rest_info,in_plus) ->
           function r ->
             match r with
-              Ast.ScriptRule (_,mv,deps,_) -> (rest_info, in_plus)
+              Ast.ScriptRule (_,_,_,_)
+           | Ast.InitialScriptRule (_,_) | Ast.FinalScriptRule (_,_) ->
+               (rest_info, in_plus)
             | Ast.CocciRule (nm, (dep,_,_), cur, _, _) ->
                 let (cur_info,cur_plus) = rule_fn cur in_plus in
                let cur_info =
index 8ca4e52..9c9f220 100644 (file)
@@ -474,6 +474,8 @@ let get_constants rules neg_pos_vars =
                  False -> (rest_info, in_plus, env, locals)
                | dependencies ->
                    (build_or dependencies rest_info, in_plus, env, locals))
+            | (Ast.InitialScriptRule (_,_),_)
+           | (Ast.FinalScriptRule (_,_),_) -> (rest_info,in_plus,env,locals)
             | (Ast.CocciRule (nm,(dep,_,_),cur,_,_),neg_pos_vars) ->
                let (cur_info,cur_plus) =
                  rule_fn cur in_plus ((nm,True)::env) neg_pos_vars in
index ff3c59a..a6ddbfc 100644 (file)
@@ -32,6 +32,7 @@ tokens, and then merge them. *)
 module Ast = Ast_cocci
 module Ast0 = Ast0_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 module CN = Context_neg
 
 let empty_isos = ref false
@@ -88,7 +89,7 @@ it *)
   let topfn r k e = Ast0.TopTag(e) :: (k e) in
 
   let res =
-    V0.combiner bind option_default
+    V0.flat_combiner bind option_default
       mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
       (donothing Ast0.dotsExpr) (donothing Ast0.dotsInit)
       (donothing Ast0.dotsParam) (donothing Ast0.dotsStmt)
@@ -96,7 +97,7 @@ it *)
       (donothing Ast0.ident) expression (donothing Ast0.typeC) initialiser
       (donothing Ast0.param) (donothing Ast0.decl) statement
       (donothing Ast0.case_line) topfn in
-  res.V0.combiner_top_level e
+  res.VT0.combiner_rec_top_level e
 
 (* --------------------------------------------------------------------- *)
 (* --------------------------------------------------------------------- *)
@@ -188,12 +189,12 @@ bind to that; not good for isomorphisms *)
     | Ast0.CIRCLES(l) -> multibind (List.map f l)
     | Ast0.STARS(l) -> multibind (List.map f l) in
 
-  let edots r k d = dots r.V0.combiner_expression k d in
-  let idots r k d = dots r.V0.combiner_initialiser k d in
-  let pdots r k d = dots r.V0.combiner_parameter k d in
-  let sdots r k d = dots r.V0.combiner_statement k d in
-  let ddots r k d = dots r.V0.combiner_declaration k d in
-  let cdots r k d = dots r.V0.combiner_case_line k d in
+  let edots r k d = dots r.VT0.combiner_rec_expression k d in
+  let idots r k d = dots r.VT0.combiner_rec_initialiser k d in
+  let pdots r k d = dots r.VT0.combiner_rec_parameter k d in
+  let sdots r k d = dots r.VT0.combiner_rec_statement k d in
+  let ddots r k d = dots r.VT0.combiner_rec_declaration k d in
+  let cdots r k d = dots r.VT0.combiner_rec_case_line k d in
 
   (* a case for everything that has a Opt *)
 
@@ -237,45 +238,46 @@ bind to that; not good for isomorphisms *)
        (Toplevel,info,bef)::(k s)
     | Ast0.Decl((info,bef),decl) -> (Decl,info,bef)::(k s)
     | Ast0.Nest(starter,stmt_dots,ender,whencode,multi) ->
-       mcode starter @ r.V0.combiner_statement_dots stmt_dots @ mcode ender
+       mcode starter @ r.VT0.combiner_rec_statement_dots stmt_dots @
+       mcode ender
     | Ast0.Dots(d,whencode) | Ast0.Circles(d,whencode)
     | Ast0.Stars(d,whencode) -> mcode d (* ignore whencode *)
     | Ast0.OptStm s | Ast0.UniqueStm s ->
        (* put the + code on the thing, not on the opt *)
-       r.V0.combiner_statement s
+       r.VT0.combiner_rec_statement s
     | _ -> do_nothing r k s in
 
   let expression r k e =
     match Ast0.unwrap e with
       Ast0.NestExpr(starter,expr_dots,ender,whencode,multi) ->
        mcode starter @
-       r.V0.combiner_expression_dots expr_dots @ mcode ender
+       r.VT0.combiner_rec_expression_dots expr_dots @ mcode ender
     | Ast0.Edots(d,whencode) | Ast0.Ecircles(d,whencode)
     | Ast0.Estars(d,whencode) -> mcode d (* ignore whencode *)
     | Ast0.OptExp e | Ast0.UniqueExp e ->
        (* put the + code on the thing, not on the opt *)
-       r.V0.combiner_expression e
+       r.VT0.combiner_rec_expression e
     | _ -> do_nothing r k e in
 
   let ident r k e =
     match Ast0.unwrap e with
       Ast0.OptIdent i | Ast0.UniqueIdent i ->
        (* put the + code on the thing, not on the opt *)
-       r.V0.combiner_ident i
+       r.VT0.combiner_rec_ident i
     | _ -> do_nothing r k e in
 
   let typeC r k e =
     match Ast0.unwrap e with
       Ast0.OptType t | Ast0.UniqueType t ->
        (* put the + code on the thing, not on the opt *)
-       r.V0.combiner_typeC t
+       r.VT0.combiner_rec_typeC t
     | _ -> do_nothing r k e in
 
   let decl r k e =
     match Ast0.unwrap e with
       Ast0.OptDecl d | Ast0.UniqueDecl d ->
        (* put the + code on the thing, not on the opt *)
-       r.V0.combiner_declaration d
+       r.VT0.combiner_rec_declaration d
     | _ -> do_nothing r k e in
 
   let initialiser r k e =
@@ -283,26 +285,26 @@ bind to that; not good for isomorphisms *)
       Ast0.Idots(d,whencode) -> mcode d (* ignore whencode *)
     | Ast0.OptIni i | Ast0.UniqueIni i ->
        (* put the + code on the thing, not on the opt *)
-       r.V0.combiner_initialiser i
+       r.VT0.combiner_rec_initialiser i
     | _ -> do_nothing r k e in
 
   let param r k e =
     match Ast0.unwrap e with
       Ast0.OptParam p | Ast0.UniqueParam p ->
        (* put the + code on the thing, not on the opt *)
-       r.V0.combiner_parameter p
+       r.VT0.combiner_rec_parameter p
     | _ -> do_nothing r k e in
 
   let case_line r k e =
     match Ast0.unwrap e with
       Ast0.OptCase c ->
        (* put the + code on the thing, not on the opt *)
-       r.V0.combiner_case_line c
+       r.VT0.combiner_rec_case_line c
     | _ -> do_nothing r k e in
 
   let do_top r k (e: Ast0.top_level) = k e in
 
-  V0.combiner bind option_default
+  V0.flat_combiner bind option_default
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     edots idots pdots sdots ddots cdots
     ident expression typeC initialiser param decl statement case_line do_top
@@ -315,51 +317,51 @@ let call_collect_minus context_nodes :
       match e with
        Ast0.DotsExprTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_expression_dots e)
+          (collect_minus_join_points e).VT0.combiner_rec_expression_dots e)
       | Ast0.DotsInitTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_initialiser_list e)
+          (collect_minus_join_points e).VT0.combiner_rec_initialiser_list e)
       | Ast0.DotsParamTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_parameter_list e)
+          (collect_minus_join_points e).VT0.combiner_rec_parameter_list e)
       | Ast0.DotsStmtTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_statement_dots e)
+          (collect_minus_join_points e).VT0.combiner_rec_statement_dots e)
       | Ast0.DotsDeclTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_declaration_dots e)
+          (collect_minus_join_points e).VT0.combiner_rec_declaration_dots e)
       | Ast0.DotsCaseTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_case_line_dots e)
+          (collect_minus_join_points e).VT0.combiner_rec_case_line_dots e)
       | Ast0.IdentTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_ident e)
+          (collect_minus_join_points e).VT0.combiner_rec_ident e)
       | Ast0.ExprTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_expression e)
+          (collect_minus_join_points e).VT0.combiner_rec_expression e)
       | Ast0.ArgExprTag(e) | Ast0.TestExprTag(e) ->
          failwith "not possible - iso only"
       | Ast0.TypeCTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_typeC e)
+          (collect_minus_join_points e).VT0.combiner_rec_typeC e)
       | Ast0.ParamTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_parameter e)
+          (collect_minus_join_points e).VT0.combiner_rec_parameter e)
       | Ast0.InitTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_initialiser e)
+          (collect_minus_join_points e).VT0.combiner_rec_initialiser e)
       | Ast0.DeclTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_declaration e)
+          (collect_minus_join_points e).VT0.combiner_rec_declaration e)
       | Ast0.StmtTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_statement e)
+          (collect_minus_join_points e).VT0.combiner_rec_statement e)
       | Ast0.CaseLineTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_case_line e)
+          (collect_minus_join_points e).VT0.combiner_rec_case_line e)
       | Ast0.TopTag(e) ->
          (Ast0.get_index e,
-          (collect_minus_join_points e).V0.combiner_top_level e)
+          (collect_minus_join_points e).VT0.combiner_rec_top_level e)
       | Ast0.IsoWhenTag(_) -> failwith "only within iso phase"
       | Ast0.IsoWhenTTag(_) -> failwith "only within iso phase"
       | Ast0.IsoWhenFTag(_) -> failwith "only within iso phase"
@@ -494,10 +496,10 @@ let collect_plus_nodes root =
   (* case for things with bef aft *)
   let stmt r k e =
     match Ast0.unwrap e with
-      Ast0.Exp(exp) -> r.V0.combiner_expression exp
-    | Ast0.TopExp(exp) -> r.V0.combiner_expression exp
-    | Ast0.Ty(ty) -> r.V0.combiner_typeC ty
-    | Ast0.TopInit(init) -> r.V0.combiner_initialiser init
+      Ast0.Exp(exp) -> r.VT0.combiner_rec_expression exp
+    | Ast0.TopExp(exp) -> r.VT0.combiner_rec_expression exp
+    | Ast0.Ty(ty) -> r.VT0.combiner_rec_typeC ty
+    | Ast0.TopInit(init) -> r.VT0.combiner_rec_initialiser init
     | Ast0.Decl(bef,decl) ->
        (info bef) @ (do_nothing mk_statement r k e)
     | Ast0.FunDecl(bef,fi,name,lp,params,rp,lbrace,body,rbrace) ->
@@ -519,18 +521,18 @@ let collect_plus_nodes root =
   let stmt_dots r k e =
     match Ast0.unwrap e with
       Ast0.DOTS([s]) | Ast0.CIRCLES([s]) | Ast0.STARS([s]) ->
-       r.V0.combiner_statement s
+       r.VT0.combiner_rec_statement s
     | _ -> do_nothing mk_stmtdots r k e in
 
   let toplevel r k e =
     match Ast0.unwrap e with
-      Ast0.DECL(s) -> r.V0.combiner_statement s
-    | Ast0.CODE(sdots) -> r.V0.combiner_statement_dots sdots
+      Ast0.DECL(s) -> r.VT0.combiner_rec_statement s
+    | Ast0.CODE(sdots) -> r.VT0.combiner_rec_statement_dots sdots
     | _ -> do_nothing mk_code r k e in
 
   let initdots r k e = k e in
 
-  V0.combiner bind option_default
+  V0.flat_combiner bind option_default
     (imcode mk_meta) (imcode mk_token) (mcode mk_constant) (mcode mk_assignOp)
     (mcode mk_fixOp)
     (mcode mk_unaryOp) (mcode mk_binaryOp) (mcode mk_const_vol)
@@ -551,51 +553,51 @@ let call_collect_plus context_nodes :
       match e with
        Ast0.DotsExprTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_expression_dots e)
+          (collect_plus_nodes e).VT0.combiner_rec_expression_dots e)
       | Ast0.DotsInitTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_initialiser_list e)
+          (collect_plus_nodes e).VT0.combiner_rec_initialiser_list e)
       | Ast0.DotsParamTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_parameter_list e)
+          (collect_plus_nodes e).VT0.combiner_rec_parameter_list e)
       | Ast0.DotsStmtTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_statement_dots e)
+          (collect_plus_nodes e).VT0.combiner_rec_statement_dots e)
       | Ast0.DotsDeclTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_declaration_dots e)
+          (collect_plus_nodes e).VT0.combiner_rec_declaration_dots e)
       | Ast0.DotsCaseTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_case_line_dots e)
+          (collect_plus_nodes e).VT0.combiner_rec_case_line_dots e)
       | Ast0.IdentTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_ident e)
+          (collect_plus_nodes e).VT0.combiner_rec_ident e)
       | Ast0.ExprTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_expression e)
+          (collect_plus_nodes e).VT0.combiner_rec_expression e)
       | Ast0.ArgExprTag(_) | Ast0.TestExprTag(_) ->
          failwith "not possible - iso only"
       | Ast0.TypeCTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_typeC e)
+          (collect_plus_nodes e).VT0.combiner_rec_typeC e)
       | Ast0.InitTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_initialiser e)
+          (collect_plus_nodes e).VT0.combiner_rec_initialiser e)
       | Ast0.ParamTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_parameter e)
+          (collect_plus_nodes e).VT0.combiner_rec_parameter e)
       | Ast0.DeclTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_declaration e)
+          (collect_plus_nodes e).VT0.combiner_rec_declaration e)
       | Ast0.StmtTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_statement e)
+          (collect_plus_nodes e).VT0.combiner_rec_statement e)
       | Ast0.CaseLineTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_case_line e)
+          (collect_plus_nodes e).VT0.combiner_rec_case_line e)
       | Ast0.TopTag(e) ->
          (Ast0.get_index e,
-          (collect_plus_nodes e).V0.combiner_top_level e)
+          (collect_plus_nodes e).VT0.combiner_rec_top_level e)
       | Ast0.IsoWhenTag(_) -> failwith "only within iso phase"
       | Ast0.IsoWhenTTag(_) -> failwith "only within iso phase"
       | Ast0.IsoWhenFTag(_) -> failwith "only within iso phase"
@@ -1016,12 +1018,12 @@ let reevaluate_contextness =
      | _ -> donothing r k e in
 
   let res =
-    V0.combiner bind option_default
+    V0.flat_combiner bind option_default
       mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
       donothing donothing donothing donothing donothing donothing donothing
       donothing
       donothing donothing donothing donothing stmt donothing donothing in
-  res.V0.combiner_top_level
+  res.VT0.combiner_rec_top_level
 
 (* --------------------------------------------------------------------- *)
 (* --------------------------------------------------------------------- *)
index f9835c6..a04141b 100644 (file)
@@ -21,6 +21,7 @@
 
 
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
 
@@ -38,7 +39,7 @@ let sequence_tokens =
   let donothing r k e = k e in
   let bind x y = x @ y in
   let option_default = [] in
-  V0.combiner bind option_default
+  V0.flat_combiner bind option_default
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     donothing donothing donothing donothing donothing donothing
     donothing donothing
@@ -100,5 +101,5 @@ let process_info l =
 
 let process (metavars,alts,name) =
   let toks =
-    List.map (List.map sequence_tokens.V0.combiner_anything) alts in
+    List.map (List.map sequence_tokens.VT0.combiner_rec_anything) alts in
   process_info toks
index f4036ee..46e77e2 100644 (file)
@@ -33,6 +33,7 @@ either - or + *)
 module Ast = Ast_cocci
 module Ast0 = Ast0_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 
 let current_rule = ref ""
 
@@ -49,7 +50,7 @@ let strip_info =
     {(Ast0.wrap (Ast0.unwrap x)) with
       Ast0.mcodekind = ref Ast0.PLUS;
       Ast0.true_if_test = x.Ast0.true_if_test} in
-  V0.rebuilder
+  V0.flat_rebuilder
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     donothing donothing donothing donothing donothing donothing
     donothing donothing donothing donothing donothing donothing donothing
@@ -63,42 +64,42 @@ let anything_equal = function
   | (Ast0.DotsParamTag(d1),Ast0.DotsParamTag(d2)) ->
       failwith "not a possible variable binding"
   | (Ast0.DotsStmtTag(d1),Ast0.DotsStmtTag(d2)) ->
-      (strip_info.V0.rebuilder_statement_dots d1) =
-      (strip_info.V0.rebuilder_statement_dots d2)
+      (strip_info.VT0.rebuilder_rec_statement_dots d1) =
+      (strip_info.VT0.rebuilder_rec_statement_dots d2)
   | (Ast0.DotsDeclTag(d1),Ast0.DotsDeclTag(d2)) ->
       failwith "not a possible variable binding"
   | (Ast0.DotsCaseTag(d1),Ast0.DotsCaseTag(d2)) ->
       failwith "not a possible variable binding"
   | (Ast0.IdentTag(d1),Ast0.IdentTag(d2)) ->
-      (strip_info.V0.rebuilder_ident d1) = (strip_info.V0.rebuilder_ident d2)
+      (strip_info.VT0.rebuilder_rec_ident d1) = (strip_info.VT0.rebuilder_rec_ident d2)
   | (Ast0.ExprTag(d1),Ast0.ExprTag(d2)) ->
-      (strip_info.V0.rebuilder_expression d1) =
-      (strip_info.V0.rebuilder_expression d2)
+      (strip_info.VT0.rebuilder_rec_expression d1) =
+      (strip_info.VT0.rebuilder_rec_expression d2)
   | (Ast0.ArgExprTag(_),_) | (_,Ast0.ArgExprTag(_)) ->
       failwith "not possible - only in isos1"
   | (Ast0.TestExprTag(_),_) | (_,Ast0.TestExprTag(_)) ->
       failwith "not possible - only in isos1"
   | (Ast0.TypeCTag(d1),Ast0.TypeCTag(d2)) ->
-      (strip_info.V0.rebuilder_typeC d1) =
-      (strip_info.V0.rebuilder_typeC d2)
+      (strip_info.VT0.rebuilder_rec_typeC d1) =
+      (strip_info.VT0.rebuilder_rec_typeC d2)
   | (Ast0.InitTag(d1),Ast0.InitTag(d2)) ->
-      (strip_info.V0.rebuilder_initialiser d1) =
-      (strip_info.V0.rebuilder_initialiser d2)
+      (strip_info.VT0.rebuilder_rec_initialiser d1) =
+      (strip_info.VT0.rebuilder_rec_initialiser d2)
   | (Ast0.ParamTag(d1),Ast0.ParamTag(d2)) ->
-      (strip_info.V0.rebuilder_parameter d1) =
-      (strip_info.V0.rebuilder_parameter d2)
+      (strip_info.VT0.rebuilder_rec_parameter d1) =
+      (strip_info.VT0.rebuilder_rec_parameter d2)
   | (Ast0.DeclTag(d1),Ast0.DeclTag(d2)) ->
-      (strip_info.V0.rebuilder_declaration d1) =
-      (strip_info.V0.rebuilder_declaration d2)
+      (strip_info.VT0.rebuilder_rec_declaration d1) =
+      (strip_info.VT0.rebuilder_rec_declaration d2)
   | (Ast0.StmtTag(d1),Ast0.StmtTag(d2)) ->
-      (strip_info.V0.rebuilder_statement d1) =
-      (strip_info.V0.rebuilder_statement d2)
+      (strip_info.VT0.rebuilder_rec_statement d1) =
+      (strip_info.VT0.rebuilder_rec_statement d2)
   | (Ast0.CaseLineTag(d1),Ast0.CaseLineTag(d2)) ->
-      (strip_info.V0.rebuilder_case_line d1) =
-      (strip_info.V0.rebuilder_case_line d2)
+      (strip_info.VT0.rebuilder_rec_case_line d1) =
+      (strip_info.VT0.rebuilder_rec_case_line d2)
   | (Ast0.TopTag(d1),Ast0.TopTag(d2)) ->
-      (strip_info.V0.rebuilder_top_level d1) =
-      (strip_info.V0.rebuilder_top_level d2)
+      (strip_info.VT0.rebuilder_rec_top_level d1) =
+      (strip_info.VT0.rebuilder_rec_top_level d2)
   | (Ast0.IsoWhenTTag(_),_) | (_,Ast0.IsoWhenTTag(_)) ->
       failwith "only for isos within iso phase"
   | (Ast0.IsoWhenFTag(_),_) | (_,Ast0.IsoWhenFTag(_)) ->
@@ -405,7 +406,7 @@ let match_maker checks_needed context_required whencode_allowed =
          Ast0.MetaStmt(name,pure) | Ast0.MetaStmtList(name,pure) -> pure
        | _ -> Ast0.Impure) in
 
-    V0.combiner bind option_default
+    V0.flat_combiner bind option_default
       mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
       donothing donothing donothing donothing donothing donothing
       ident expression typeC init param donothing stmt donothing
@@ -457,7 +458,7 @@ let match_maker checks_needed context_required whencode_allowed =
     match Ast0.unwrap sl with
       Ast0.MetaStmtList(name,pure) ->
        add_pure_list_binding name pure
-         pure_sp_code.V0.combiner_statement
+         pure_sp_code.VT0.combiner_rec_statement
          (function lst -> Ast0.StmtTag(List.hd lst))
          (function lst -> Ast0.DotsStmtTag(build_dots builder lst))
          lst
@@ -468,7 +469,7 @@ let match_maker checks_needed context_required whencode_allowed =
   let rec match_ident pattern id =
     match Ast0.unwrap pattern with
       Ast0.MetaId(name,_,pure) ->
-       (add_pure_binding name pure pure_sp_code.V0.combiner_ident
+       (add_pure_binding name pure pure_sp_code.VT0.combiner_rec_ident
          (function id -> Ast0.IdentTag id) id)
     | Ast0.MetaFunc(name,_,pure) -> failwith "metafunc not supported"
     | Ast0.MetaLocalFunc(name,_,pure) -> failwith "metalocalfunc not supported"
@@ -537,7 +538,7 @@ let match_maker checks_needed context_required whencode_allowed =
                        let tyname = Ast0.rewrap_mcode name tyname in
                        conjunct_bindings
                          (add_pure_binding name pure
-                            pure_sp_code.V0.combiner_expression
+                            pure_sp_code.VT0.combiner_rec_expression
                             (function expr -> Ast0.ExprTag expr)
                             expr)
                          (function bindings ->
@@ -586,12 +587,12 @@ let match_maker checks_needed context_required whencode_allowed =
                if List.exists (function t -> Type_cocci.compatible t expty) ts
                then
                  add_pure_binding name pure
-                   pure_sp_code.V0.combiner_expression
+                   pure_sp_code.VT0.combiner_rec_expression
                    (function expr -> Ast0.ExprTag expr)
                    expr
                else return false
          | None ->
-             add_pure_binding name pure pure_sp_code.V0.combiner_expression
+             add_pure_binding name pure pure_sp_code.VT0.combiner_rec_expression
                (function expr -> Ast0.ExprTag expr)
                expr
        else return false
@@ -715,7 +716,7 @@ let match_maker checks_needed context_required whencode_allowed =
        (match Ast0.unwrap t with
          Ast0.FunctionType(tya,lp1a,paramsa,rp1a) -> return false
        | _ ->
-           add_pure_binding name pure pure_sp_code.V0.combiner_typeC
+           add_pure_binding name pure pure_sp_code.VT0.combiner_rec_typeC
              (function ty -> Ast0.TypeCTag ty)
              t)
     | up ->
@@ -851,7 +852,7 @@ let match_maker checks_needed context_required whencode_allowed =
   and match_init pattern i =
     match Ast0.unwrap pattern with
       Ast0.MetaInit(name,pure) ->
-       add_pure_binding name pure pure_sp_code.V0.combiner_initialiser
+       add_pure_binding name pure pure_sp_code.VT0.combiner_rec_initialiser
          (function ini -> Ast0.InitTag ini)
          i
     | up ->
@@ -919,7 +920,7 @@ let match_maker checks_needed context_required whencode_allowed =
   and match_param pattern p =
     match Ast0.unwrap pattern with
       Ast0.MetaParam(name,pure) ->
-       add_pure_binding name pure pure_sp_code.V0.combiner_parameter
+       add_pure_binding name pure pure_sp_code.VT0.combiner_rec_parameter
          (function p -> Ast0.ParamTag p)
          p
     | Ast0.MetaParamList(name,_,pure) -> failwith "metaparamlist not supported"
@@ -949,7 +950,7 @@ let match_maker checks_needed context_required whencode_allowed =
          Ast0.Dots(_,_) | Ast0.Circles(_,_) | Ast0.Stars(_,_) ->
            return false (* ... is not a single statement *)
        | _ ->
-           add_pure_binding name pure pure_sp_code.V0.combiner_statement
+           add_pure_binding name pure pure_sp_code.VT0.combiner_rec_statement
              (function ty -> Ast0.StmtTag ty)
              s)
     | Ast0.MetaStmtList(name,pure) -> failwith "metastmtlist not supported"
@@ -1241,7 +1242,7 @@ let make_minus =
        update_mc mcodekind e;
        Ast0.rewrap e
          (Ast0.NestExpr(mcode starter,
-                        r.V0.rebuilder_expression_dots expr_dots,
+                        r.VT0.rebuilder_rec_expression_dots expr_dots,
                         mcode ender,whencode,multi))
     | _ -> donothing r k e in
 
@@ -1266,8 +1267,9 @@ let make_minus =
     | Ast0.Nest(starter,stmt_dots,ender,whencode,multi) ->
        update_mc mcodekind e;
        Ast0.rewrap e
-         (Ast0.Nest(mcode starter,r.V0.rebuilder_statement_dots stmt_dots,
-                    mcode ender,whencode,multi))
+         (Ast0.Nest
+            (mcode starter,r.VT0.rebuilder_rec_statement_dots stmt_dots,
+             mcode ender,whencode,multi))
     | _ -> donothing r k e in
 
   let initialiser r k e =
@@ -1304,7 +1306,7 @@ let make_minus =
                 info.Ast0.pos_info.Ast0.line_start (Dumper.dump e)))
     | _ -> donothing r k e in
 
-  V0.rebuilder
+  V0.flat_rebuilder
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     dots dots dots dots dots dots
     donothing expression donothing initialiser donothing declaration
@@ -1388,11 +1390,11 @@ let rebuild_mcode start_line =
       (match Ast0.get_dots_bef_aft res with
        Ast0.NoDots -> Ast0.NoDots
       | Ast0.AddingBetweenDots s ->
-         Ast0.AddingBetweenDots(r.V0.rebuilder_statement s)
+         Ast0.AddingBetweenDots(r.VT0.rebuilder_rec_statement s)
       | Ast0.DroppingBetweenDots s ->
-         Ast0.DroppingBetweenDots(r.V0.rebuilder_statement s)) in
+         Ast0.DroppingBetweenDots(r.VT0.rebuilder_rec_statement s)) in
 
-  V0.rebuilder
+  V0.flat_rebuilder
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     donothing donothing donothing donothing donothing donothing
     donothing donothing donothing donothing donothing
@@ -1405,50 +1407,35 @@ let rebuild_mcode start_line =
    aren't allowed in isomorphisms for the moment. *)
 
 let count_edots =
-  let mcode x = 0 in
   let option_default = 0 in
   let bind x y = x + y in
-  let donothing r k e = k e in
   let exprfn r k e =
     match Ast0.unwrap e with
       Ast0.Edots(_,_) | Ast0.Ecircles(_,_) | Ast0.Estars(_,_) -> 1
     | _ -> 0 in
 
   V0.combiner bind option_default
-    mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-    donothing donothing donothing donothing donothing donothing
-    donothing exprfn donothing donothing donothing donothing donothing
-    donothing donothing
+    {V0.combiner_functions with VT0.combiner_exprfn = exprfn}
 
 let count_idots =
-  let mcode x = 0 in
   let option_default = 0 in
   let bind x y = x + y in
-  let donothing r k e = k e in
   let initfn r k e =
     match Ast0.unwrap e with Ast0.Idots(_,_) -> 1 | _ -> 0 in
 
   V0.combiner bind option_default
-    mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-    donothing donothing donothing donothing donothing donothing
-    donothing donothing donothing initfn donothing donothing donothing
-    donothing donothing
+    {V0.combiner_functions with VT0.combiner_initfn = initfn}
 
 let count_dots =
-  let mcode x = 0 in
   let option_default = 0 in
   let bind x y = x + y in
-  let donothing r k e = k e in
   let stmtfn r k e =
     match Ast0.unwrap e with
       Ast0.Dots(_,_) | Ast0.Circles(_,_) | Ast0.Stars(_,_) -> 1
     | _ -> 0 in
 
   V0.combiner bind option_default
-    mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-    donothing donothing donothing donothing donothing donothing
-    donothing donothing donothing donothing donothing donothing stmtfn
-    donothing donothing
+    {V0.combiner_functions with VT0.combiner_stmtfn = stmtfn}
 
 (* --------------------------------------------------------------------- *)
 
@@ -1478,7 +1465,7 @@ let instantiate bindings mv_bindings =
     let e = k e in
     match Ast0.unwrap e with
       Ast0.MetaId(name,constraints,pure) ->
-       (rebuild_mcode None).V0.rebuilder_ident
+       (rebuild_mcode None).VT0.rebuilder_rec_ident
          (match lookup name bindings mv_bindings with
            Common.Left(Ast0.IdentTag(id)) -> id
          | Common.Left(_) -> failwith "not possible 1"
@@ -1506,8 +1493,8 @@ let instantiate bindings mv_bindings =
            | Common.Left(_) -> failwith "not possible 1"
            | Common.Right(new_mv) ->
                failwith "MetaExprList in SP not supported"*)
-       | _ -> [r.V0.rebuilder_expression x])
-    | x::xs -> (r.V0.rebuilder_expression x)::(elist r same_dots xs) in
+       | _ -> [r.VT0.rebuilder_rec_expression x])
+    | x::xs -> (r.VT0.rebuilder_rec_expression x)::(elist r same_dots xs) in
 
   let rec plist r same_dots = function
       [] -> []
@@ -1524,8 +1511,8 @@ let instantiate bindings mv_bindings =
            | Common.Left(_) -> failwith "not possible 1"
            | Common.Right(new_mv) ->
                failwith "MetaExprList in SP not supported"*)
-       | _ -> [r.V0.rebuilder_parameter x])
-    | x::xs -> (r.V0.rebuilder_parameter x)::(plist r same_dots xs) in
+       | _ -> [r.VT0.rebuilder_rec_parameter x])
+    | x::xs -> (r.VT0.rebuilder_rec_parameter x)::(plist r same_dots xs) in
 
   let rec slist r same_dots = function
       [] -> []
@@ -1541,8 +1528,8 @@ let instantiate bindings mv_bindings =
            | Common.Left(_) -> failwith "not possible 1"
            | Common.Right(new_mv) ->
                failwith "MetaExprList in SP not supported")
-       | _ -> [r.V0.rebuilder_statement x])
-    | x::xs -> (r.V0.rebuilder_statement x)::(slist r same_dots xs) in
+       | _ -> [r.VT0.rebuilder_rec_statement x])
+    | x::xs -> (r.VT0.rebuilder_rec_statement x)::(slist r same_dots xs) in
 
   let same_dots d =
     match Ast0.unwrap d with Ast0.DOTS(l) -> Some l |_ -> None in
@@ -1563,7 +1550,7 @@ let instantiate bindings mv_bindings =
     let e1 =
     match Ast0.unwrap e with
       Ast0.MetaExpr(name,constraints,x,form,pure) ->
-       (rebuild_mcode None).V0.rebuilder_expression
+       (rebuild_mcode None).VT0.rebuilder_rec_expression
          (match lookup name bindings mv_bindings with
            Common.Left(Ast0.ExprTag(exp)) -> exp
          | Common.Left(_) -> failwith "not possible 1"
@@ -1699,7 +1686,7 @@ let instantiate bindings mv_bindings =
     let e = k e in
     match Ast0.unwrap e with
       Ast0.MetaType(name,pure) ->
-       (rebuild_mcode None).V0.rebuilder_typeC
+       (rebuild_mcode None).VT0.rebuilder_rec_typeC
          (match lookup name bindings mv_bindings with
            Common.Left(Ast0.TypeCTag(ty)) -> ty
          | Common.Left(_) -> failwith "not possible 1"
@@ -1712,7 +1699,7 @@ let instantiate bindings mv_bindings =
     let e = k e in
     match Ast0.unwrap e with
       Ast0.MetaInit(name,pure) ->
-       (rebuild_mcode None).V0.rebuilder_initialiser
+       (rebuild_mcode None).VT0.rebuilder_rec_initialiser
          (match lookup name bindings mv_bindings with
            Common.Left(Ast0.InitTag(ty)) -> ty
          | Common.Left(_) -> failwith "not possible 1"
@@ -1736,7 +1723,7 @@ let instantiate bindings mv_bindings =
     let e = k e in
     match Ast0.unwrap e with
       Ast0.MetaParam(name,pure) ->
-       (rebuild_mcode None).V0.rebuilder_parameter
+       (rebuild_mcode None).VT0.rebuilder_rec_parameter
          (match lookup name bindings mv_bindings with
            Common.Left(Ast0.ParamTag(param)) -> param
          | Common.Left(_) -> failwith "not possible 1"
@@ -1760,7 +1747,7 @@ let instantiate bindings mv_bindings =
     let e = k e in
     match Ast0.unwrap e with
     Ast0.MetaStmt(name,pure) ->
-       (rebuild_mcode None).V0.rebuilder_statement
+       (rebuild_mcode None).VT0.rebuilder_rec_statement
          (match lookup name bindings mv_bindings with
            Common.Left(Ast0.StmtTag(stm)) -> stm
          | Common.Left(_) -> failwith "not possible 1"
@@ -1788,7 +1775,7 @@ let instantiate bindings mv_bindings =
                (List.filter (function (x,v) -> x = (dot_term d)) bindings)))
     | _ -> e in
 
-  V0.rebuilder
+  V0.flat_rebuilder
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     (dots elist) donothing (dots plist) (dots slist) donothing donothing
     identfn exprfn tyfn initfn paramfn declfn stmtfn donothing donothing
@@ -1933,8 +1920,8 @@ let new_mv (_,s) =
 let get_name = function
     Ast.MetaIdDecl(ar,nm) ->
       (nm,function nm -> Ast.MetaIdDecl(ar,nm))
-  | Ast.MetaFreshIdDecl(ar,nm) ->
-      (nm,function nm -> Ast.MetaFreshIdDecl(ar,nm))
+  | Ast.MetaFreshIdDecl(nm,seed) ->
+      (nm,function nm -> Ast.MetaFreshIdDecl(nm,seed))
   | Ast.MetaTypeDecl(ar,nm) ->
       (nm,function nm -> Ast.MetaTypeDecl(ar,nm))
   | Ast.MetaInitDecl(ar,nm) ->
@@ -2006,7 +1993,7 @@ let mkdisj matcher metavars alts e instantiater mkiso disj_maker minusify
                       (extra_plus e
                          (instantiater bindings mv_bindings
                             (rebuild_mcodes a))))
-                   (Common.union_set [(name,mkiso a)] (Ast0.get_iso e)))
+                   ((name,mkiso a)::(Ast0.get_iso e))) (* keep count, not U *)
                bindings))
         alts) in
   let rec inner_loop all_alts prev_ecount prev_icount prev_dcount = function
@@ -2050,15 +2037,16 @@ let mkdisj matcher metavars alts e instantiater mkiso disj_maker minusify
                  (new_metavars,
                   call_instantiate bindings mv_bindings all_alts))) in
   let rec outer_loop prev_ecount prev_icount prev_dcount = function
-      [] | [[_]] (*only one alternative*)  -> ([],e) (* nothing matched *)
+      [] | [[_]] (*only one alternative*)  -> (0,[],e) (* nothing matched *)
     | (alts::rest) as all_alts ->
        match inner_loop all_alts prev_ecount prev_icount prev_dcount alts with
          Common.Left(prev_ecount, prev_icount, prev_dcount) ->
            outer_loop prev_ecount prev_icount prev_dcount rest
        | Common.Right (new_metavars,res) ->
-           (new_metavars,
+           (1,new_metavars,
             copy_minus printer minusify e (disj_maker res)) in
-  outer_loop 0 0 0 alts
+  let (count,metavars,e) = outer_loop 0 0 0 alts in
+  (count, metavars, e)
 
 (* no one should ever look at the information stored in these mcodes *)
 let disj_starter lst =
@@ -2139,19 +2127,19 @@ let transform_type (metavars,alts,name) e =
          (List.map
             (function
                 Ast0.TypeCTag(p) ->
-                  (p,count_edots.V0.combiner_typeC p,
-                   count_idots.V0.combiner_typeC p,
-                   count_dots.V0.combiner_typeC p)
+                  (p,count_edots.VT0.combiner_rec_typeC p,
+                   count_idots.VT0.combiner_rec_typeC p,
+                   count_dots.VT0.combiner_rec_typeC p)
               | _ -> failwith "invalid alt"))
          alts in
       mkdisj match_typeC metavars alts e
        (function b -> function mv_b ->
-         (instantiate b mv_b).V0.rebuilder_typeC)
+         (instantiate b mv_b).VT0.rebuilder_rec_typeC)
        (function t -> Ast0.TypeCTag t)
-       make_disj_type make_minus.V0.rebuilder_typeC
-       (rebuild_mcode start_line).V0.rebuilder_typeC
+       make_disj_type make_minus.VT0.rebuilder_rec_typeC
+       (rebuild_mcode start_line).VT0.rebuilder_rec_typeC
        name Unparse_ast0.typeC extra_copy_other_plus do_nothing
-  | _ -> ([],e)
+  | _ -> (0,[],e)
 
 
 let transform_expr (metavars,alts,name) e =
@@ -2164,25 +2152,25 @@ let transform_expr (metavars,alts,name) e =
        (List.map
           (function
               Ast0.ExprTag(p) | Ast0.ArgExprTag(p) | Ast0.TestExprTag(p) ->
-                (p,count_edots.V0.combiner_expression p,
-                 count_idots.V0.combiner_expression p,
-                 count_dots.V0.combiner_expression p)
+                (p,count_edots.VT0.combiner_rec_expression p,
+                 count_idots.VT0.combiner_rec_expression p,
+                 count_dots.VT0.combiner_rec_expression p)
             | _ -> failwith "invalid alt"))
        alts in
     mkdisj match_expr metavars alts e
       (function b -> function mv_b ->
-       (instantiate b mv_b).V0.rebuilder_expression)
+       (instantiate b mv_b).VT0.rebuilder_rec_expression)
       (function e -> Ast0.ExprTag e)
       (make_disj_expr e)
-      make_minus.V0.rebuilder_expression
-      (rebuild_mcode start_line).V0.rebuilder_expression
+      make_minus.VT0.rebuilder_rec_expression
+      (rebuild_mcode start_line).VT0.rebuilder_rec_expression
       name Unparse_ast0.expression extra_copy_other_plus update_others in
   match alts with
     (Ast0.ExprTag(_)::_)::_ -> process do_nothing
   | (Ast0.ArgExprTag(_)::_)::_ when Ast0.get_arg_exp e -> process do_nothing
   | (Ast0.TestExprTag(_)::_)::_ when Ast0.get_test_pos e ->
       process Ast0.set_test_exp
-  | _ -> ([],e)
+  | _ -> (0,[],e)
 
 let transform_decl (metavars,alts,name) e =
   match alts with
@@ -2195,20 +2183,20 @@ let transform_decl (metavars,alts,name) e =
          (List.map
             (function
                 Ast0.DeclTag(p) ->
-                  (p,count_edots.V0.combiner_declaration p,
-                   count_idots.V0.combiner_declaration p,
-                   count_dots.V0.combiner_declaration p)
+                  (p,count_edots.VT0.combiner_rec_declaration p,
+                   count_idots.VT0.combiner_rec_declaration p,
+                   count_dots.VT0.combiner_rec_declaration p)
               | _ -> failwith "invalid alt"))
          alts in
       mkdisj match_decl metavars alts e
        (function b -> function mv_b ->
-         (instantiate b mv_b).V0.rebuilder_declaration)
+         (instantiate b mv_b).VT0.rebuilder_rec_declaration)
        (function d -> Ast0.DeclTag d)
        make_disj_decl
-       make_minus.V0.rebuilder_declaration
-       (rebuild_mcode start_line).V0.rebuilder_declaration
+       make_minus.VT0.rebuilder_rec_declaration
+       (rebuild_mcode start_line).VT0.rebuilder_rec_declaration
        name Unparse_ast0.declaration extra_copy_other_plus do_nothing
-  | _ -> ([],e)
+  | _ -> (0,[],e)
 
 let transform_stmt (metavars,alts,name) e =
   match alts with
@@ -2221,19 +2209,19 @@ let transform_stmt (metavars,alts,name) e =
          (List.map
             (function
                 Ast0.StmtTag(p) ->
-                  (p,count_edots.V0.combiner_statement p,
-                   count_idots.V0.combiner_statement p,
-                   count_dots.V0.combiner_statement p)
+                  (p,count_edots.VT0.combiner_rec_statement p,
+                   count_idots.VT0.combiner_rec_statement p,
+                   count_dots.VT0.combiner_rec_statement p)
               | _ -> failwith "invalid alt"))
          alts in
       mkdisj match_statement metavars alts e
        (function b -> function mv_b ->
-         (instantiate b mv_b).V0.rebuilder_statement)
+         (instantiate b mv_b).VT0.rebuilder_rec_statement)
        (function s -> Ast0.StmtTag s)
-       make_disj_stmt make_minus.V0.rebuilder_statement
-       (rebuild_mcode start_line).V0.rebuilder_statement
+       make_disj_stmt make_minus.VT0.rebuilder_rec_statement
+       (rebuild_mcode start_line).VT0.rebuilder_rec_statement
        name (Unparse_ast0.statement "") extra_copy_stmt_plus do_nothing
-  | _ -> ([],e)
+  | _ -> (0,[],e)
 
 (* sort of a hack, because there is no disj at top level *)
 let transform_top (metavars,alts,name) e =
@@ -2250,11 +2238,11 @@ let transform_top (metavars,alts,name) e =
                     | _ -> raise (Failure ""))
                 | _ -> raise (Failure "")))
            alts in
-       let (mv,s) = transform_stmt (metavars,strip alts,name) declstm in
-       (mv,Ast0.rewrap e (Ast0.DECL(s)))
-      with Failure _ -> ([],e))
+       let (count,mv,s) = transform_stmt (metavars,strip alts,name) declstm in
+       (count,mv,Ast0.rewrap e (Ast0.DECL(s)))
+      with Failure _ -> (0,[],e))
   | Ast0.CODE(stmts) ->
-      let (mv,res) =
+      let (count,mv,res) =
        match alts with
          (Ast0.DotsStmtTag(_)::_)::_ ->
               (* start line is given to any leaves in the iso code *)
@@ -2265,71 +2253,103 @@ let transform_top (metavars,alts,name) e =
                (List.map
                   (function
                       Ast0.DotsStmtTag(p) ->
-                        (p,count_edots.V0.combiner_statement_dots p,
-                         count_idots.V0.combiner_statement_dots p,
-                         count_dots.V0.combiner_statement_dots p)
+                        (p,count_edots.VT0.combiner_rec_statement_dots p,
+                         count_idots.VT0.combiner_rec_statement_dots p,
+                         count_dots.VT0.combiner_rec_statement_dots p)
                     | _ -> failwith "invalid alt"))
                alts in
            mkdisj match_statement_dots metavars alts stmts
              (function b -> function mv_b ->
-               (instantiate b mv_b).V0.rebuilder_statement_dots)
+               (instantiate b mv_b).VT0.rebuilder_rec_statement_dots)
              (function s -> Ast0.DotsStmtTag s)
              (function x ->
                Ast0.rewrap e (Ast0.DOTS([make_disj_stmt_list x])))
              (function x ->
-               make_minus.V0.rebuilder_statement_dots x)
-             (rebuild_mcode start_line).V0.rebuilder_statement_dots
+               make_minus.VT0.rebuilder_rec_statement_dots x)
+             (rebuild_mcode start_line).VT0.rebuilder_rec_statement_dots
              name Unparse_ast0.statement_dots extra_copy_other_plus do_nothing
-       | _ -> ([],stmts) in
-      (mv,Ast0.rewrap e (Ast0.CODE res))
-  | _ -> ([],e)
+       | _ -> (0,[],stmts) in
+      (count,mv,Ast0.rewrap e (Ast0.CODE res))
+  | _ -> (0,[],e)
 
 (* --------------------------------------------------------------------- *)
 
 let transform (alts : isomorphism) t =
   (* the following ugliness is because rebuilder only returns a new term *)
   let extra_meta_decls = ref ([] : Ast_cocci.metavar list) in
-  let mcode x = x in
-  let donothing r k e = k e in
+  let in_limit n = function
+      None -> true
+    | Some n1 ->
+       n < n1 or
+       ((if !Flag_parsing_cocci.show_iso_failures
+       then Common.pr2_once "execeeded iso threshold, see -iso_limit option");
+        false) in
+  let bind x y = x + y in
+  let option_default = 0 in
   let exprfn r k e =
-    let (extra_meta,exp) = transform_expr alts (k e) in
-    extra_meta_decls := extra_meta @ !extra_meta_decls;
-    exp in
+    let (e_count,e) = k e in
+    if in_limit e_count !Flag_parsing_cocci.iso_limit
+    then
+      let (count,extra_meta,exp) = transform_expr alts e in
+      extra_meta_decls := extra_meta @ !extra_meta_decls;
+      (bind count e_count,exp)
+    else (e_count,e) in
 
   let declfn r k e =
-    let (extra_meta,dec) = transform_decl alts (k e) in
-    extra_meta_decls := extra_meta @ !extra_meta_decls;
-    dec in
+    let (e_count,e) = k e in
+    if in_limit e_count !Flag_parsing_cocci.iso_limit
+    then
+      let (count,extra_meta,dec) = transform_decl alts e in
+      extra_meta_decls := extra_meta @ !extra_meta_decls;
+      (bind count e_count,dec)
+    else (e_count,e) in
 
   let stmtfn r k e =
-    let (extra_meta,stm) = transform_stmt alts (k e) in
-    extra_meta_decls := extra_meta @ !extra_meta_decls;
-    stm in
+    let (e_count,e) = k e in
+    if in_limit e_count !Flag_parsing_cocci.iso_limit
+    then
+      let (count,extra_meta,stm) = transform_stmt alts e in
+      extra_meta_decls := extra_meta @ !extra_meta_decls;
+      (bind count e_count,stm)
+    else (e_count,e) in
 
   let typefn r k e =
-   let continue =
-     match Ast0.unwrap e with
-       Ast0.Signed(signb,tyb) ->
+    let (continue,e_count,e) =
+      match Ast0.unwrap e with
+       Ast0.Signed(signb,tyb) ->
        (* Hack!  How else to prevent iso from applying under an
          unsigned??? *)
-        e
-     | _ -> k e in
-   let (extra_meta,ty) = transform_type alts continue in
-   extra_meta_decls := extra_meta @ !extra_meta_decls;
-   ty in
+         (true,0,e)
+      | _ ->
+         let (e_count,e) = k e in
+         if in_limit e_count !Flag_parsing_cocci.iso_limit
+         then (true,e_count,e)
+         else (false,e_count,e) in
+    if continue
+    then
+      let (count,extra_meta,ty) = transform_type alts e in
+      extra_meta_decls := extra_meta @ !extra_meta_decls;
+      (bind count e_count,ty)
+    else (e_count,e) in
 
   let topfn r k e =
-    let (extra_meta,ty) = transform_top alts (k e) in
-    extra_meta_decls := extra_meta @ !extra_meta_decls;
-    ty in
+    let (e_count,e) = k e in
+    if in_limit e_count !Flag_parsing_cocci.iso_limit
+    then
+      let (count,extra_meta,ty) = transform_top alts e in
+      extra_meta_decls := extra_meta @ !extra_meta_decls;
+      (bind count e_count,ty)
+    else (e_count,e) in
 
   let res =
-    V0.rebuilder
-      mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-      donothing donothing donothing donothing donothing donothing
-      donothing exprfn typefn donothing donothing declfn stmtfn
-      donothing topfn in
-  let res = res.V0.rebuilder_top_level t in
+    V0.combiner_rebuilder bind option_default
+      {V0.combiner_rebuilder_functions with
+       VT0.combiner_rebuilder_exprfn = exprfn;
+       VT0.combiner_rebuilder_tyfn = typefn;
+       VT0.combiner_rebuilder_declfn = declfn;
+       VT0.combiner_rebuilder_stmtfn = stmtfn;
+       VT0.combiner_rebuilder_topfn = topfn} in
+  let (_,res) = res.VT0.top_level t in
   (!extra_meta_decls,res)
 
 (* --------------------------------------------------------------------- *)
@@ -2338,7 +2358,7 @@ let transform (alts : isomorphism) t =
 let rewrap =
   let mcode (x,a,i,mc,pos) = (x,a,i,Ast0.context_befaft(),pos) in
   let donothing r k e = Ast0.context_wrap(Ast0.unwrap(k e)) in
-  V0.rebuilder
+  V0.flat_rebuilder
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     donothing donothing donothing donothing donothing donothing
     donothing donothing donothing donothing donothing donothing donothing
@@ -2346,28 +2366,31 @@ let rewrap =
 
 let rewrap_anything = function
     Ast0.DotsExprTag(d) ->
-      Ast0.DotsExprTag(rewrap.V0.rebuilder_expression_dots d)
+      Ast0.DotsExprTag(rewrap.VT0.rebuilder_rec_expression_dots d)
   | Ast0.DotsInitTag(d) ->
-      Ast0.DotsInitTag(rewrap.V0.rebuilder_initialiser_list d)
+      Ast0.DotsInitTag(rewrap.VT0.rebuilder_rec_initialiser_list d)
   | Ast0.DotsParamTag(d) ->
-      Ast0.DotsParamTag(rewrap.V0.rebuilder_parameter_list d)
+      Ast0.DotsParamTag(rewrap.VT0.rebuilder_rec_parameter_list d)
   | Ast0.DotsStmtTag(d) ->
-      Ast0.DotsStmtTag(rewrap.V0.rebuilder_statement_dots d)
+      Ast0.DotsStmtTag(rewrap.VT0.rebuilder_rec_statement_dots d)
   | Ast0.DotsDeclTag(d) ->
-      Ast0.DotsDeclTag(rewrap.V0.rebuilder_declaration_dots d)
+      Ast0.DotsDeclTag(rewrap.VT0.rebuilder_rec_declaration_dots d)
   | Ast0.DotsCaseTag(d) ->
-      Ast0.DotsCaseTag(rewrap.V0.rebuilder_case_line_dots d)
-  | Ast0.IdentTag(d) -> Ast0.IdentTag(rewrap.V0.rebuilder_ident d)
-  | Ast0.ExprTag(d) -> Ast0.ExprTag(rewrap.V0.rebuilder_expression d)
-  | Ast0.ArgExprTag(d) -> Ast0.ArgExprTag(rewrap.V0.rebuilder_expression d)
-  | Ast0.TestExprTag(d) -> Ast0.TestExprTag(rewrap.V0.rebuilder_expression d)
-  | Ast0.TypeCTag(d) -> Ast0.TypeCTag(rewrap.V0.rebuilder_typeC d)
-  | Ast0.InitTag(d) -> Ast0.InitTag(rewrap.V0.rebuilder_initialiser d)
-  | Ast0.ParamTag(d) -> Ast0.ParamTag(rewrap.V0.rebuilder_parameter d)
-  | Ast0.DeclTag(d) -> Ast0.DeclTag(rewrap.V0.rebuilder_declaration d)
-  | Ast0.StmtTag(d) -> Ast0.StmtTag(rewrap.V0.rebuilder_statement d)
-  | Ast0.CaseLineTag(d) -> Ast0.CaseLineTag(rewrap.V0.rebuilder_case_line d)
-  | Ast0.TopTag(d) -> Ast0.TopTag(rewrap.V0.rebuilder_top_level d)
+      Ast0.DotsCaseTag(rewrap.VT0.rebuilder_rec_case_line_dots d)
+  | Ast0.IdentTag(d) -> Ast0.IdentTag(rewrap.VT0.rebuilder_rec_ident d)
+  | Ast0.ExprTag(d) -> Ast0.ExprTag(rewrap.VT0.rebuilder_rec_expression d)
+  | Ast0.ArgExprTag(d) ->
+      Ast0.ArgExprTag(rewrap.VT0.rebuilder_rec_expression d)
+  | Ast0.TestExprTag(d) ->
+      Ast0.TestExprTag(rewrap.VT0.rebuilder_rec_expression d)
+  | Ast0.TypeCTag(d) -> Ast0.TypeCTag(rewrap.VT0.rebuilder_rec_typeC d)
+  | Ast0.InitTag(d) -> Ast0.InitTag(rewrap.VT0.rebuilder_rec_initialiser d)
+  | Ast0.ParamTag(d) -> Ast0.ParamTag(rewrap.VT0.rebuilder_rec_parameter d)
+  | Ast0.DeclTag(d) -> Ast0.DeclTag(rewrap.VT0.rebuilder_rec_declaration d)
+  | Ast0.StmtTag(d) -> Ast0.StmtTag(rewrap.VT0.rebuilder_rec_statement d)
+  | Ast0.CaseLineTag(d) ->
+      Ast0.CaseLineTag(rewrap.VT0.rebuilder_rec_case_line d)
+  | Ast0.TopTag(d) -> Ast0.TopTag(rewrap.VT0.rebuilder_rec_top_level d)
   | Ast0.IsoWhenTag(_) | Ast0.IsoWhenTTag(_) | Ast0.IsoWhenFTag(_) ->
       failwith "only for isos within iso phase"
   | Ast0.MetaPosTag(p) -> Ast0.MetaPosTag(p)
index 32b4655..d12a37a 100644 (file)
@@ -5,4 +5,4 @@ val apply_isos :
     isomorphism list -> Ast0_cocci.rule -> string (* rule name *) ->
       Ast_cocci.metavar list * Ast0_cocci.rule
 
-val rebuild_mcode : int option -> Visitor_ast0.rebuilder
+val rebuild_mcode : int option -> Visitor_ast0_types.rebuilder_rec_functions
index a9a31fb..0761106 100644 (file)
@@ -225,7 +225,9 @@ let id_tokens lexbuf =
   | "exists" when in_rule_name  -> check_context_linetype s; TExists
   | "forall" when in_rule_name  -> check_context_linetype s; TForall
   | "reverse" when in_rule_name -> check_context_linetype s; TReverse
-  | "script" when in_rule_name -> check_context_linetype s; TScript
+  | "script" when in_rule_name  -> check_context_linetype s; TScript
+  | "initialize" when in_rule_name -> check_context_linetype s; TInitialize
+  | "finalize" when in_rule_name   -> check_context_linetype s; TFinalize
 
   | "char" ->       Tchar     linetype
   | "short" ->      Tshort    linetype
@@ -300,6 +302,10 @@ let init _ =
     (fun name constraints pure ->
       let fn clt = TMetaId(name,constraints,pure,clt) in
       Hashtbl.replace metavariables (get_name name) fn);
+  Data.add_fresh_id_meta :=
+    (fun name ->
+      let fn clt = TMetaId(name,[],Ast0.Impure,clt) in
+      Hashtbl.replace metavariables (get_name name) fn);
   Data.add_type_meta :=
     (fun name pure ->
       let fn clt = TMetaType(name,pure,clt) in
index d2900ca..f7f9e0e 100644 (file)
@@ -201,7 +201,7 @@ let check_meta tok =
          raise
            (Semantic_cocci.Semantic
               ("incompatible inheritance declaration "^name)))
-  | Ast.MetaFreshIdDecl(Ast.NONE,(rule,name)) ->
+  | Ast.MetaFreshIdDecl((rule,name),seed) ->
       raise
        (Semantic_cocci.Semantic
           "can't inherit the freshness of an identifier")
@@ -340,6 +340,19 @@ let create_metadec ar ispure kindfn ids current_rule =
         kindfn ar rule ispure checker)
        ids)
 
+let create_fresh_metadec kindfn ids current_rule =
+  List.concat
+    (List.map
+       (function ((rule,nm),seed) ->
+        let (rule,checker) =
+          match rule with
+            None -> ((current_rule,nm),function x -> [Common.Left x])
+          | Some rule ->
+              ((rule,nm),
+               function x -> check_meta x; [Common.Right x]) in
+        kindfn rule checker seed)
+       ids)
+
 let create_metadec_ne ar ispure kindfn ids current_rule =
   List.concat
     (List.map
@@ -482,3 +495,11 @@ let make_generated_rule_name_result nm d i a e ee =
 let make_script_rule_name_result lang deps =
   let l = id2name lang in
        Ast.ScriptRulename (l,deps)
+
+let make_initial_script_rule_name_result lang =
+  let l = id2name lang in
+  Ast.InitialScriptRulename(l)
+
+let make_final_script_rule_name_result lang =
+  let l = id2name lang in
+  Ast.FinalScriptRulename(l)
index 04c0afd..db75412 100644 (file)
@@ -26,6 +26,7 @@ separately (thus duplicating work for the parsing of the context elements) *)
 module D = Data
 module PC = Parser_cocci_menhir
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 module Ast = Ast_cocci
 module Ast0 = Ast0_cocci
 let pr = Printf.sprintf
@@ -199,6 +200,8 @@ let token2c (tok,_) =
   | PC.TArob -> "@"
   | PC.TPArob -> "P@"
   | PC.TScript -> "script"
+  | PC.TInitialize -> "initialize"
+  | PC.TFinalize -> "finalize"
 
   | PC.TWhen(clt) -> "WHEN"^(line_type2c clt)
   | PC.TWhenTrue(clt) -> "WHEN TRUE"^(line_type2c clt)
@@ -627,7 +630,8 @@ let split_token ((tok,_) as t) =
   | PC.TMetaStm(_,_,clt) | PC.TMetaStmList(_,_,clt) | PC.TMetaErr(_,_,_,clt)
   | PC.TMetaFunc(_,_,_,clt) | PC.TMetaLocalFunc(_,_,_,clt)
   | PC.TMetaDeclarer(_,_,_,clt) | PC.TMetaIterator(_,_,_,clt) -> split t clt
-  | PC.TMPtVirg | PC.TArob | PC.TArobArob | PC.TScript -> ([t],[t])
+  | PC.TMPtVirg | PC.TArob | PC.TArobArob | PC.TScript
+  | PC.TInitialize | PC.TFinalize -> ([t],[t])
   | PC.TPArob | PC.TMetaPos(_,_,_,_) -> ([t],[])
 
   | PC.TFunDecl(clt)
@@ -1215,12 +1219,12 @@ let any_modif rule =
   let bind x y = x or y in
   let option_default = false in
   let fn =
-    V0.combiner bind option_default
+    V0.flat_combiner bind option_default
       mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
       donothing donothing donothing donothing donothing donothing
       donothing donothing donothing donothing donothing donothing donothing
       donothing donothing in
-  List.exists fn.V0.combiner_top_level rule
+  List.exists fn.VT0.combiner_rec_top_level rule
 
 let drop_last extra l = List.rev(extra@(List.tl(List.rev l)))
 
@@ -1277,6 +1281,8 @@ let get_rule_name parse_fn starts_with_name get_tokens file prefix =
       | Ast.GeneratedRulename (nm,a,b,c,d,e) ->
           Ast.GeneratedRulename (check_name nm,a,b,c,d,e)
       | Ast.ScriptRulename(s,deps) -> Ast.ScriptRulename(s,deps)
+      | Ast.InitialScriptRulename(s) -> Ast.InitialScriptRulename(s)
+      | Ast.FinalScriptRulename(s) -> Ast.FinalScriptRulename(s)
     else
       Ast.CocciRulename(Some(mknm()),Ast.NoDep,[],[],Ast.Undetermined,false) in
   Data.in_rule_name := false;
@@ -1433,7 +1439,7 @@ let parse file =
              if !Flag.sgrep_mode2
              then (* not actually used for anything, except context_neg *)
                List.map
-                 (Iso_pattern.rebuild_mcode None).V0.rebuilder_top_level
+                 (Iso_pattern.rebuild_mcode None).VT0.rebuilder_rec_top_level
                  minus_res
              else
                if is_expression
@@ -1488,6 +1494,28 @@ let parse file =
               | _ -> failwith "Malformed script rule" in
             (more,Ast0.ScriptRule(language, deps, metavars, data),[],tokens) in
 
+          let parse_if_script_rule k language =
+            let get_tokens = tokens_script_all table file false lexbuf in
+
+              (* script code *)
+            let (more, tokens) = get_tokens [PC.TArobArob; PC.TArob] in
+            let data =
+              match List.hd tokens with
+                (PC.TScriptData(s),_) -> s
+              | (PC.TArobArob,_) | (PC.TArob,_) -> ""
+              | _ -> failwith "Malformed script rule" in
+            (more,k (language, data),[],tokens) in
+
+         let parse_iscript_rule =
+           parse_if_script_rule
+             (function (language,data) ->
+               Ast0.InitialScriptRule(language,data)) in
+
+         let parse_fscript_rule =
+           parse_if_script_rule
+             (function (language,data) ->
+               Ast0.FinalScriptRule(language,data)) in
+
           let parse_rule old_metas starts_with_name =
             let rulename =
              get_rule_name PC.rule_name starts_with_name get_tokens file
@@ -1501,7 +1529,9 @@ let parse file =
                  parse_cocci_rule Ast.Generated old_metas (s,a,b,c,d,e) in
                Data.in_generating := false;
                res
-            | Ast.ScriptRulename (l,deps) -> parse_script_rule l old_metas deps
+            | Ast.ScriptRulename(l,deps) -> parse_script_rule l old_metas deps
+            | Ast.InitialScriptRulename(l) -> parse_iscript_rule l
+            | Ast.FinalScriptRulename(l) -> parse_fscript_rule l
             | _ -> failwith "Malformed rule name"
             in
 
@@ -1547,6 +1577,8 @@ let process file isofile verbose =
     List.map
       (function
           Ast0.ScriptRule (a,b,c,d) -> [([],Ast.ScriptRule (a,b,c,d))]
+       | Ast0.InitialScriptRule (a,b) -> [([],Ast.InitialScriptRule (a,b))]
+       | Ast0.FinalScriptRule (a,b) -> [([],Ast.FinalScriptRule (a,b))]
        | Ast0.CocciRule
            ((minus, metavarsm,
              (iso, dropiso, dependencies, rule_name, exists)),
index eed5248..66f731b 100644 (file)
@@ -450,58 +450,60 @@ type token =
        (string * Data.clt)
 # 452 "parser_cocci_menhir.ml"
 )
+  | TInitialize
   | TInitialiser
   | TIncludeNL of (
 # 80 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 458 "parser_cocci_menhir.ml"
+# 459 "parser_cocci_menhir.ml"
 )
   | TIncludeL of (
 # 80 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 463 "parser_cocci_menhir.ml"
+# 464 "parser_cocci_menhir.ml"
 )
   | TInc of (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 468 "parser_cocci_menhir.ml"
+# 469 "parser_cocci_menhir.ml"
 )
   | TIf of (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 473 "parser_cocci_menhir.ml"
+# 474 "parser_cocci_menhir.ml"
 )
   | TIdentifier
   | TIdent of (
 # 59 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 479 "parser_cocci_menhir.ml"
+# 480 "parser_cocci_menhir.ml"
 )
   | TIdExpression
   | TGoto of (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 485 "parser_cocci_menhir.ml"
+# 486 "parser_cocci_menhir.ml"
 )
   | TGenerated
   | TFunction
   | TFunDecl of (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 492 "parser_cocci_menhir.ml"
+# 493 "parser_cocci_menhir.ml"
 )
   | TFresh
   | TForall
   | TFor of (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 499 "parser_cocci_menhir.ml"
+# 500 "parser_cocci_menhir.ml"
 )
   | TFloat of (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 504 "parser_cocci_menhir.ml"
+# 505 "parser_cocci_menhir.ml"
 )
+  | TFinalize
   | TExtends
   | TExpression
   | TExists
@@ -510,150 +512,150 @@ type token =
   | TEqEq of (
 # 94 "parser_cocci_menhir.mly"
        (Data.clt)
-# 514 "parser_cocci_menhir.ml"
+# 516 "parser_cocci_menhir.ml"
 )
   | TEq of (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 519 "parser_cocci_menhir.ml"
+# 521 "parser_cocci_menhir.ml"
 )
   | TElse of (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 524 "parser_cocci_menhir.ml"
+# 526 "parser_cocci_menhir.ml"
 )
   | TEllipsis of (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 529 "parser_cocci_menhir.ml"
+# 531 "parser_cocci_menhir.ml"
 )
   | TDotDot of (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 534 "parser_cocci_menhir.ml"
+# 536 "parser_cocci_menhir.ml"
 )
   | TDot of (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 539 "parser_cocci_menhir.ml"
+# 541 "parser_cocci_menhir.ml"
 )
   | TDo of (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 544 "parser_cocci_menhir.ml"
+# 546 "parser_cocci_menhir.ml"
 )
   | TDmOp of (
 # 97 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
-# 549 "parser_cocci_menhir.ml"
+# 551 "parser_cocci_menhir.ml"
 )
   | TDisable
   | TDepends
   | TDefineParam of (
 # 82 "parser_cocci_menhir.mly"
        (Data.clt * token * int)
-# 556 "parser_cocci_menhir.ml"
+# 558 "parser_cocci_menhir.ml"
 )
   | TDefine of (
 # 81 "parser_cocci_menhir.mly"
        (Data.clt * token)
-# 561 "parser_cocci_menhir.ml"
+# 563 "parser_cocci_menhir.ml"
 )
   | TDefault of (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 566 "parser_cocci_menhir.ml"
+# 568 "parser_cocci_menhir.ml"
 )
   | TDeclarerId of (
 # 59 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 571 "parser_cocci_menhir.ml"
+# 573 "parser_cocci_menhir.ml"
 )
   | TDeclarer
   | TDec of (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 577 "parser_cocci_menhir.ml"
+# 579 "parser_cocci_menhir.ml"
 )
   | TContinue of (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 582 "parser_cocci_menhir.ml"
+# 584 "parser_cocci_menhir.ml"
 )
   | TContext
   | TConstant
   | TComma of (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 589 "parser_cocci_menhir.ml"
+# 591 "parser_cocci_menhir.ml"
 )
   | TChar of (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 594 "parser_cocci_menhir.ml"
+# 596 "parser_cocci_menhir.ml"
 )
   | TCase of (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 599 "parser_cocci_menhir.ml"
+# 601 "parser_cocci_menhir.ml"
 )
   | TCPar0 of (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 604 "parser_cocci_menhir.ml"
+# 606 "parser_cocci_menhir.ml"
 )
   | TCPar of (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 609 "parser_cocci_menhir.ml"
+# 611 "parser_cocci_menhir.ml"
 )
   | TCEllipsis of (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 614 "parser_cocci_menhir.ml"
+# 616 "parser_cocci_menhir.ml"
 )
   | TCCro of (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 619 "parser_cocci_menhir.ml"
+# 621 "parser_cocci_menhir.ml"
 )
   | TCBrace of (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 624 "parser_cocci_menhir.ml"
+# 626 "parser_cocci_menhir.ml"
 )
   | TBreak of (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 629 "parser_cocci_menhir.ml"
+# 631 "parser_cocci_menhir.ml"
 )
   | TBang0
   | TBang of (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 635 "parser_cocci_menhir.ml"
+# 637 "parser_cocci_menhir.ml"
 )
   | TAssign of (
 # 108 "parser_cocci_menhir.mly"
        (Ast_cocci.assignOp * Data.clt)
-# 640 "parser_cocci_menhir.ml"
+# 642 "parser_cocci_menhir.ml"
 )
   | TArobArob
   | TArob
   | TAny of (
 # 74 "parser_cocci_menhir.mly"
        (Data.clt)
-# 647 "parser_cocci_menhir.ml"
+# 649 "parser_cocci_menhir.ml"
 )
   | TAndLog of (
 # 90 "parser_cocci_menhir.mly"
        (Data.clt)
-# 652 "parser_cocci_menhir.ml"
+# 654 "parser_cocci_menhir.ml"
 )
   | TAnd of (
 # 93 "parser_cocci_menhir.mly"
        (Data.clt)
-# 657 "parser_cocci_menhir.ml"
+# 659 "parser_cocci_menhir.ml"
 )
   | EOF
 
@@ -672,120 +674,124 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
     fun _tok ->
       match _tok with
       | EOF ->
-          170
+          172
       | TAnd _ ->
-          169
+          171
       | TAndLog _ ->
-          168
+          170
       | TAny _ ->
-          167
+          169
       | TArob ->
-          166
+          168
       | TArobArob ->
-          165
+          167
       | TAssign _ ->
-          164
+          166
       | TBang _ ->
-          163
+          165
       | TBang0 ->
-          162
+          164
       | TBreak _ ->
-          161
+          163
       | TCBrace _ ->
-          160
+          162
       | TCCro _ ->
-          159
+          161
       | TCEllipsis _ ->
-          158
+          160
       | TCPar _ ->
-          157
+          159
       | TCPar0 _ ->
-          156
+          158
       | TCase _ ->
-          155
+          157
       | TChar _ ->
-          154
+          156
       | TComma _ ->
-          153
+          155
       | TConstant ->
-          152
+          154
       | TContext ->
-          151
+          153
       | TContinue _ ->
-          150
+          152
       | TDec _ ->
-          149
+          151
       | TDeclarer ->
-          148
+          150
       | TDeclarerId _ ->
-          147
+          149
       | TDefault _ ->
-          146
+          148
       | TDefine _ ->
-          145
+          147
       | TDefineParam _ ->
-          144
+          146
       | TDepends ->
-          143
+          145
       | TDisable ->
-          142
+          144
       | TDmOp _ ->
-          141
+          143
       | TDo _ ->
-          140
+          142
       | TDot _ ->
-          139
+          141
       | TDotDot _ ->
-          138
+          140
       | TEllipsis _ ->
-          137
+          139
       | TElse _ ->
-          136
+          138
       | TEq _ ->
-          135
+          137
       | TEqEq _ ->
-          134
+          136
       | TError ->
-          133
+          135
       | TEver ->
-          132
+          134
       | TExists ->
-          131
+          133
       | TExpression ->
-          130
+          132
       | TExtends ->
-          129
+          131
+      | TFinalize ->
+          130
       | TFloat _ ->
-          128
+          129
       | TFor _ ->
-          127
+          128
       | TForall ->
-          126
+          127
       | TFresh ->
-          125
+          126
       | TFunDecl _ ->
-          124
+          125
       | TFunction ->
-          123
+          124
       | TGenerated ->
-          122
+          123
       | TGoto _ ->
-          121
+          122
       | TIdExpression ->
-          120
+          121
       | TIdent _ ->
-          119
+          120
       | TIdentifier ->
-          118
+          119
       | TIf _ ->
-          117
+          118
       | TInc _ ->
-          116
+          117
       | TIncludeL _ ->
-          115
+          116
       | TIncludeNL _ ->
-          114
+          115
       | TInitialiser ->
+          114
+      | TInitialize ->
           113
       | TInt _ ->
           112
@@ -1102,6 +1108,8 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           Obj.repr ()
       | TExtends ->
           Obj.repr ()
+      | TFinalize ->
+          Obj.repr ()
       | TFloat _v ->
           Obj.repr _v
       | TFor _v ->
@@ -1134,6 +1142,8 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           Obj.repr _v
       | TInitialiser ->
           Obj.repr ()
+      | TInitialize ->
+          Obj.repr ()
       | TInt _v ->
           Obj.repr _v
       | TInvalid ->
@@ -1360,19 +1370,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           Obj.repr _v
   
   let default_reduction =
-    (16, "\000\000\000\000\0014\0015\000\000\0017\0016\000\001\000\000\001p\000\000\000\000\000\136\000\000\000\000\001\236\000\142\000\000\001\024\000\000\001#\001\027\001\021\001-\002\219\002\218\000\000\001\025\000\000\001$\001\028\001\022\001.\001\026\000\000\001%\001\029\001\031\000\000\0011\002\133\0010\001&\001\030\000\135\001\023\001,\000\000\000\000\001+\000\000\000\000\000\000\000\000\000\000\001b\000\240\002\209\000\000\000\000\000\000\000\000\000\000\002\214\000\000\001(\000\000\002\216\000\000\000\000\000\000\003\022\002O\000\000\003\020\000\000\002i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\019\003\021\002U\001\012\002T\001\n\001\011\002S\002R\002Q\002M\000\000\000\000\002N\000\213\000\000\002P\000\000\003\018\000\000\000c\001\t\0020\000\000\000\000\0023\000\000\000\015\000\000\000\000\000\000\000\000\000\214\002L\002X\000[\000\021\000]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\000\000\000\023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\002\017\000R\000\223\000^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\\\000T\000\000\000S\001\020\000\000\000\000\000\140\000\224\000\000\0026\000\225\000\014\000\016\000\000\000\000\000\143\000\000\000\141\000\000\000\000\000\228\000\000\000\000\0021\0024\000\000\0022\0025\002\249\002\250\002\248\000\000\002V\002\247\000\000\002p\000\000\000\000\002o\002n\002m\002l\002k\002g\000\000\000\000\002h\000\000\002j\000\000\000\000\000g\002>\000\000\000\000\002A\000\000\000\000\002D\000\000\000\000\002?\002B\000\000\002@\002C\002r\002f\003\007\003\008\003\006\003\005\000h\000\000\000\000\000W\000\000\000V\000\235\000\000\001\228\000\000\000\000\000\000\000\000\000\000\000\218\001\234\000\000\000\000\001\136\000U\0001\000\211\000_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\000\000\0003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002W\000\000\000\144\000\000\000\000\001\212\000\000\001~\001\193\000\000\000\000\001\211\000\000\001|\001\192\000\000\000\000\000d\000\000\002q\000\000\000\000\003\n\003\t\000\000\001\229\000\000\000\000\002\252\002\251\000\000\000Q\000\150\000\000\001d\000\000\002\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\248\000\154\000\000\000\000\000n\000o\001\247\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\165\001\217\000\000\000\151\000\160\000\000\001\219\000\000\000\000\000\000\000\000\000\152\000\166\000\000\001j\000\000\000\000\002\211\000\000\000\000\000\138\000\000\000\000\002\210\000\000\000\000\000\000\002\213\002\217\000\000\000\000\000\000\001)\000\000\000\222\000\000\001*\000\000\000\000\001M\000\000\001L\000\000\001Z\000\000\001r\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000\147\000\000\000\000\000\000\000\000\000\149\000\000\000\145\000\000\002\245\000\000\000\194\002\244\000\000\000\000\000\148\000\000\000\146\002\205\002\207\002\208\002\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002v\000\000\000\000\000\000\000\000\002}\000\000\000\000\002|\002{\002z\002y\002x\001I\002t\000\000\000\000\002u\000\000\002w\000\000\000\000\000i\002E\000\000\000\000\002H\000\000\000\000\002K\000\000\000\000\002F\002I\000\000\002G\002J\002\127\002s\003\014\003\015\003\013\003\012\000j\000\000\000\000\000Z\000\000\000Y\000\000\002~\000\000\001\194\000X\000?\000\234\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\016\000\000\002\196\000\000\002\195\000\000\000\000\000\000\000\000\003\029\000\000\000\000\000\000\003\030\000\000\000\018\000\000\000\000\000\000\003\025\000\000\001\138\000\000\000\000\000\000\000\167\002\186\001`\000\000\000\156\001_\0019\0018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\215\000\216\000\200\000\000\001n\000\000\000\000\000\199\000\195\000\000\000\202\000\196\000\201\000\000\002\198\000\000\002\197\002\183\000\000\000\000\000\000\000\000\000\000\002\192\000\000\000\000\000\000\000\000\000\000\002\193\002\185\000\000\002\199\000\000\002\187\000\000\000\171\000\000\002\202\000\155\000\000\001;\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000w\000\000\000\000\000\000\002\\\000\000\000\000\000\000\002d\000\000\000\000\002c\000\000\003\003\002b\002a\002`\002_\002^\002Z\000\000\000\000\002[\000\000\002]\000\000\000\000\000\000\000\000\000\000\000e\0027\000\000\000\000\002:\000\000\000\000\002=\000\000\000\000\0028\002;\000\000\0029\002<\002e\002Y\000f\003\000\003\001\002\255\002\254\003\002\000\000\000\000\000\000\000\000\000\210\000\209\000\000\000\000\000\000\000\000\001?\000\000\000\220\001<\000\000\000\208\001B\000\000\000\000\001C\000\000\000\000\001D\000\000\001l\000#\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\000%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001E\000\000\001A\000\000\000\000\001G\000\000\000\000\000\000\000\000\000\000\000\000\000t\000q\000r\001H\001>\000\000\001=\000\000\000\187\000\000\002\164\000\000\000\000\000\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\190\000\000\000\000\000\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000\000\000\180\000\000\000\177\000\000\000\000\000\000\000\000\000\000\000\188\000\000\000\184\000\000\000\000\002\223\000\000\002\230\000\173\000\000\000\000\000\000\000\000\000\185\000\000\000\181\000\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\192\000\000\002\224\000\172\000\000\002\225\000\000\002\232\000\000\000\000\000\000\000\000\000\191\000\000\000\175\000\000\000\000\000\000\000\000\001\014\000\000\000\000\000\000\000\179\000\000\000\176\000\000\000\000\000\000\000\000\000\000\000\186\000\000\000\182\000\169\000\168\000\000\002\233\002\234\000\000\002\235\000\000\002\236\000\000\001:\002\190\000\000\000\000\001\216\000\000\001\134\001\198\000\000\002\184\000\000\000\000\000\000\002\189\000\000\000\000\000\000\001\002\000\000\000\252\000\000\000\253\000\000\001\007\000\251\001\006\000\000\002\201\001\008\000\000\000\174\000\000\000\000\000\000\000\000\001\004\000\255\001\213\000\000\001\000\000\000\001\001\000\000\001\128\001\195\000\000\000\000\000\000\001\224\000\000\001\222\000\000\000\000\001\226\001\220\000\000\001\227\001\221\000\000\002\203\001\230\000\000\000\170\000\000\000\000\001\214\000\000\001\130\001\196\000\000\003\026\000\000\003\023\000\000\003\024\000\019\000\020\000\000\000\000\002\148\000\000\002\147\000\000\000\000\002\150\000\000\002\149\000\000\000\000\000\000\002\001\000\000\000\000\002\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\008\000\000\000\000\002\011\000\000\000\000\001\251\000\000\000\000\001\254\000\000\000\000\000\000\002\002\000\000\000\000\002\006\000\000\000\000\001\215\000\000\000\000\001\255\000\000\000\000\002\003\002\145\001\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\007\000\000\000\000\002\n\000\000\002\146\000\000\000\000\000\000\000\000\002\t\000\000\001\249\000\000\001\250\000\000\000\000\001\253\000\000\000\000\000\000\002\000\000\000\000\000\002\004\000\000\001\132\001\197\000\000\002\151\000\000\000\000\000\000\003\027\000\017\000u\000\000\003\028\000\000\000\000\002\160\000\000\000\000\002\204\000a\000\000\000\000\000\000\000b\000\000\002\194\000\000\001f\002\191\000\000\000\000\001S\000\000\001R\000\000\001[\000\000\001x\000\000\000\000\000\000\001Q\000\000\001P\000\000\001X\000\000\001v\000\000\000\000\000\000\001U\000\000\001T\000\000\001Y\000\000\001z\000\000\000\000\000\000\001V\000\000\000\000\000\000\000\000\001O\000\000\001N\000\000\001\\\000\000\001t\000\000\000\000\000\000\001W\000\002\000\000\000N\000O\000M\001]\000\003\000\000\000\000\002\130\000\000\002\015\000\000\002\136\002\138\000\000\000\000\001\161\002\139\002\137\000\128\000\000\000\000\002\182\000\000\000\000\000\000\000z\000\000\000\000\002\170\000\000\001\244\001\243\001\156\002\143\002\134\002\135\000\000\001\189\000\000\002\131\000\000\000\000\000|\000\000\000\000\002\174\000\000\001\171\000\000\000\000\001\167\000\000\000\000\000\000\001\170\000\000\001\169\000\000\000\000\000\000\000\000\000\000\000\000\001\190\000\000\001\165\000\000\001\164\000\000\000v\000\000\000\000\002\162\000\000\000\000\001\160\000\000\000\000\000~\000\000\000\000\002\178\000\000\000\000\000\000\000{\000\000\000\000\002\172\000\000\001\240\001\239\001\152\002\141\000\000\001\176\000\000\000\000\000\000\001\173\000\000\001\178\000\000\000\000\001\168\000\000\000\000\001\174\000\000\000\000\001\175\000\000\000\000\000\000\001\163\000\000\000\000\000\000\000\000\000\000\000\000\001\191\000\000\001\166\000}\000\000\000\000\002\176\000\000\000\000\000\000\0013\000y\0012\000\000\000\000\002\168\000\000\001\238\001\237\001\150\002\140\000\000\000\127\000\000\000\000\002\180\000\000\000\000\000\000\000\000\001\242\001\241\001\154\002\142\000\000\001\183\000\000\001\187\000\000\000\000\001\179\000\000\000\000\000\000\001\172\000\000\001\177\000\000\000\000\000\000\000\000\000\000\000\000\001\186\001\159\000\000\001\185\000\000\000\000\000\000\000\000\001\182\000\000\000\000\001\181\000\000\001\180\000\000\000\000\000\000\000\000\001\184\000\000\001\188\000\000\000\000\001^\000\004\000\000\001\162\000\005\000\000\000\000\000\238\000\006\000\000\001\202\001\203\001\201\000\000\000\000\000\000\000\000\000\000\000\000\000x\000\000\000\000\002\166\000\000\000\229\001\200\001\144\002\220\001\146\000\000\000\007\000\000\001\205\001\206\001\204\000\000\000\000\000\000\000\000\000\000\000\000\000\239\000\242\000\000\000\000\000\000\000\000\000\247\000\249\000\248\000\243\000\245\000\244\000\000\000\000\000\000\000\000\000\000\002\226\002\239\000\000\002\227\000\000\002\228\000\000\000\000\002\221\000\000\000\000\000\000\000\000\002\238\000\000\000\000\002\237\001\210\001\209\000\000\000\000\001\148\000\000\001\199\001\207\000\000\000\000\000\000\000\000\001\246\000\000\000\000\000l\000m\000\000\000\000\000\000\001\245\000\000\000\163\000\000\001h\000\000\000\000\000\162\000\158\000\000\000\000\000\000\000\000\001\013\000\000\000\000\002\242\000\000\002\243\000\000\000\000\001\233\001\231\000\000\001\232\000\008\000\000\000\t\000\000\002 \002!\002\031\000\000\000\000\002\030\000\000\000\n\000\000\002#\002$\002\"\000\000\002&\000\000\000\000\000\000\002\024\000\000\000\000\002\026\000\000\002\020\000\000\002\022\000\000\002\027\000\000\002\028\002\021\002\019\002'\001\158\000\000\002\029\000\000\002)\000\000\002(\000\000\002*\000\000\002\144\000\011\000\000\000\000\000\000\000\000\000\000\000\000\002+\000\000\000\000\002.\000\000\002-\000\000\002,\000\203\000\000\000\000\000\000\000\000\000\204\002/\000\000\000\000\002\155\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\000\002\158\000k\000\000\000\000\000\212\000\000\000\000\000\232\000\231\000\230\000\000\001K\000\000\002\154\001\142\001\140\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\153\000\000\000\000\000\000\000\000\000\000\000\000\002\152\000\000\000\013\000\000\000\000\000\000\000\000\000\000\002\156")
+    (16, "\000\000\000\000\0015\0016\000\000\0018\0017\000\001\000\000\001q\000\000\000\000\000\137\000\000\000\000\001\237\000\143\000\000\001\025\000\000\001$\001\028\001\022\001.\002\226\002\225\000\000\001\026\000\000\001%\001\029\001\023\001/\001\027\000\000\001&\001\030\001 \000\000\0012\002\134\0011\001'\001\031\000\136\001\024\001-\000\000\000\000\001,\000\000\000\000\000\000\000\000\000\000\001c\000\241\002\216\000\000\000\000\000\000\000\000\000\000\002\221\000\000\001)\000\000\002\223\000\000\000\000\000\000\003\029\002P\000\000\003\027\000\000\002j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\026\003\028\002V\001\013\002U\001\011\001\012\002T\002S\002R\002N\000\000\000\000\002O\000\214\000\000\002Q\000\000\003\025\000\000\000c\001\n\0021\000\000\000\000\0024\000\000\000\015\000\000\000\000\000\000\000\000\000\215\002M\002Y\000[\000\021\000]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\000\000\000\023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\002\018\000R\000\224\000^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\\\000T\000\000\000S\001\021\000\000\000\000\000\141\000\225\000\000\0027\000\226\000\014\000\016\000\000\000\000\000\144\000\000\000\142\000\000\000\000\000\229\000\000\000\000\0022\0025\000\000\0023\0026\003\000\003\001\002\255\000\000\002W\002\254\000\000\002q\000\000\000\000\002p\002o\002n\002m\002l\002h\000\000\000\000\002i\000\000\002k\000\000\000\000\000g\002?\000\000\000\000\002B\000\000\000\000\002E\000\000\000\000\002@\002C\000\000\002A\002D\002s\002g\003\014\003\015\003\013\003\012\000h\000\000\000\000\000W\000\000\000V\000\236\000\000\001\229\000\000\000\000\000\000\000\000\000\000\000\219\001\235\000\000\000\000\001\137\000U\0001\000\212\000_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\000\000\0003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002X\000\000\000\145\000\000\000\000\001\213\000\000\001\127\001\194\000\000\000\000\001\212\000\000\001}\001\193\000\000\000\000\000d\000\000\002r\000\000\000\000\003\017\003\016\000\000\001\230\000\000\000\000\003\003\003\002\000\000\000Q\000\151\000\000\001e\000\000\002\219\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\249\000\155\000\000\000\000\000n\000o\001\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\166\001\218\000\000\000\152\000\161\000\000\001\220\000\000\000\000\000\000\000\000\000\153\000\167\000\000\001k\000\000\000\000\002\218\000\000\000\000\000\139\000\000\000\000\002\217\000\000\000\000\000\000\002\220\002\224\000\000\000\000\000\000\001*\000\000\000\223\000\000\001+\000\000\000\000\001N\000\000\001M\000\000\001[\000\000\001s\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\148\000\000\000\000\000\000\000\000\000\150\000\000\000\146\000\000\002\252\000\000\000\195\002\251\000\000\000\000\000\149\000\000\000\147\002\212\002\214\002\215\002\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002w\000\000\000\000\000\000\000\000\002~\000\000\000\000\002}\002|\002{\002z\002y\001J\002u\000\000\000\000\002v\000\000\002x\000\000\000\000\000i\002F\000\000\000\000\002I\000\000\000\000\002L\000\000\000\000\002G\002J\000\000\002H\002K\002\128\002t\003\021\003\022\003\020\003\019\000j\000\000\000\000\000Z\000\000\000Y\000\000\002\127\000\000\001\195\000X\000?\000\235\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\024\003\023\000\000\002\203\000\000\002\202\000\000\000\000\000\000\000\000\003$\000\000\000\000\000\000\003%\000\000\000\018\000\000\000\000\000\000\003 \000\000\001\139\000\000\000\000\000\000\000\168\002\193\001a\000\000\000\157\001`\001:\0019\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\216\000\217\000\201\000\000\001o\000\000\000\000\000\200\000\196\000\000\000\203\000\197\000\202\000\000\002\205\000\000\002\204\002\190\000\000\000\000\000\000\000\000\000\000\002\199\000\000\000\000\000\000\000\000\000\000\002\200\002\192\000\000\002\206\000\000\002\194\000\000\000\172\000\000\002\209\000\156\000\000\001<\000\000\000\000\000\000\000\000\000\000\000\000\001\018\000\000\000w\000\000\000\000\000\000\002]\000\000\000\000\000\000\002e\000\000\000\000\002d\000\000\003\n\002c\002b\002a\002`\002_\002[\000\000\000\000\002\\\000\000\002^\000\000\000\000\000\000\000\000\000\000\000e\0028\000\000\000\000\002;\000\000\000\000\002>\000\000\000\000\0029\002<\000\000\002:\002=\002f\002Z\000f\003\007\003\008\003\006\003\005\003\t\000\000\000\000\000\000\000\000\000\211\000\210\000\000\000\000\000\000\000\000\001@\000\000\000\221\001=\000\000\000\209\001C\000\000\000\000\001D\000\000\000\000\001E\000\000\001m\000#\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\000%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001F\000\000\001B\000\000\000\000\001H\000\000\000\000\000\000\000\000\000\000\000\000\000t\000q\000r\001I\001?\000\000\001>\000\000\000\188\000\000\002\169\000\000\000\000\000\184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\191\000\000\000\000\000\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000\000\000\181\000\000\000\178\000\000\000\000\000\000\000\000\000\000\000\189\000\000\000\185\000\000\000\000\002\230\000\000\002\237\000\174\000\000\000\000\000\000\000\000\000\186\000\000\000\182\000\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\190\000\000\000\000\000\193\000\000\002\231\000\173\000\000\002\232\000\000\002\239\000\000\000\000\000\000\000\000\000\192\000\000\000\176\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000\000\000\180\000\000\000\177\000\000\000\000\000\000\000\000\000\000\000\187\000\000\000\183\000\170\000\169\000\000\002\240\002\241\000\000\002\242\000\000\002\243\000\000\001;\002\197\000\000\000\000\001\217\000\000\001\135\001\199\000\000\002\191\000\000\000\000\000\000\002\196\000\000\000\000\000\000\001\003\000\000\000\253\000\000\000\254\000\000\001\008\000\252\001\007\000\000\002\208\001\t\000\000\000\175\000\000\000\000\000\000\000\000\001\005\001\000\001\214\000\000\001\001\000\000\001\002\000\000\001\129\001\196\000\000\000\000\000\000\001\225\000\000\001\223\000\000\000\000\001\227\001\221\000\000\001\228\001\222\000\000\002\210\001\231\000\000\000\171\000\000\000\000\001\215\000\000\001\131\001\197\000\000\003!\000\000\003\030\000\000\003\031\000\019\000\020\000\000\000\000\002\151\000\000\002\150\000\000\000\000\002\153\000\000\002\152\000\000\000\000\000\000\002\002\000\000\000\000\002\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\t\000\000\000\000\002\012\000\000\000\000\001\252\000\000\000\000\001\255\000\000\000\000\000\000\002\003\000\000\000\000\002\007\000\000\000\000\001\216\000\000\000\000\002\000\000\000\000\000\002\004\002\148\001\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\008\000\000\000\000\002\011\000\000\002\149\000\000\000\000\000\000\000\000\002\n\000\000\001\250\000\000\001\251\000\000\000\000\001\254\000\000\000\000\000\000\002\001\000\000\000\000\002\005\000\000\001\133\001\198\000\000\002\154\000\000\000\000\000\000\003\"\000\017\000u\000\000\003#\000\000\000\000\002\165\000\000\000\000\002\211\000a\000\000\000\000\000\000\000b\000\000\002\201\000\000\001g\002\198\000\000\000\000\001T\000\000\001S\000\000\001\\\000\000\001y\000\000\000\000\000\000\001R\000\000\001Q\000\000\001Y\000\000\001w\000\000\000\000\000\000\001V\000\000\001U\000\000\001Z\000\000\001{\000\000\000\000\000\000\001W\000\000\000\000\000\000\000\000\001P\000\000\001O\000\000\001]\000\000\001u\000\000\000\000\000\000\001X\000\002\000\000\000N\000O\000\000\000\000\002\137\002\139\000\000\000\000\001\162\002\140\002\138\000\129\000\000\000\000\002\189\000\000\000\000\002\146\002\135\002\136\000\000\001\174\000M\001^\000\003\000\000\000\000\002\131\000\000\002\016\000\000\000\128\000\000\000\000\002\187\000\000\000\000\000\000\000z\000\000\000\000\002\175\000\000\001\245\001\244\001\157\002\144\000\000\001\190\000\000\002\132\000\000\000\000\000|\000\000\000\000\002\179\000\000\001\171\000\000\000\000\001\167\000\000\000\000\000\000\001\170\000\000\001\169\000\000\000\000\000\000\000\000\000\000\000\000\001\191\000\000\001\165\000\000\001\164\000\000\000v\000\000\000\000\002\167\000\000\000\000\001\161\000\000\000\000\000~\000\000\000\000\002\183\000\000\000\000\000\000\000{\000\000\000\000\002\177\000\000\001\241\001\240\001\153\002\142\000\000\001\177\000\000\000\000\000\000\001\173\000\000\001\179\000\000\000\000\001\168\000\000\000\000\001\175\000\000\000\000\001\176\000\000\000\000\000\000\000\000\000\000\000\000\001\192\000\000\001\166\000}\000\000\000\000\002\181\000\000\000\000\000\000\0014\000y\0013\000\000\000\000\002\173\000\000\001\239\001\238\001\151\002\141\000\000\000\127\000\000\000\000\002\185\000\000\000\000\000\000\000\000\001\243\001\242\001\155\002\143\000\000\001\184\000\000\001\188\000\000\000\000\001\180\000\000\000\000\000\000\001\172\000\000\001\178\000\000\000\000\000\000\000\000\000\000\000\000\001\187\001\160\000\000\001\186\000\000\000\000\000\000\000\000\001\183\000\000\000\000\001\182\000\000\001\181\000\000\000\000\000\000\000\000\001\185\000\000\001\189\000\000\000\000\001_\000\004\000\000\001\163\000\005\000\000\000\000\000\239\000\006\000\000\001\203\001\204\001\202\000\000\000\000\000\000\000\000\000\000\000\000\000x\000\000\000\000\002\171\000\000\000\230\001\201\001\145\002\227\001\147\000\000\000\007\000\000\001\206\001\207\001\205\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\243\000\000\000\000\000\000\000\000\000\248\000\250\000\249\000\244\000\246\000\245\000\000\000\000\000\000\000\000\000\000\002\233\002\246\000\000\002\234\000\000\002\235\000\000\000\000\002\228\000\000\000\000\000\000\000\000\002\245\000\000\000\000\002\244\001\211\001\210\000\000\000\000\001\149\000\000\001\200\001\208\000\000\000\000\000\000\000\000\001\247\000\000\000\000\000l\000m\000\000\000\000\000\000\001\246\000\000\000\164\000\000\001i\000\000\000\000\000\163\000\159\000\000\000\000\000\000\000\000\001\014\000\000\000\000\002\249\000\000\002\250\000\000\000\000\001\234\001\232\000\000\001\233\000\008\000\000\000\t\000\000\002!\002\"\002 \000\000\000\000\002\031\000\000\000\n\000\000\002$\002%\002#\000\000\002'\000\000\000\000\000\000\002\025\000\000\000\000\002\027\000\000\002\021\000\000\002\023\000\000\002\028\000\000\002\029\002\022\002\020\002(\001\159\000\000\002\030\000\000\002*\000\000\002)\000\000\002+\000\000\002\147\000\011\000\000\000\000\000\000\000\000\000\000\000\000\002,\000\000\000\000\002/\000\000\002.\000\000\002-\000\204\000\000\000\000\000\000\000\000\000\205\0020\000\000\000\000\002\158\000\000\000\000\000\000\002\159\000\000\000\000\000\238\000\000\000\000\000\000\000\000\000\000\002\163\000k\000\000\000\000\000\213\000\000\000\000\000\233\000\232\000\231\000\000\001L\000\000\002\157\001\143\001\141\000\000\000\000\000\000\002\160\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\002\155\000\000\000\013\000\000\000\000\000\000\000\000\000\000\002\161")
   
   let error =
-    (171, "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\128\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\240\000\000\000\000\000\000\000=j\188\000 \004\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\008\003\008\000\001\012\192\140\002\000\128@\001\000\000\019!\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000/\209\192\004\001\132\000\004\134`F\001\000@!\000\128\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\157C\000\016\006\016\000\018\025\129\024\004\001\000\132\002\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\2508\000\1280\128\000\144\204\008\192 \008\004 \016\000\0012\024\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\168`\002\000\194\000\002C0#\000\128 \016\128@\000\004\200b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\234\024\000\1280\128\000\144\204\008\192 \008\004 \016\000\0012\024\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235U\224\001\000 \000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\149C\000\016\006\016\000\019\025\129\024\004\001\000\132\002\000\000&C\023\173W\128\004\000\128\000\004\016\016\000\000\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000@ \000\000\000\000\000\000\000\000\000\000\000\000H\161\128\000\000\008\000\008\004\128\140\002\000\000B\001\000\000\019\001\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235U\224\t\000 \000\001\004\004\000\000\000\000\004\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\004\000\128\000\004\016\016\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\002\000\000\000\000\000\000\030\181^\000\016\002\000\000\016@@\000\000\000\000@\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235U\224\001\000 \000\001\004\004\000\000\000\000\004\000\001\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000@\000\008\000\000\000\000\000\000\000\002\000\000\136\000\000\000\000\000\005 \000$\026\005\001\157\160\000\"@ \016\001\008D\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000D\128@\000\002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\018\001\000\000\008@ \128\000\000\000\005 \000$\026\005\001\157\160\000\"@ \016\001\008\004\016\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\002\000!\000\130z\213x\000T\136\000\144h\021\006v\128\000\137\000\128@\004 \016OZ\175\000\n\145\000\018\013\002\160\206\208\000\017 \016\008\000\132\002\008\000\000\000\000R\000\002A\160P\025\218\000\002$\002\000\000\016\128A=j\188\000*D\000H4\n\131;@\000D\128@ \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\002\000!\000\130\000\000\000\000\020\128\000\144h\020\006v\128\000\137\000\128@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000D\128@ \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\018\001\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\002\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\"0M\150K\000\000\020\001\004\000\003\186\002'\135p\000\000\000\000\000\000\000\000\000\000\002\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\000\021\"\000$\026\005A\159\160\000\"@ \016\001\t\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000@ \131\000\150\000\000(\000\000\000\007d\000M\014\224\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\004\128\001\016\130l\"X\000\000\160\008\000\000\029\144\001<;\128\000\000\000\n@\000H4\n\003;@\000D\128@ \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\001\016\130l\"X\000\000\160\008\000\000\025\144\001<\027\128\000\000\000\n@\000H4\n\003;@\000D\128@ \002\016\008 \000\000\018\000\004B\t\176\137`\000\002\128 \000\000f@\004\240n\000\000\000\000)\000\001 \208(\012\237\000\001\018\001\000\128\008@ \128\000\000H\000\017\008&\194%\128\000\n\000\128\000\001\153\000\019\193\184\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\002\000!\000\130\000\000\001 \000D \155\008\150\000\000(\002\000\000\006d\000O\006\224\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000D\128@ \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\018\001\000\128\008@ \128\000\000H\000\017\008&\194%\128\000\n\000\128\000\001\153\000\019\193\184\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\002\000!\000\130\000\000\001 \000D \155\008\150\000\000(\002\000\000\006d\000O\006\224\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\004\128\001\016\130l\"X\000\000\160\008\000\000\025\144\001<\027\128\000\000\000\n@\000H4\n\003;@\000D\128@ \002\016\008 \000\000\018\000\004B\t\176\137`\000\002\128 \000\000f@\004\240n\000\000\000\000)\000\001 \208(\012\237\000\001\018\001\000\128\008@ \128\000\000H\000\017\008&\194%\128\000\n\000\128\000\001\153\000\019\193\184\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\003\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\002\000!\000\130\000\000\001 \000D \155\008\150\000\000(\002\000\000\006d\000O\006\224\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\004\128\001\016\130l\"X\000\000\160\008\000\000\025\144\001<\027\128\000\000\000\n@\000H4\n\003;@\000D\128@ \002\016\008 \000\000\018\000\004B\t\176\137`\000\002\128 \000\000f@\004\240n\000\000\000\000)\000\001 \208(\012\237\000\001\018\001\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\137\000\128@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\006\000\000\002\025\000\000\000\001\000\128\002\000\000&@\016\018\168`\002\000\194\000\002C0#\000\128 \016\128@\000\004\200b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\173V\128\004\000\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\001\000a\000\000!\144\017\128@\016\008\000 \000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\128\001\235U\224\001R \002A\160T\025\250\000\002$\002\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008\144\008\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\001H\000\t\006\129@gh\000\008\144\008\000\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000D\128@\000\002\016\008 \000\000\000\001H\000\t\006\129@gh\000\008\144\008\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\005\001\157\160\000\"@ \000\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\137\000\128\000\004 \016@\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\000\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\004D\008\178I@\000\002\000 \128\0005@D0\142\000\000\000\000\000\000\000\000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\214\171\192\002\164@\004\131@\1683\244\000\004H\004\002\000! \130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002A\160P\025\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000D\000\139\000\148\000\000 \002\000\000\003D\000C\008\224\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000D\128@ \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000@\000\002\000\000\000\000\000B\144\000\018\013\002\128\206\208\000\017 \016\000\000\132\002\008\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000D\128@ \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\000\000!\000\130\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000@\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\017\000\"\192%\000\000\008\000\128\000\000\145\000\016\1928\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\000\000!\000\130\000\000\001 \000D\000\139\000\148\000\000 \002\000\000\002D\000C\000\224\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\000\000\132\002\008\000\000\004\128\001\016\002,\002P\000\000\128\008\000\000\t\016\001\012\003\128\000\000\000\n@\000H4\n\003;@\000D\128@\000\002\016\008 \000\000\018\000\004@\008\176\t@\000\002\000 \000\000$@\0040\014\000\000\000\000)\000\001 \208(\012\237\000\001\018\001\000\000\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\000\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\000\000\132\002\008\000\000\004\128\001\016\002,\002P\000\000\128\008\000\000\t\016\001\012\003\128\000\000\000\n@\000H4\n\003;@\000D\128@\000\002\016\008 \000\000\018\000\004@\008\176\t@\000\002\000 \000\000$@\0040\014\000\000\000\000)\000\001 \208(\012\237\000\001\018\001\000\000\008@ \128\000\000H\000\017\000\"\192%\000\000\008\000\128\000\000\145\000\016\1928\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\000\000!\000\130\000\000\001 \000D\000\139\000\148\000\000 \002\000\000\002D\000C\000\224\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\000\000\132\002\008\000\000\004\128\001\016\002,\002P\000\000\128\008\000\000\t\016\001\012\003\128\000\000\000\n@\000H4\n\003;@\000D\128@0\002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\018\001\000\000\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\000\000!\000\130\000\000\001 \000D\000\139\000\148\000\000 \002\000\000\002D\000C\000\224\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\000\000\132\002\008\000\000\004\128\001\016\002,\002P\000\000\128\008\000\000\t\016\001\012\003\128\000\000\000\n@\000H4\n\003;@\000D\128@\000\002\016\008 \000\000\018\000\004@\008\176\t@\000\002\000 \000\000$@\0040\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000R\000\002A\160P\025\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000@\000z\213x\000@\008\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\005 \000$\026\005\001\157\160\000\"@ \016\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235U\224\001R \002A\160T\025\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\213x\000T\136\000\144h\021\006v\128\000\137\000\128@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000 \000\000\000\000\000\000\000\008\000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\145C\000\000\000\016\000\016\t\001\024\004\000\000\132\002\000\000&\003\016\018(`\000\000\002\000\002\000 #\000\128\000\016\128@\000\004\192b\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\001\235U\224\001\000 \000\001\000\004`\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\016\008\000\000\000\000\000\000\000\000\000\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\003\214\171\192\002\000@\000\002\000\008\192\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\002\000\000\000\000\008\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\003\214\171\192\002\000@\000\002\000\008\192\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\000\015Z\175\000\008\001\000\000\008\000#\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\016\000\000\000\004@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000=j\188\000 \004\000\000 \000\140\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\004\000\128\000\004\016\016\000\000\000\000\016\000\000\000\000\008\000\245\170\240\000\128\016\000\000\130\002\000\000\000\000\002\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\235U\160\001\000 \000\000\000\004\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tT0\001\000a\000\0011\152\017\128@\016\008@ \000\002d1z\213x\000@\008\000\000A\001\000\000\000\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000\000\000\000\000\001z\213x\000@\008\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235U\224\001\000 \000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\245\252\016\\\137\000\128c\021\199w\132\001\189A\128\008\214 P@$P\192\000\000\000\000\004\002\000F\000\000\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000=j\188\000 \004\000\000 \000\140\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\214\171\192\002\000@\000\002\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001P \000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000*\004\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\007\173W\128\004\000\128\000\004\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\181Z\000\016\002\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\137\000\128@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000@r\004\002\001\136Q\029\218\016\006\245\006\000#\024\129A\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008\144\008\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\015\254\191\130\011\145 \018\013B\184\238\240\1287\1680\t\030\198\026\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000@0\n\003;@\000\196\128@\000\002\016\008 \000\000\000\001H\000\008\006\001@gh\000\024\144\008\000\000B\001\004\245\170\240\000\169\016\001 \208*\012\237\000\001\018\001\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\002\144\000\016\012\002\128\206\208\0001 \016\000\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\016\012\002\128\206\208\0001 \016\000\000\132\002\008\000\000\000\000R\000\002A\160P\025\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\008\006\001@gh\000\024\144\008\000\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000 \024\005\001\157\160\000b@ \000\001\008\004\016\000\000\000\000\164\000\004\003\000\1603\180\000\012H\004\000\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\001\017\130l\178X\000\000\160\008 \000\029P\016(;\128\000\000\000\000\000\000\000\000\000\000\016\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\245\170\240\000\169\016\001 \208*\012\253\000\001\018\001\000\128\008H \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\137\000\128@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\017\008&\194%\128\000\n\000\128\000\001\209\000\002\131\184\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\002\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\"\016M\132K\000\000\020\001\000\000\003\"\000\005\003p\000\000\000\001H\000\008\006\001@gh\000\024\144\008\000\000B\001\004\000\000\002@\000\136A6\017,\000\000P\004\000\000\012\136\000\020\013\192\000\000\000\005 \000 \024\005\001\157\160\000b@ \000\001\008\004\016\000\000\t\000\002!\004\216D\176\000\001@\016\000\0002 \000P7\000\000\000\000\020\128\000\128`\020\006v\128\001\137\000\128\000\004 \016@\000\000$\000\008\132\019a\018\192\000\005\000@\000\000\200\128\001@\220\000\000\000\000R\000\002\001\128P\025\218\000\006$\002\000\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\008\006\001@gh\000\024\144\008\000\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000 \024\005\001\157\160\000b@ \000\001\008\004\016\000\000\t\000\002!\004\216D\176\000\001@\016\000\0002 \000P7\000\000\000\000\020\128\000\128`\020\006v\128\001\137\000\128\000\004 \016@\000\000$\000\008\132\019a\018\192\000\005\000@\000\000\200\128\001@\220\000\000\000\000R\000\002\001\128P\025\218\000\006$\002\000\000\016\128A\000\000\000\144\000\"\016M\132K\000\000\020\001\000\000\003\"\000\005\003p\000\000\000\001H\000\008\006\001@gh\000\024\144\008\000\000B\001\004\000\000\002@\000\136A6\017,\000\000P\004\000\000\012\136\000\020\013\192\000\000\000\005 \000 \024\005\001\157\160\000b@ \000\001\008\004\016\000\000\t\000\002!\004\216D\176\000\001@\016\000\0002 \000P7\000\000\000\000\020\128\000\144h\020\006v\128\000\137\000\128`\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000R\000\002\001\128P\025\218\000\006$\002\000\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\008\006\001@gh\000\024\144\008\000\000B\001\004\000\000\002@\000\136A6\017,\000\000P\004\000\000\012\136\000\020\013\192\000\000\000\005 \000 \024\005\001\157\160\000b@ \000\001\008\004\016\000\000\t\000\002!\004\216D\176\000\001@\016\000\0002 \000P7\000\000\000\000\020\128\000\128`\020\006v\128\001\137\000\128\000\004 \016@\000\000$\000\008\132\019a\018\192\000\005\000@\000\000\200\128\001@\221\235U\224\001R \002A\160T\025\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \008$\026\005\001\157\160\000\"@ \016\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\215\240yr$\002\001\140W\029\222\016\006\245\006\000#X\129A\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008\144\008\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\137\000\128@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000@\000\000\000\000\000\001\008\128\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\235\248 \185\018\001\000\196+\142\239\008\003z\131\000\017\172@\160\159\253\127\004\023\"@$\026\133\241\221\225\000oP`\0185\138\020\019\255\175\224\242\228H\004\003\024\174;\188 \013\234\012\000F\177\002\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\255\195\203\145 \016\012b\248\238\241\1287\1690\129\030\199\026\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\008.D\128@1\138\227\187\194\000\222\160\192\004k\016('\255_\193\005\200\144\t\006\161|wx@\027\212\024\004\141b\133\004\255\235\248 \185\018\001 \212+\142\239\008\003z\131\000\145\172A\160\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\008\140\019e\146\192\000\005\000A\000\000\238\128\137A\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004H\004\002\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\002\003\144 \016\012B\136\238\208\1287\1680\001\024\196\n\008\000\000\000@r\004\002\001\136Q\029\218\016\006\245\006\000#\024\129A\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\001\004\131@\1603\180\000\004H\004\002\000!\000\130\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\004\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000D\128@ \002\018\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000 9\002\001\000\196(\142\237\008\003z\131\000\017\140@\160\128\000\000\004\007 @ \024\133\017\221\161\000oP`\0021\136\020\016\000\000\000\000\000\000\000\000\000\000\001\000\000\000\008\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000 \000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\000 \000\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\005\001\157\160\000\"@ \016\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\001\001\130\012\146X\000\000\128\000 \000\012\208\017 #\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\005H\128\t\006\129Pg\232\000\008\144\008\004\000BA\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\004\007 @ \024\133\017\221\161\000oP`\0021\136\020\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\235\248 \185\018\001 \212+\142\239\008\003z\131\000\145\172@\160\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\191\240\242\228H\004\003\024\190;\188`\013\234L G\177\198\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\004\000\128\000\004\000\016\000\000\000\000\016\000\000\000\000\000\000\002E\012\000\000\000\000\000@ \004`\000\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\003\214\171\192\002\000@\000\002\000\008\192\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\002\000\000\128\000\000\000\000\000\005 \000$\026\133\001\189\160\000\"@ \016\001\008\004\016\000\000\000\000\164\000\004\0030\1603\180\000\012H\004\n\128!\004\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\016\012\002\128\206\208\0001 \016\000\000\132\002\008\000\000\000\000R\000\002A\160P\025\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\245\170\240\000\169\016\001 \208*\012\237\000\001\018\001\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\128`\020\006v\128\001\137\000\128\000\004 \016@\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000@0\n\003;@\000\196\128@\000\002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001\000\192(\012\237\000\003\018\001\000\000\008@ \128\000\000\000\005 \000 \024\005\001\157\160\000b@ \000\001\008\004\019\214\171\192\002\164@\004\131@\1683\180\000\004H\004\002\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\002\144\000\016\012\002\128\206\208\0001 \016\000\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\004\0082I@\000\002\000\000\128\000!@D\000\012\000\000\000\000\000\000\000\000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\214\171\192\002\164@\004\131@\1683\244\000\004H\004\002\000! \130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002A\160P\025\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\017 \016\008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\004\000\000\000\000\000\n@\000H4\n\003;@\000D\128@ \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\0030\1603\180\000\012H\004\n\128!\004\130\000\000\000\002\020\128\000\128f\020\006v\128\001\137\000\129P\004 \144@\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002A\168P\027\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\n@\000@3\n\003;@\000\196\128@\136\002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\005 \000 \025\133\001\157\160\000b@ D\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000 \000A\128J\000\000\016\000\000\000\001\002\000 \000`\000\000\000\001H\000\008\006\001@gh\000\024\144\008\000\000B\001\004\000\000\002\000\000\128\001\006\001(\000\000@\000\000\000\004\008\000\128\001\128\000\000\000\005 \000 \024\005\001\157\160\000b@ \000\001\008\004\016\000\000\008\000\002\000\004\024\004\160\000\001\000\000\000\000\016 \002\000\006\000\000\000\000\020\128\000\128`\020\006v\128\001\137\000\128\000\004 \016@\000\000 \000\008\000\016`\018\128\000\004\000\000\000\000@\128\008\000\024\000\000\000\000R\000\002\001\128P\025\218\000\006$\002\000\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\008\006\001@gh\000\024\144\008\000\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000 \024\005\001\157\160\000b@ \000\001\008\004\016\000\000\008\000\002\000\004\024\004\160\000\001\000\000\000\000\016 \002\000\006\000\000\000\000\020\128\000\128`\020\006v\128\001\137\000\128\000\004 \016@\000\000 \000\008\000\016`\018\128\000\004\000\000\000\000@\128\008\000\024\000\000\000\000R\000\002\001\128P\025\218\000\006$\002\000\000\016\128A\000\000\000\128\000 \000A\128J\000\000\016\000\000\000\001\002\000 \000`\000\000\000\001H\000\008\006\001@gh\000\024\144\008\000\000B\001\004\000\000\002\000\000\128\001\006\001(\000\000@\000\000\000\004\008\000\128\001\128\000\000\000\005 \000 \024\005\001\157\160\000b@ \000\001\008\004\016\000\000\008\000\002\000\004\024\004\160\000\001\000\000\000\000\016 \002\000\006\000\000\000\000\020\128\000\128`\020\006v\128\001\137\000\128\000\004 \016@\000\000 \000\008\000\016`\018\128\000\004\000\000\000\000@\128\008\000\024\000\000\000\000R\000\002\001\128P\025\218\000\006$\002\000\000\016\128A\000\000\000\128\000 \000A\128J\000\000\016\000\000\000\001\002\000 \000`\000\000\000\001H\000\008\006\001@gh\000\024\144\008\000\000B\001\004\000\000\002\000\000\128\001\006\001(\000\000@\000\000\000\004\008\000\128\001\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000R\000\002\001\152P\025\218\000\006$\002\005@\016\130A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\008\006a@gh\000\024\144\008\021\000B\t\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\005 \000 \025\133\001\157\160\000b@ T\001\008$\016\000\000\000\000\164\000\004\0030\1603\180\000\012H\004\008\128!\004\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\002\144\000\016\012\194\128\206\208\0001 \016*\000\132\018\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\245\170\240\000\128\016\000\000\128\0020\000\000\000\000\000\000\128\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013B\128\222\208\000\017 \016\008\000\132\002\008\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000@\000H\000\000\000\000\000\000\000\002\000\000\128\000\000\000\000\000\000\000\008\000\t\000\000\000\000\000\000\000\000@\000\016\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000z\213x\000@\008\000\000@\001\024\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\016\000\004\000\000\000\000\000\000)\000\001 \212(\013\237\000\001\018\001\000\128\008@ \128\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\235U\160\001\000 \000\000\000\004\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\016\000\004\000\000\000\000\000\000)\000\001 \212(\013\237\000\001\018\001\000\128\008@ \128\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\215\240Ar$\002\001\140W\029\2220\006\245\006\000#X\129A\000\000\000\000\000\000\000\008\004\000\000\000\004\000\000\000\002 \000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\235\248 \185\018\001\000\198+\142\239\024\003z\131\008\017\172@\172\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000D`\155,\150\000 (\002\t\000\007t\004\n\014\224\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000 \000\008\000\000\000\000\000\000R\000\002A\168P\027\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\245\170\240\000\128\016\000\000\128\0020\000\000\000\000\000\000\128\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013B\128\222\208\000\017 \016\008\000\132\002\008\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\001\000\128\000\000\000\128\000\000\000D\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\175\224\130\228H\004\131P\174;\188`\013\234\012\"F\177\002\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\191\130\011\145 \016\012b\184\238\241\1287\1680\129\026\196\n\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\005H\128\t\006\129Pg\232\000\008\144\008\004\000BA\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\0020\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000=j\188\000 \004\000\000 \000\140\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\008\000\002\000\000\000\000\000\000\020\128\000\144j\020\006\246\128\000\137\000\128@\004 \016@\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\170\208\000\128\016\000\000\000\002\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\008\000\002\000\000\000\000\000\000\020\128\000\144j\020\006\246\128\000\137\000\128@\004 \016@\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\175\224\130\228H\004\131P\174;\188`\013\234\012\"F\177\002\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128@ \000\000\000 \000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255_\193\005\200\144\t\006\161\\wx\192\027\212\024\004\141b\005\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\140\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\001\000\000\000\000\000@r\004\002\001\136Q\029\218\016\006\245\006\000#\024\129A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000@\000\000\000\000\000\000\000\000\001\000\001\255\223\248Ar4\002a\168_\029\2220\014\245&\019#\216\235Y\128\000\000\008\014@\128@1\n#\187B\000\222\160\192\004c\016( \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\235\248 \185\018\001\000\198/\142\239\008\003z\131\000\017\236q\160\128\000\000\000\000\000\000\004\002\000\000\000\000\000\000\000\000\016\000\000\000\003\255\175\224\130\228H\004\003\024\190;\188 \013\234\012\000G\177\198\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\002\001\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\008.D\128H5\011\227\187\194\000\222\160\192${\028h \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\235\248 \185\018\001 \212/\142\239\008\003z\131\000\145\236q\160\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\002\000\003\255\175\224\130\228H\004\003\024\190;\188 \013\234\012\000F\177B\130\000\000\000\000\000\000\000\016\008\002\000\000\000\000\000\000\000@\000\008\000\015\254\191\130\011\145 \016\012b\248\238\240\1287\1680\001\026\197\n\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \016\004\000\000\000\000\000\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\175\224\130\228H\004\131P\190;\188 \013\234\012\002F\177B\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 #\000\000\000\016\000\000\000\000\128\000\000\000\000\000\000\008\0000\016\000\000\000\000\004\000\000\000\128\000\004\000_\253\127\004\023\"@ \024\197q\221\225\000oP`\0025\136\020\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \024\008\000\000\000\000\002\000\000\000@\000\002\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\215\240Ar4\002a\168W\029\222\016\014\245\006\001#X\137A\191\250\254\008.D\128@1\138\227\187\194\000\222\160\192\004k\016( \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\127\004\023#@&\026\133q\221\225\000\239P`\0185\136\148\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\002\000\003\255\175\224\130\228H\004\131P\190;\188 \013\234\012\002F\177B\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\004\002\000\000\000\002\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\245\252\016\\\137\000\144j\021\199w\140\001\189A\128H\214 P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\191_\192\005H\144\008\006\001Pgx\000\024\144\008\000\001b\005\004\000\000\000\000)\000A \208(\012\237\000\001\018\001\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015~\191\128\n\145 \016\012\002\160\206\240\0001 \016\000\002\196\n\008\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\000\016\002\000\000\016\000@\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002A\168P\027\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\001\235U\224\001\000 \000\001\000\004`\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\133\001\189\160\000\"@ \016\001\008\004\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000F\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\161@oh\000\008\144\008\004\000B\001\004\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\214\171@\002\000@\000\000\000\008\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H5\n\003{@\000D\128@ \002\016\008 \000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\002\000\003\223\175\224\002\164H\004\003\000\1683\188\000\012H\004\000\000\177\002\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\008\012\016d\146\192\004\004\000\001 \000b\128\129\001\024\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\161@oh\000\008\144\008\004\000B\001\004\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\000\016\002\000\000\016\000F\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002A\168P\027\218\000\002$\002\001\000\016\128A\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000z\213x\000T\136\000\144h\021\006~\128\000\137\000\128@\004$\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144j\020\006\246\128\000\137\000\128@\004 \016@\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\029j\180\000 \004\000\000\000\000\128\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131P\1607\180\000\004H\004\002\000!\000\130\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\016\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000 \000\000\002\0020\000\000\001\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\002\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\215\240Ar$\002\001\140W\029\222\016\006\245\006\000#X\129A\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\005\001\157\160\000\"@ \016\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\127\245\252\016\\\137\000\144j\021\199w\132\001\189A\128H\2460\208@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\001\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000\000\000\000\000\001\127\245\252\016\\\137\000\128c\021\199w\132\001\189A\128\008\214 P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\215\240Ar$\002\001\140W\029\222\016\006\245\006\000#X\129A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\137\000\128\000\004 \016@\000\000\000\000\000\128\000\000\000\000\000\000\000@\000\000\000\000\000\000\004\000\000\000\000R\000\002A\160P\025\218\000\002$\002\000\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008\144\008\000\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@r\004\002\001\136Q\029\218\016\006\245\006\000#\024\129A\000\000\000\000\000\002\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\016\000\000\001\001\200\016\008\006!Dwh@\027\212\024\000\140b\005\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\007 @ \024\133\017\221\161\000oP`\0021\136\020\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008\144\008\000\000B\001\004\000\000\000\000\000\008\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\245\252\000@\008\000\000@\001\000\001\000\000\001\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\191\250\254\000 \004\000\000 \000\128\000\128\000\000\128\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\235\248\000\128\016\000\000\128\002\000\002\000\000\002\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000@\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000D\128@\000\002\016\008 \000\000\000\000\000@\000\000\000\000\000\000\000 \000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\213x@\225\008\137 B\001\000\000\018\000B\148$\000\t\128 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\0008B\"\008\016\128@\000\004\128\016\165\t\000\002`\000\003\214\171\192\007\008@\001\002\016\008\000\000\144\002\020\161 \000L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\004\001\000\128\000\004\000\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\000\000\000\016\000\000\000\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\004\000\000\000\016\000\000@\016\000\000\000@\000\000\000\000\002\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\002\000\000\000\000\000\000\002\000\000\000\000\000\000\000\008\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 @\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\214\171\192\007\008D\001\002\016\008\000\000\144\002\020\161 \000D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015Z\175\000\028!\000\004\008@ \000\002@\008R\132\128\001\016\000\000\000 \000\000\128 \000\000\000\128\000\000\000\000\004\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\004\000\000\000\016\000\000@\016\000\000\000@\000\000\000\000\002\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\004\001\000\000\000\004\000\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\128\000\000\002\000\000\000\000\000\016\000@\000\000\000\000\000\016\000\000@\016\000\000\000@\000\000\128\000\002\000\008\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\128 \000\000\000\128\000\000\000\000\004\000\016\000\000\000\000\000\004\000\000\016\004\000\000\002\016\000\000 \000\000\128\002\000\000 \000\000\000\128\000\002\000\128\000\000\002\000\000\000\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\002\000\000\008\002\000\000\000\008\000\000\000\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\245\170\240\000\128\016\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000z\213x\000@\008\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\004\000\000\016\004\000\000\002\024\000\000\000\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\002\000\000\008\002\000\000\000\008\000\000\000\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000@\000\000\001\000\000\004\001\000\000\000\004\000\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000 \000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\017\128\000\002\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\004\001\000\000\000\004\000\000\000\000\000 \000\128\000\000\000\000\000 \000\000\128 \000\000\002\128\000\001\000\000\004\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\001\000@\000\000\001\000\000\000\000\000\008\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\128 \000\000\000\128\000\000\000\000\004\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000@\016\000\000\000@\000\000\000\000\002\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\001\000\000\004\001\000\000\000\004\000\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\128\000\000\003\000\000\000\000\000\016\000@\000\000\000\000\000\016\000\000@\016\000\000\t@\000\000\128\000\002\000\008\000\000\128\000\000\002\000\000\008\002\000\000\000\008\000\000\000\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\008\000\000 \008\000\000\000 \000\000\000\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\016\000\000\000@\000\001\000@\000\000\001\000\000\000\000\000\008\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\008\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\002\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\001\000@\000\000\001\000\000\000\000\000\008\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\008\000\000\000 \000\000\128 \000\000\000\128\000\000\000\000\004\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\004\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000 \008\000\000\000 \000\000\000\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\000\000\000\016\000\000\000\000\000\128\002\000\000\000\000\000\000\128\000\002\000\128\000\000\n\000\000\004\000\000\016\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015[\175\000\012\001\000\000\008D \000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\128\000\002\000\128\000\000\011\000\000\004\000\000\016\000@\000\004\000\000\000\016\000\000@\016\000\000\000@\000\000\000\000\002\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\007\173\215\128\006\000\128\000\004#\016\000\000\000\000\016\000@\000\000\000\000\000\016\000\000@\016\000\000\000@\000\000\000\000\002\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000 \008\000\000\000 \000\000\000\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000@\016\000\000\008@\000\000\000\000\002\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000@\000\001\000@\000\000\001\000\000\000\000\000\008\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\213x@\225\008\137 B\001\000\000\018\000B\148$\000\t\128 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\014\003;@\000D\128@ \002\016\008 \000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000D\128@ \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000b\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\137\000\128\000\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\004\000\000\000\000\000\n@\000H4\n\003;@\000D\128@\000\002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\251\255\008.D\128H=\014\227\187\194\000\222\164\194$k\016+0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\255\194\011\145 \018\015B\184\238\240\1287\1690\137\026\196\n\204\239\223\184\001\000 \000\000\000\004\000\000\000\000\000 \000\000\000\000\000\000\145C\000\000\000\000\000\000\008\000\000\000\000\000\004\000\000\000\000\000\003\191~\224\004\000\128\000\000\000\016\000\000\000\000\000\128\000\000\000\000\000w\239\220\000\128\016\000\000\000\002\000\000\000\000\000\016\000\000\000\000\000\000H\161\128\000\000\000\000\000\004\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$P\192\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\138\024\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\145C\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\018(`\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\015.D\128@1\138\227\187\194\000\222\160\192\004k\016('\255_\193\005\200\144\008\0061\\wx@\027\212\024\000\141b\005\004\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\127\004\023\"@ \024\197q\221\225\000oPa\0025\136\021\152\000\000\000\000\000\000\000\128@\000\000\000\000\000\000\000\"\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128@ \000\000\000\000\000\000\000\017\000\000\000\024\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255_\193\005\200\144\t\006\161\\wx@\027\212\024D\141b\005f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000 \025\133\001\157\160\000b@ T\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\191\131\203\145 \016\012b\184\238\240\1287\1680\001\026\196\n\t\255\215\240Ar$\002\001\140W\029\222\016\006\245\006\000#X\129A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\007\255_\193\005\200\144\008\0061\\wx@\027\212\024@\141b\005f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\127\007\151\"@ \024\197q\221\225\000oP`\0025\136\020\019\255\175\224\130\228H\004\003\024\174;\188 \013\234\012\000F\177\002\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=\251\255\000 \004\000\000 \000\128\000\000\000\000\132\000\000\000\000\000\000\018(`\000\000\000\000\002\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\192\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\004\000\128\000\004\000\017\128\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\003\214\171\192\002\000@\000\002\000\008\192\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000=j\188\000 \004\000\000 \000\140\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\127\245\252\016\\\137\000\144j\021\199w\132\001\189A\128H\214 \208@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\145C\000\000\000\000\000\016\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\002\001\000\128\000\000\000\000\000\000\000D\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\127\004\023\"@$\026\133q\221\225\000oPa\0185\136\021\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\0020\000\000\001\000\004\000\000\000\006 \000\000\000\000\004\002\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\2243\180\000\004H\004\002\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\018\001\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\247\254\016\\\137\000\144z\029\199w\132\001\189I\132H\214 V`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\255\132\023\"@$\030\133q\221\225\000oRa\0185\136\021\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\247\254\016\\\137\000\128c\021\199w\132\001\189I\132\008\214 V`\000\000\000\000\000\000\002\001\000\000\000\000\000\000\000\000\136\000\000\000\197\255\223\248Ar$\002\001\140W\029\222\016\006\245&\016#X\129Y\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\127\225\005\200\144\t\006\161\\wx@\027\212\152D\141b\005f\255\239\252 \185\018\001\000\198+\142\239\008\003z\147\008\017\172@\172\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128@\000\000\000\000\000\000\000\"\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\255\194\011\145 \018\013B\184\238\240\1287\1690\137\026\196\n\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\251\255\008.D\128H5\n\227\187\194\000\222\164\194$k\016+0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\239\252 \185\018\001 \212+\142\239\008\003z\147\008\145\172@\172\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\239\252 \185\018\001 \212+\142\239\008\003z\147\008\145\172@\172\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128@\000\000\000\000\000\000\000\"\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\255\194\011\145 \018\013B\184\238\240\1287\1690\137\026\196\n\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\024\000\000\000\128\002\000\000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\128\000\000\000\000\000\000\000\000H\156\000\192\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000@\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016 \000\000\000\000\000\000\004\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000@\128\000\000\000\000\000\000\016\000\000\000 \000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\008\001\000\000\000\000\000\002\000\000\008\016\000\000\000\000\000\000\002\000\000\000\004\000\000\000\000\008\000\016\000\016\000\000\000\000\000\000\000\017\128\016\000 \020\000\000\000\000\000\008\000\000 @\000\000\000\000\000\000\008\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\001\000\001\000\000\000\000\000\000\000\001\024\001\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\128\000\000\000\000\000\000\000\000\000\156\000\192\000\000\128\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000@\000\000\000\000\000\000\000\000\000F\000`\000\000@\000\000\000\004\000\008\000\000\000\000\000\000\000\000\000\008\192\008\000\000\008\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000#\000 \004\000 \000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\0020\002\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\001\024\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\016\000\000\000\000\000\000\000\000\000\019\128\024\000\000\016\000\000\000\001\000\002\000\000\000\000\000\000\000\000\000\0020\003\000\000\002\000\000\000\000 \000@\000\000\000\000\000\000\000\000\000F\000@\000\000@\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\008\192\008\000\000\008\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\001\024\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\016\000\000\000\000\000\000\000\000\000\017\128\024\000\000\016\000\000\000\001\000\002\000\000\000\000\000\000\000\000\000\0020\002\000\000\002\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000F\000@\000\000@\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\008\192\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")
+    (173, "\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\000\000\000\000\000\000\000\000\245\170\240\000\128\016\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\1280\128\000\016\204\008\192 \008\002\000\004\000\000L\134 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\244p\001\000a\000\001!\152\017\128@\016\004 \008\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002u\012\000@\024@\000Hf\004`\016\004\001\008\002\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000_\163\128\008\003\008\000\t\012\192\140\002\000\128!\000@\000\004\200b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\168`\002\000\194\000\002C0#\000\128 \008@\016\000\0012\024\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000N\161\128\008\003\008\000\t\012\192\140\002\000\128!\000@\000\004\200b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\000\016\002\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\000\002U\012\000@\024@\000Lf\004`\016\004\001\008\002\000\000&C\023\173W\128\004\000\128\000\004\016\016\000\000\000\000\008\000\001\000\000\000\000\000\000\000\000\000\000\000\000\016\008\000\000\000\000\000\000\000\000\000\000\000\000\004\138\024\000\000\000\128\000\128H\008\192 \000\002\016\004\000\000L\006 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\000\144\002\000\000\016@@\000\000\000\000 \000\000\000\000\008\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\004\000\128\000\004\016\016\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000@\000\000\000\000\000\001\235U\224\001\000 \000\001\004\004\000\000\000\000\002\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\000\016\002\000\000\016@@\000\000\000\000 \000\004\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\016\000\002\000\000\000\000\000\000\000\000 \000\008\128\000\000\000\000\000R\000\002A\160P\025\218\000\002\018\001\000@\004!\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128\000\002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000B@ \000\000\132\002\008\000\000\000\000R\000\002A\160P\025\218\000\002\018\001\000@\004 \016@\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\002\000!\000\130z\213x\000T\136\000\144h\021\006v\128\000\132\128@\016\001\008\004\019\214\171\192\002\164@\004\131@\1683\180\000\004$\002\000\128\008@ \128\000\000\000\005 \000$\026\005\001\157\160\000! \016\000\000B\001\004\245\170\240\000\169\016\001 \208*\012\237\000\001\t\000\128 \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\002\000!\000\130\000\000\000\000\020\128\000\144h\020\006v\128\000\132\128@\016\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128 \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000B@ \008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\002\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\136\1936Y,\000\000P\004\008\000\003\186\002'\135p\000\000\000\000\000\000\000\000\000\000\002\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235U\224\001R \002A\160T\025\250\000\002\018\001\000@\004$\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000@ \131\000\150\000\000(\000\000\000\001\217\000\019C\184\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000H\000\017\008&\194%\128\000\n\000\128\000\000v@\004\240\238\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128 \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\017\008&\194%\128\000\n\000\128\000\000f@\004\240n\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128 \002\016\008 \000\000\018\000\004B\t\176\137`\000\002\128 \000\000\025\144\001<\027\128\000\000\000\n@\000H4\n\003;@\000B@ \008\000\132\002\008\000\000\004\128\001\016\130l\"X\000\000\160\008\000\000\006d\000O\006\224\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\002\000!\000\130\000\000\001 \000D \155\008\150\000\000(\002\000\000\001\153\000\019\193\184\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128 \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000H4\n\003;@\000B@ \008\000\132\002\008\000\000\004\128\001\016\130l\"X\000\000\160\008\000\000\006d\000O\006\224\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\002\000!\000\130\000\000\001 \000D \155\008\150\000\000(\002\000\000\001\153\000\019\193\184\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000H\000\017\008&\194%\128\000\n\000\128\000\000f@\004\240n\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128 \002\016\008 \000\000\018\000\004B\t\176\137`\000\002\128 \000\000\025\144\001<\027\128\000\000\000\n@\000H4\n\003;@\000B@ \008\000\132\002\008\000\000\004\128\001\016\130l\"X\000\000\160\008\000\000\006d\000O\006\224\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\003\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\002\000!\000\130\000\000\001 \000D \155\008\150\000\000(\002\000\000\001\153\000\019\193\184\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000H\000\017\008&\194%\128\000\n\000\128\000\000f@\004\240n\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128 \002\016\008 \000\000\018\000\004B\t\176\137`\000\002\128 \000\000\025\144\001<\027\128\000\000\000\n@\000H4\n\003;@\000B@ \008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\132\128@\016\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000@\024\000\000\008d\000\000\000\004\001\000\002\000\000&@\016\018\168`\002\000\194\000\002C0#\000\128 \008@\016\000\0012\024\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\173V\128\004\000\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\004\001\132\000\000\134@F\001\000@\016\000 \000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\030\181^\000\021\"\000$\026\005A\159\160\000! \016\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008H\004\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\001H\000\t\006\129@gh\000\008H\004\000\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128\000\002\016\008 \000\000\000\001H\000\t\006\129@gh\000\008H\004\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002A\160P\025\218\000\002\018\001\000\000\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\132\128@\000\001\008\004\016\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\000\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\004D\008\178I@\000\002\000 @\000\013P\017\012#\128\000\000\000\000\000\000\000\000\000\000\016\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015Z\175\000\n\145\000\018\013\002\160\207\208\000\016\144\008\002\000! \130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\005\001\157\160\000! \016\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000D\000\139\000\148\000\000 \002\000\000\000\209\000\016\1948\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128 \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\016\000\000\128\000\000\000\000\016\164\000\004\131@\1603\180\000\004$\002\000\000\008@ \128\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128 \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\000\000!\000\130\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\001\016\002,\002P\000\000\128\008\000\000\002D\000C\000\224\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\000\000!\000\130\000\000\001 \000D\000\139\000\148\000\000 \002\000\000\000\145\000\016\1928\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\000\008@ \128\000\000H\000\017\000\"\192%\000\000\008\000\128\000\000$@\0040\014\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128\000\002\016\008 \000\000\018\000\004@\008\176\t@\000\002\000 \000\000\t\016\001\012\003\128\000\000\000\n@\000H4\n\003;@\000B@ \000\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\000\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\000\008@ \128\000\000H\000\017\000\"\192%\000\000\008\000\128\000\000$@\0040\014\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128\000\002\016\008 \000\000\018\000\004@\008\176\t@\000\002\000 \000\000\t\016\001\012\003\128\000\000\000\n@\000H4\n\003;@\000B@ \000\000\132\002\008\000\000\004\128\001\016\002,\002P\000\000\128\008\000\000\002D\000C\000\224\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\000\000!\000\130\000\000\001 \000D\000\139\000\148\000\000 \002\000\000\000\145\000\016\1928\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\000\008@ \128\000\000H\000\017\000\"\192%\000\000\008\000\128\000\000$@\0040\014\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\1280\002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\n@\000H4\n\003;@\000B@ \000\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\000\000!\000\130\000\000\001 \000D\000\139\000\148\000\000 \002\000\000\000\145\000\016\1928\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\000\008@ \128\000\000H\000\017\000\"\192%\000\000\008\000\128\000\000$@\0040\014\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128\000\002\016\008 \000\000\018\000\004@\008\176\t@\000\002\000 \000\000\t\016\001\012\003\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\005 \000$\026\005\001\157\160\000! \016\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000@\000z\213x\000@\008\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000R\000\002A\160P\025\218\000\002\018\001\000@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\000\021\"\000$\026\005A\157\160\000! \016\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\213x\000T\136\000\144h\021\006v\128\000\132\128@\016\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\000\000\000\000\000\000\008\000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002E\012\000\000\000@\000@$\004`\016\000\001\008\002\000\000&\003\016\018(`\000\000\002\000\002\000 #\000\128\000\008@\016\000\0010\024\128\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\000\016\002\000\000\016\000F\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000@ \000\000\000\000\000\000\000\000\000\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\000\015Z\175\000\008\001\000\000\008\000#\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000@\000\000\000\000\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\015Z\175\000\008\001\000\000\008\000#\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\003\214\171\192\002\000@\000\002\000\008\192\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\008\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\245\170\240\000\128\016\000\000\128\0020\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\004\000\128\000\004\016\016\000\000\000\000\008\000\000\000\000\002\000=j\188\000 \004\000\000 \128\128\000\000\000\000@\000\008\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\181Z\000\016\002\000\000\000\000@\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000%P\192\004\001\132\000\004\198`F\001\000@\016\128 \000\002d1z\213x\000@\008\000\000A\001\000\000\000\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000@\000\000\000\000\000\000\001z\213x\000@\008\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\000\016\002\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\245\252\016\\\137\000\128c\021\199w\132\001\158\160\192\0025\136\020\016\t\0200\000\000\000\000\001\000\128\017\128\000\000\004 \000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\245\170\240\000\128\016\000\000\128\0020\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015Z\175\000\008\001\000\000\008\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\002\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\168\016\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\004\000\128\000\004\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\235U\160\001\000 \000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\132\128@\016\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\004\007 @ \024\133\017\221\161\000g\1680\000\140b\005\004\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008H\004\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\003\255\175\224\130\228H\004\131P\174;\188 \012\245\006\000\145\236a\160\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001\000\192(\012\237\000\003\t\000\128\000\002\016\008 \000\000\000\001H\000\008\006\001@gh\000\024H\004\000\000\016\128A=j\188\000*D\000H4\n\131;@\000B@ \008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\164\000\004\003\000\1603\180\000\012$\002\000\000\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\003\000\1603\180\000\012$\002\000\000\008@ \128\000\000\000\005 \000$\026\005\001\157\160\000! \016\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\008\006\001@gh\000\024H\004\000\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002\001\128P\025\218\000\006\018\001\000\000\004 \016@\000\000\000\002\144\000\016\012\002\128\206\208\0000\144\008\000\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\017\024&\203%\128\000\n\000\129\000\000u@@\160\238\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=j\188\000*D\000H4\n\131?@\000B@ \008\000\132\130\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\132\128@\016\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128\001\016\130l\"X\000\000\160\008\000\000\007D\000\n\014\224\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\002\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\136A6\017,\000\000P\004\000\000\003\"\000\005\003p\000\000\000\001H\000\008\006\001@gh\000\024H\004\000\000\016\128A\000\000\000\144\000\"\016M\132K\000\000\020\001\000\000\000\200\128\001@\220\000\000\000\000R\000\002\001\128P\025\218\000\006\018\001\000\000\004 \016@\000\000$\000\008\132\019a\018\192\000\005\000@\000\0002 \000P7\000\000\000\000\020\128\000\128`\020\006v\128\001\132\128@\000\001\008\004\016\000\000\t\000\002!\004\216D\176\000\001@\016\000\000\012\136\000\020\013\192\000\000\000\005 \000 \024\005\001\157\160\000a \016\000\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\008\006\001@gh\000\024H\004\000\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002\001\128P\025\218\000\006\018\001\000\000\004 \016@\000\000$\000\008\132\019a\018\192\000\005\000@\000\0002 \000P7\000\000\000\000\020\128\000\128`\020\006v\128\001\132\128@\000\001\008\004\016\000\000\t\000\002!\004\216D\176\000\001@\016\000\000\012\136\000\020\013\192\000\000\000\005 \000 \024\005\001\157\160\000a \016\000\000B\001\004\000\000\002@\000\136A6\017,\000\000P\004\000\000\003\"\000\005\003p\000\000\000\001H\000\008\006\001@gh\000\024H\004\000\000\016\128A\000\000\000\144\000\"\016M\132K\000\000\020\001\000\000\000\200\128\001@\220\000\000\000\000R\000\002\001\128P\025\218\000\006\018\001\000\000\004 \016@\000\000$\000\008\132\019a\018\192\000\005\000@\000\0002 \000P7\000\000\000\000\020\128\000\144h\020\006v\128\000\132\128@\024\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\005 \000 \024\005\001\157\160\000a \016\000\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\008\006\001@gh\000\024H\004\000\000\016\128A\000\000\000\144\000\"\016M\132K\000\000\020\001\000\000\000\200\128\001@\220\000\000\000\000R\000\002\001\128P\025\218\000\006\018\001\000\000\004 \016@\000\000$\000\008\132\019a\018\192\000\005\000@\000\0002 \000P7\000\000\000\000\020\128\000\128`\020\006v\128\001\132\128@\000\001\008\004\016\000\000\t\000\002!\004\216D\176\000\001@\016\000\000\012\136\000\020\013\222\181^\000\021\"\000$\026\005A\157\160\000! \016\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\130A\160P\025\218\000\002\018\001\000@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\127\007\151\"@ \024\197q\221\225\000g\1680\000\141b\005\004\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008H\004\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\132\128@\016\001\008\004\016\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\001\000\000\000\000\000\000\002\008\128\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\008.D\128@1\n\227\187\194\000\207P`\001\026\196\n\t\255\215\240Ar$\002A\168_\029\222\016\006z\131\000H\214(PO\254\191\131\203\145 \016\012b\184\238\240\1283\212\024\000F\177\002\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\191\240\242\228H\004\003\024\190;\188`\012\245&\008\017\236q\172\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\235\248 \185\018\001\000\198+\142\239\008\003=A\128\004k\016('\255_\193\005\200\144\t\006\161|wx@\025\234\012\001#X\161A?\250\254\008.D\128H5\n\227\187\194\000\207P`\t\026\196\026\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\002#\004\217d\176\000\001@\016 \000\014\232\008\148\029\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\002\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\128\228\008\004\003\016\162;\180 \012\245\006\000\017\140@\160\128\000\000\004\007 @ \024\133\017\221\161\000g\1680\000\140b\005\004\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\004\018\013\002\128\206\208\000\016\144\008\002\000!\000\130\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\001\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128 \002\018\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\008\014@\128@1\n#\187B\000\207P`\001\024\196\n\008\000\000\000@r\004\002\001\136Q\029\218\016\006z\131\000\008\198 P@\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\004\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002A\160P\025\218\000\002\018\001\000@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\016\024 \201%\128\000\008\000\001\000\0003@D\128\140\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\005H\128\t\006\129Pg\232\000\008H\004\001\000\016\144A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000@r\004\002\001\136Q\029\218\016\006z\131\000\008\198 P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\008.D\128H5\n\227\187\194\000\207P`\t\026\196\n\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\255\195\203\145 \016\012b\248\238\241\1283\212\152 G\177\198\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\004\000\128\000\004\000\016\000\000\000\000\008\000\000\000\000\000\000\000\145C\000\000\000\000\000\016\008\001\024\000\000\000B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\015Z\175\000\008\001\000\000\008\000#\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000 \000\008\000\000\000\000\000\000R\000\002A\168P\027\218\000\002\018\001\000@\004 \016@\000\000\000\002\144\000\016\012\194\128\206\208\0000\144\008\n\128!\004\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\003\000\1603\180\000\012$\002\000\000\008@ \128\000\000\000\005 \000$\026\005\001\157\160\000! \016\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=j\188\000*D\000H4\n\131;@\000B@ \008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\128`\020\006v\128\001\132\128@\000\001\008\004\016\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001\000\192(\012\237\000\003\t\000\128\000\002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000@0\n\003;@\000\194@ \000\000\132\002\008\000\000\000\000R\000\002\001\128P\025\218\000\006\018\001\000\000\004 \016OZ\175\000\n\145\000\018\013\002\160\206\208\000\016\144\008\002\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\164\000\004\003\000\1603\180\000\012$\002\000\000\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\004\0082I@\000\002\000\000@\000\008P\017\000\003\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015Z\175\000\n\145\000\018\013\002\160\207\208\000\016\144\008\002\000! \130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\005\001\157\160\000! \016\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131@\1603\180\000\004$\002\000\128\008@ \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\000\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128 \002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\016\012\194\128\206\208\0000\144\008\n\128!\004\130\000\000\000\002\020\128\000\128f\020\006v\128\001\132\128@T\001\008$\016\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\133\001\189\160\000! \016\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000)\000\001\000\204(\012\237\000\003\t\000\128\136\002\016\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000R\000\002\001\152P\025\218\000\006\018\001\001\016\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\128\001\006\001(\000\000@\000\000\000\001\002\000 \000`\000\000\000\001H\000\008\006\001@gh\000\024H\004\000\000\016\128A\000\000\000\128\000 \000A\128J\000\000\016\000\000\000\000@\128\008\000\024\000\000\000\000R\000\002\001\128P\025\218\000\006\018\001\000\000\004 \016@\000\000 \000\008\000\016`\018\128\000\004\000\000\000\000\016 \002\000\006\000\000\000\000\020\128\000\128`\020\006v\128\001\132\128@\000\001\008\004\016\000\000\008\000\002\000\004\024\004\160\000\001\000\000\000\000\004\008\000\128\001\128\000\000\000\005 \000 \024\005\001\157\160\000a \016\000\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\008\006\001@gh\000\024H\004\000\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002\001\128P\025\218\000\006\018\001\000\000\004 \016@\000\000 \000\008\000\016`\018\128\000\004\000\000\000\000\016 \002\000\006\000\000\000\000\020\128\000\128`\020\006v\128\001\132\128@\000\001\008\004\016\000\000\008\000\002\000\004\024\004\160\000\001\000\000\000\000\004\008\000\128\001\128\000\000\000\005 \000 \024\005\001\157\160\000a \016\000\000B\001\004\000\000\002\000\000\128\001\006\001(\000\000@\000\000\000\001\002\000 \000`\000\000\000\001H\000\008\006\001@gh\000\024H\004\000\000\016\128A\000\000\000\128\000 \000A\128J\000\000\016\000\000\000\000@\128\008\000\024\000\000\000\000R\000\002\001\128P\025\218\000\006\018\001\000\000\004 \016@\000\000 \000\008\000\016`\018\128\000\004\000\000\000\000\016 \002\000\006\000\000\000\000\020\128\000\128`\020\006v\128\001\132\128@\000\001\008\004\016\000\000\008\000\002\000\004\024\004\160\000\001\000\000\000\000\004\008\000\128\001\128\000\000\000\005 \000 \024\005\001\157\160\000a \016\000\000B\001\004\000\000\002\000\000\128\001\006\001(\000\000@\000\000\000\001\002\000 \000`\000\000\000\001H\000\008\006\001@gh\000\024H\004\000\000\016\128A\000\000\000\128\000 \000A\128J\000\000\016\000\000\000\000@\128\008\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\005 \000 \025\133\001\157\160\000a \016\021\000B\t\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\008\006a@gh\000\024H\004\005@\016\130A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000R\000\002\001\152P\025\218\000\006\018\001\001P\004 \144@\000\000\000\002\144\000\016\012\194\128\206\208\0000\144\008\008\128!\004\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\164\000\004\0030\1603\180\000\012$\002\002\160\008A \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000=j\188\000 \004\000\000 \000\140\000\000\000\000\000\000\008\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131P\1607\180\000\004$\002\000\128\008@ \128\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\016\000\018\000\000\000\000\000\000\000\000 \000\008\000\000\000\000\000\000\000\000\128\000\144\000\000\000\000\000\000\000\001\000\000@\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000z\213x\000@\008\000\000@\001\024\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\004\000\001\000\000\000\000\000\000\n@\000H5\n\003{@\000B@ \008\000\132\002\008\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\181Z\000\016\002\000\000\000\000@\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\004\000\001\000\000\000\000\000\000\n@\000H5\n\003{@\000B@ \008\000\132\002\008\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\127\004\023\"@ \024\197q\221\227\000g\1680\000\141b\005\004\000\000\000\000\000\000\000 \016\000\000\000\016\000\000\000\002 \000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\008.D\128@1\138\227\187\198\000\207P`\129\026\196\n\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000D`\155,\150\000 (\002\004\128\001\221\001\002\131\184\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\002\000\000\128\000\000\000\000\000\005 \000$\026\133\001\189\160\000! \016\004\000B\001\004\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000=j\188\000 \004\000\000 \000\140\000\000\000\000\000\000\008\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\164\000\004\131P\1607\180\000\004$\002\000\128\008@ \128\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\001\000\128\000\000\000\128\000\000\000\017\000\000\000\024\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\191\130\011\145 \018\013B\184\238\241\1283\212\024\"F\177\002\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\175\224\130\228H\004\003\024\174;\188`\012\245\006\008\017\172@\172\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\005H\128\t\006\129Pg\232\000\008H\004\001\000\016\144A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\0020\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\245\170\240\000\128\016\000\000\128\0020\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\008\000\002\000\000\000\000\000\000\020\128\000\144j\020\006\246\128\000\132\128@\016\001\008\004\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\029j\180\000 \004\000\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\008\000\002\000\000\000\000\000\000\020\128\000\144j\020\006\246\128\000\132\128@\016\001\008\004\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\191\130\011\145 \018\013B\184\238\241\1283\212\024\"F\177\002\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\004\002\000\000\000\002\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255_\193\005\200\144\t\006\161\\wx\192\025\234\012\001#X\129A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\008\192 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\007 @ \024\133\017\221\161\000g\1680\000\140b\005\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\016\000\000\000\000\000\000\000\000\000\016\000\031\253\255\132\023#@&\026\133\241\221\227\000\231\1690L\143c\173f\000\000\000 9\002\001\000\196(\142\237\008\003=A\128\004c\016( \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\008.D\128@1\139\227\187\194\000\207P`\001\030\199\026\008\000\000\000\000\000\000\000@ \000\000\000\000\000\000\000\000@\000\000\000\015\254\191\130\011\145 \016\012b\248\238\240\1283\212\024\000G\177\198\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\235\248 \185\018\001 \212/\142\239\008\003=A\128${\028h \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\008.D\128H5\011\227\187\194\000\207P`\t\030\199\026\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\008\000\015\254\191\130\011\145 \016\012b\248\238\240\1283\212\024\000F\177B\130\000\000\000\000\000\000\000\016\008\002\000\000\000\000\000\000\000\016\000\002\000\003\255\175\224\130\228H\004\003\024\190;\188 \012\245\006\000\017\172P\160\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\008\004\001\000\000\000\000\000\000\000\008\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\191\130\011\145 \018\013B\248\238\240\1283\212\024\002F\177B\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000 #\000\000\000\008\000\000\000\000 \000\000\000\000\000\000\002\000\012\004\000\000\000\000\001\000\000\000\008\000\000@\005\255\215\240Ar$\002\001\140W\029\222\016\006z\131\000\008\214 P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \024\008\000\000\000\000\002\000\000\000\016\000\000\128\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\127\004\023#@&\026\133q\221\225\000\231\1680\004\141b%\006\255\235\248 \185\018\001\000\198+\142\239\008\003=A\128\004k\016( \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\215\240Ar4\002a\168W\029\222\016\014z\131\000H\214\"P`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\008\000\015\254\191\130\011\145 \018\013B\248\238\240\1283\212\024\002F\177B\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128@ \000\000\000 \000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\245\252\016\\\137\000\144j\021\199w\140\001\158\160\192\0185\136\020\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\191_\192\005H\144\008\006\001Pgx\000\024H\004\000\000X\129A\000\000\000\000\n@\016H4\n\003;@\000B@ \008\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\223\175\224\002\164H\004\003\000\1683\188\000\012$\002\000\000,@\160\128\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235U\224\001\000 \000\001\000\004\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\133\001\189\160\000! \016\004\000B\001\004\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\000\016\002\000\000\016\000F\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002A\168P\027\218\000\002\018\001\000@\004 \016@\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\128\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\161@oh\000\008H\004\001\000\016\128A\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007Z\173\000\008\001\000\000\000\000 \000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \212(\013\237\000\001\t\000\128 \002\016\008 \000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\008\000\015~\191\128\n\145 \016\012\002\160\206\240\0000\144\008\000\000\177\002\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\002\003\004\025$\176\001\001\000\000$\000\006(\008\016\017\128\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\161@oh\000\008H\004\001\000\016\128A\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\001\235U\224\001\000 \000\001\000\004`\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\133\001\189\160\000! \016\004\000B\001\004\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000z\213x\000T\136\000\144h\021\006~\128\000\132\128@\016\001\t\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000#\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144j\020\006\246\128\000\132\128@\016\001\008\004\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\170\208\000\128\016\000\000\000\002\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013B\128\222\208\000\016\144\008\002\000!\000\130\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000@\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000 \000\000\002\0020\000\000\000\128\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\002\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\001\004\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\127\004\023\"@ \024\197q\221\225\000g\1680\000\141b\005\004\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002A\160P\025\218\000\002\018\001\000@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\127\245\252\016\\\137\000\144j\021\199w\132\001\158\160\192\018=\1404\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000@\000\000\000\000\000\000\001\127\245\252\016\\\137\000\128c\021\199w\132\001\158\160\192\0025\136\020\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\127\004\023\"@ \024\197q\221\225\000g\1680\000\141b\005\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\128\000\144h\020\006v\128\000\132\128@\000\001\008\004\016\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000\000\000\000\000\000@\000\000\000\005 \000$\026\005\001\157\160\000! \016\000\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008H\004\000\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\007 @ \024\133\017\221\161\000g\1680\000\140b\005\004\000\000\000\000\000\008\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\016\000\000\001\001\200\016\008\006!Dwh@\025\234\012\000#\024\129A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@r\004\002\001\136Q\029\218\016\006z\131\000\008\198 P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008H\004\000\000\016\128A\000\000\000\000\000\002\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\245\252\000@\008\000\000@\001\000\001\000\000\000\128\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\002\255\235\248\000\128\016\000\000\128\002\000\002\000\000\001\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\000 \004\000\000 \000\128\000\128\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000)\000\001 \208(\012\237\000\001\t\000\128\000\002\016\008 \000\000\000\000\000@\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\213x@\225\008\137 B\001\000\000\018\000!J\t\000\002`\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\128\000\002\000\128\000\000\002\000\000\000\000\000\008\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\008\000\000\000 \000\000\128 \000\000\000\128\000\000\000\000\002\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000@\000\016\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\0008B\"\008\016\128@\000\004\128\008R\002@\000\152\000\000\245\170\240\001\194\016\000@\132\002\000\000$\000B\144\018\000\004\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\002\000\000\016\000\000\000\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\004\001\000\000\000\004\000\000\000\000\000\016\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\128\000\000\002\000\000\008\002\000\000\000\008\000\000\000\000\000 \000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\004\000\000\000\000\000\000\001\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016 \000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\181^\0008B \008\016\128@\000\004\128\008R\002@\000\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\173W\128\014\016\128\002\004 \016\000\001 \002\020\128\144\000\"\000\000\000\004\000\000\016\004\000\000\000\016\000\000\000\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\002\000\000\000\008\000\000 \008\000\000\000 \000\000\000\000\000\128\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\128\000\000\002\000\000\000\000\000\008\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\004\001\000\000\000\004\000\000\000\000\000\016\000 \000\000\000\000\000\008\000\000 \008\000\000\000 \000\000@\000\000\128\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\000\000\000\016\000\000\000\000\000@\000\128\000\000\000\000\000 \000\000\128 \000\000\016\128\000\001\000\000\002\000\004\000\000@\000\000\001\000\000\004\001\000\000\000\004\000\000\000\000\000\016\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000@\000\001\000@\000\000\001\000\000\000\000\000\004\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\213x\000@\008\000\000@\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\008\000\245\170\240\000\128\016\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000 \000\000\128 \000\000\016\192\000\000\000\000\002\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000@\000\001\000@\000\000\001\000\000\000\000\000\004\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000 \000\000\000\128\000\002\000\128\000\000\002\000\000\000\000\000\008\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000C\000\000\004\008 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\128\000\000\002\000\000\000\000\000\008\000\016\000\000\000\000\000\004\000\000\016\004\000\000\000P\000\000 \000\000@\000\128\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\008\002\000\000\000\008\000\000\000\000\000 \000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\000\000\000\016\000\000\000\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000 \008\000\000\000 \000\000\000\000\000\128\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000@\016\000\000\000`\000\000\000\000\001\000\002\000\000\000\000\000\000\128\000\002\000\128\000\000J\000\000\004\000\000\008\000\016\000\001\000\000\000\004\000\000\016\004\000\000\000\016\000\000\000\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\001\000\000\004\001\000\000\000\004\000\000\000\000\000\016\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\008\000\000\000 \000\000\128 \000\000\000\128\000\000\000\000\002\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000  \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\128 \000\000\000\128\000\000\000\000\002\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\016\000\000\000@\000\001\000@\000\000\001\000\000\000\000\000\004\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\128\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\004\001\000\000\000\004\000\000\000\000\000\016\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\008\002\000\000\000\008\000\000\000\000\000 \000@\000\000\000\000\000\016\000\000@\016\000\000\001@\000\000\128\000\001\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\221x\000`\008\000\000B!\000\000\000\000\000\128\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000@\016\000\000\001`\000\000\128\000\001\000\002\000\000 \000\000\000\128\000\002\000\128\000\000\002\000\000\000\000\000\008\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\245\186\240\000\192\016\000\000\132b\000\000\000\000\001\000\002\000\000\000\000\000\000\128\000\002\000\128\000\000\002\000\000\000\000\000\008\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\004\001\000\000\000\004\000\000\000\000\000\016\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\128\000\000B\000\000\000\000\000\008\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000 \000\000\128 \000\000\000\128\000\000\000\000\002\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015Z\175\008\028!\017$\008@ \000\002@\004)A \000L\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\007\001\157\160\000! \016\004\000B\001\004\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005 \000$\026\005\001\157\160\000! \016\004\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\003\016\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\000\018\013\002\128\206\208\000\016\144\008\000\000!\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\005 \000$\026\005\001\157\160\000! \016\000\000B\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\255\132\023\"@$\030\135q\221\225\000g\1690D\141b\005f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\247\254\016\\\137\000\144z\021\199w\132\001\158\164\193\0185\136\021\153\223\191p\002\000@\000\000\000\008\000\000\000\000\000 \000\000\000\000\000\000H\161\128\000\000\000\000\000\004\000\000\000\000\000\001\000\000\000\000\000\000w\239\220\000\128\016\000\000\000\002\000\000\000\000\000\008\000\000\000\000\000\003\191~\224\004\000\128\000\000\000\016\000\000\000\000\000@\000\000\000\000\000\000\145C\000\000\000\000\000\000\008\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\"\134\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\t\0200\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000H\161\128\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\002E\012\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\127\007\151\"@ \024\197q\221\225\000g\1680\000\141b\005\004\255\235\248 \185\018\001\000\198+\142\239\008\003=A\128\004k\016( \000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\008.D\128@1\138\227\187\194\000\207P`\129\026\196\n\204\000\000\000\000\000\000\000@ \000\000\000\000\000\000\000\004@\000\000\006 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128@\000\000\000\000\000\000\000\008\128\000\000\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\235\248 \185\018\001 \212+\142\239\008\003=A\130$k\016+0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n@\000@3\n\003;@\000\194@ *\000\132\002\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\245\252\030\\\137\000\128c\021\199w\132\001\158\160\192\0025\136\020\019\255\175\224\130\228H\004\003\024\174;\188 \012\245\006\000\017\172@\160\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\255\235\248 \185\018\001\000\198+\142\239\008\003=A\130\004k\016+0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\015.D\128@1\138\227\187\194\000\207P`\001\026\196\n\t\255\215\240Ar$\002\001\140W\029\222\016\006z\131\000\008\214 P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\253\255\128\016\002\000\000\016\000@\000\000\000\000!\000\000\000\000\000\000\002E\012\000\000\000\000\000@\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\128\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\245\170\240\000\128\016\000\000\128\0020\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\128\001\235U\224\001\000 \000\001\000\004`\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\030\181^\000\016\002\000\000\016\000F\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\015\254\191\130\011\145 \018\013B\184\238\240\1283\212\024\002F\177\006\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\161\128\000\000\000\000\008\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000@ \016\000\000\000\000\000\000\000\002 \000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\250\254\008.D\128H5\n\227\187\194\000\207P`\137\026\196\n\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000F\000\000\000\016\000 \000\000\0001\000\000\000\000\000 \016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\002A\160p\025\218\000\002\018\001\000@\004 \016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\000\t\006\129@gh\000\008H\004\001\000\016\128A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\255\194\011\145 \018\015C\184\238\240\1283\212\152\"F\177\002\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\251\255\008.D\128H=\n\227\187\194\000\207R`\137\026\196\n\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\254\255\194\011\145 \016\012b\184\238\240\1283\212\152 F\177\002\179\000\000\000\000\000\000\000\016\008\000\000\000\000\000\000\000\001\016\000\000\001\139\255\191\240\130\228H\004\003\024\174;\188 \012\245&\008\017\172@\172\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\239\252 \185\018\001 \212+\142\239\008\003=I\130$k\016+7\255\127\225\005\200\144\008\0061\\wx@\025\234L\016#X\129Y\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128@ \000\000\000\000\000\000\000\004@\000\000\006 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\247\254\016\\\137\000\144j\021\199w\132\001\158\164\193\0185\136\021\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\253\255\132\023\"@$\026\133q\221\225\000g\1690D\141b\005f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\127\225\005\200\144\t\006\161\\wx@\025\234L\017#X\129Y\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\127\225\005\200\144\t\006\161\\wx@\025\234L\017#X\129Y\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128@ \000\000\000\000\000\000\000\004@\000\000\006 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\247\254\016\\\137\000\144j\021\199w\132\001\158\164\193\0185\136\021\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\140\000\000\000 \000@\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\t\000\000\000\000\000\000\000\000 H\158\000`\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\128\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\008\016\000\000\000\000\000\000\000\128\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\004\000\000\000\000\000\000\000 \000\000\000@\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\016\002\000\000\000\000\000\004\000\000\016 \000\000\000\000\000\000\001\000\000\000\002\000\000\000\000\004\000\008\000\008\000\000\000\000\000\000\000\0040\002\000\004\002\128\000\000\000\000\001\000\000\004\008\000\000\000\000\000\000\000@\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\128\000\128\000\000\000\000\000\000\000C\000 \000\000(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\016\000\000\000\000\000\000\000\000\000\008\224\006\000\000\004\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000 \000\000\000\000\000\000\000\000\000\016\192\012\000\000\008\000\000\000\000\128\001\000\000\000\000\000\000\000\000\000\000\134\000@\000\000@\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000!\128\016\002\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\002\024\001\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\0040\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\008\000\000\000\000\000\000\000\000\000\004p\003\000\000\002\000\000\000\000 \000@\000\000\000\000\000\000\000\000\000!\128\024\000\000\016\000\000\000\001\000\002\000\000\000\000\000\000\000\000\000\001\012\000\128\000\000\128\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\008`\004\000\000\004\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000C\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\008\000\000\000\000\000\000\000\000\000\0040\003\000\000\002\000\000\000\000 \000@\000\000\000\000\000\000\000\000\000!\128\016\000\000\016\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\001\012\000\128\000\000\128\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\008`\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")
   
   let action =
-    ((16, "\000\212\000\031\000\000\000\000\000\235\000\000\000\000\000\000\000\212\000\000\000\228\031D\000\000\000\129F\002\000\000\000\000\026v\000\000\031\210\000\000\000\000\000\000\000\000\000\000\000\000\027b\000\000 d\000\000\000\000\000\000\000\000\000\000!P\000\000\000\000\000\000\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\165\000c\000\000\031D!\158G\168\000+GD\000\000\000\000\000\0000h\000rG\168\000\015G\168\000\000\000\156\000\000G\168\000\000\000k\003\250<J\000\000\000\000>\144\000\000@\182\000\000Ad<J<J\018~\018~@\182\018~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?:<J\000\000\000\000?:\000\000?:\000\000<J\000\000\000\000\000\000\020\246\000k\000\000\018~\000\0004^<J\027\176<J\000\000\000\000\000\000\000\000\000\000\000\000\"d<J#X<J$L<J%@<J\000\000<J\000\000<J&4<J'(<J(\028<J)\016<J*\004<J\000\230<J\000\000\000\000\000\000\000\000\000\000<J*\248<J+\236<J,\224<J\000\000\000\000<J\000\000\000\000\021\144.D\000\000\000\000\000\250\000\000\000\000\000\000\000\000\019F\000\129\000\000.:\000\000\000\160\018~\000\000<J\001\028\000\000\000\000\000k\000\000\000\000\000\000\000\000\000\000\001F\000\000\000\000\001\210\000\000\001\212@\182\000\000\000\000\000\000\000\000\000\000\000\000A\232<J\000\000A\232\000\000A\232@\182\000\000\000\0003\018\000k\000\000\018~\001\228\000\000<J\002D\000\000\000\000\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000FP<J\000\000<J\000\000\000\000\002\136\000\000\000=?\228\003\158<J\003p\000\000\000\000@\182\000=\000\000\000\000\000\000\000\000\000\000G\164@\182HT@\182H\210@\182I$@\182\000\000@\182\000\000@\182I\162@\182J\018@\182Jl@\182J\220@\182KZ<J\003*@\182\000\000@\182K\172@\182L*@\182L\154\003\016\000\000\003V\000\000\001\016<J\000\000\001\016\000\000\000\000\000\234\031D\000\000\000\234\000\000\000\000\003X<J\000\000\003\136\000\000\018~\003\150\000\000\000\000\004r\000\000\018~\003\238\000\000\000\000\004(\000\000\000\000\003\250\000\000\005\030\000\000.DM\030\005\008\005\012\000k\004\134\005BN\012\001\168\000\000\000\000\002$Oh\000\000\000\000\000\000\005^\005`\000k\005\146N\012\002nN\012\000\000\000\000\001\028\000\000\000\000\004\232\000\000\004\234\005\224N\012\005.\000\000\000\000\002$\000\000\005D\006\028\000\000O\150Nv\000\000\000k\0068\000\000\019F\000k\006l\000\000\000\000-\178G\168\005\150\000\000\006\018\000\000\005\156\000\000\000\029\031D\000\000\031D\000\000\005\138\000\000\000\029\000\000\015\238\0086\006\\N\012\005\168\006\130\000\000(\004\000\129\000\000\000|\001\208\031D\005\182\000\000\0009\000\000\000\023\000\000\006\140\000\000\000\000\023~\000\129\000\000\0009\000\000\000\000\000\000\000\000\000\000\006r<J\005\190\019<\006x<J\005\196\006v\000\138\005\240\006\162\000\000B0B\180\018~\005\206\000\000\005\208B\180\000\000\000\000\000\000\000\000\000\000\000\000\000\000C^<J\000\000C^\000\000C^B\180\000\000\000\000\024\204\000k\000\000\018~\005\214\000\000<J\005\214\000\000\000\000\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000/\184<J\000\000<J\000\000\005\222\000\000\001\016\000\000\000\000\000\000\000\000\000\0004\184B\1805\172B\1806DB\1806\220B\180\000\000B\180\000\000B\1807tB\1808\012B\1808\164B\1809<B\1809\212<J\006\008B\180\000\000B\180:lB\180;\004B\180;\156\018~\005\228\000\000\000\000<\244\000\000\006\190\000\000\001R\006\156<J\006n\000\000\006\170<J\006~\000\000\007(\000\000\006\162\006\162\001R\000\000\001R\000\000\015\238\006\162\006\162\000\000\000\000\000\000\023\216\000\000\000\000\000\000\000\000\006\206<J\006 \019<\020\016\000k\007\000\000\000\006\228=\158\007\n=\158\007\018<J\006@\019<\019<\002`\003\180\001p\000\000\000\000\000\000\003\180\000\000\004v\002`\000\000\000\000\006B\000\000\000\000\000\000\007\026\000\000\007 \000\000\000\000\007X\007\018<J\006^\0078\000\000@\134\007\026\018~\006j\019<\000\000\000\000\006\146\000\000\000\148\000\000\005N\000\000\001R\000\000\000\000\006\224\000\000$4\0086\007&N\012\006t\007L\000\000\000k\000\000\002p<J0\142\000\000C\226<J\006z\000\000\018~\006|\000\000\006\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\140<J\000\000D\140\000\000D\140E\016\018~\006\134E\016\000\000\000\000\029H\000k\000\000\018~\006\150\000\000<J\006\150\000\000\000\000\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000<J\001\004<J\006\158\000\000\000\0001</\016\007N<J\000\000\007\024\000\000\000\000\000k\000\000\000\000\006\2200\142\000\000\006\2200\142\000\000\001\250\000\000\000\000\017\172E\016\023^E\016\026\158E\016\029\240E\016\000\000E\016\000\000E\016\030rE\016\031\136E\0163vE\0164\200E\016C\016E\016D>E\016H\"E\016O\240\000\000\006\178\000\000\006\2241\234\000\0002\152\006\2402\1523\190\006\2442\152\000\000\000\000\000\000\000\000\000\000\006\232\000\000\007\198\000\000\000k\000\000\002p\007\204\000\000\007\174\007\158\000k\007\000\007\190N\012\007\018\000\232\000\000<J\007\236\000\000\000\127\003\226\004x\007\212N\012\007 \007\248\000\000\003\028<J\007\250\000\000\008\000\000\000\019F\000k\003$<J\008\006\000\000\008\n\000\000\011\242\001\028\000\000\011\242\000\000\000\000\021\234\003F<J\008\012\000\000\008\014\000\000\000\000\007\248\007\234\000k\007L\008\006N\012\007T\001\252\000\000<J\008.\000\000\001\028\000\000\000\000\007\246\000\000\011\242\000\000\008\022\018~\007b\008:\000\000\000>\000\000\008\"N\012\007t\008T\000\000\003\248<J\008X\000\000\008^\000\000\019F\000k\004\166<J\008d\000\000\008f\000\000\000\000\000\000\007\246\000\000\000\000\001\028\000\000\006\162\000\000\000>\000\000\000\000\001\254\020\016\000\000\001\254\000\000\000\000\007\150\000\000\003\024\000\003\019<\000\000\003\250\000%\003\250\000\000\000\148\000\000\006\162\000\000\006\162\000\000\000\000\000\000\007\144\000\000\000\000\007\154\000\000\003:\005N\000%\003\250\000\000\000\000\000\000\000\148\000\000\006\162\000\000\003:\000\000\000\000\000\234\000\015\015\238\000\000\020\016\000\000\tJ\015\238\000\000\000\000\tJ\000\000\000\000\007\156\000\000\000\000\007\174\000\000\004z\006\162\000\000\004z\000\000\000\000\008&\000\000\001\028\000\000\006\162\000\000\000\000\000\000\0176>H\000\000\008\140\000\000\0176\008\142\000\000\008\148\000\000$4\000k\002*\000\000<J\008\150\000\000\008x\008h\000k\007\200\008\128N\012\007\204\002\180\000\000<J\008\166\000\000\000\127\003\174\000\000<J\008\168\000\000\019F\000k\004:\000\000<J\008\172\000\000\004\174\0176\000\000\021\234\005d\000\000<J\008\174\000\000\000\000\000\000\008\144\008\132\000k\007\236\008\164N\012\007\242\005\198\000\000<J\008\204\000\000\005\026\000\000\008\174\018~\007\250\008\210\000\000\004\018\000\000\005\248\000\000<J\008\218\000\000\019F\000k\005\254\000\000<J\008\224\000\000\004\174\000\000\000\000\008*\000\000\005\026\008\226\008\158\000\000\000\000\000\000\008\174\000\000\000\027\002r\000\000\015\238\t\000\000\000\000\000<J\008f\006\162\000\000\008<\000\000\000\138\000\000\000\000\000\025\015\238\000\000\015\238\000\000\008.\000\000\000\025\000\000@\182\002\154@\182\000\000@\182\000\000\0080\000\000\002\154\000\000\019<\004\220\019<\000\000\019<\000\000\0082\000\000\004\220\000\000@\182\002\154\0086\000\000#@\000k\0058#@\000\000#@\000\000\008H\000\000\0058\000\000@\182\002\154\008J\000\000\000\000\023\006\000\000\000\000\000\000\000\000\000\000\025\232\029\004\000\000\005\136\000\000\0008\000\000\000\000\008\150\000\127\000\000\000\000\000\000\000\000\000\230\0008\000\000\004\016\002\020\0008\000\000\000P\0008\000\000\008n\000\000\000\000\000\000\000\000\000\000\000\000\008\240\000\000\0304\000\000\031D\0008\000\000\003\240\0008\000\000\008\242\000\000\0008\008\244\000\000\007z\0008\008\252\000\000\t\002\000\000\n\194\0008\0008\008\140\0008\t\018\000\000\t\022\000\000\t\024\000\000\031D\000\000\001\164\031D\000\000\008\156\006\220\000\000\002\236\0008\000\000\004|\0008\000\000\005\012\001<\000\127\000\000\t\230\000\127\000\000\008\158\000\000\000\000\000\000\000\000\t \000\000\012\022\018\"\t$\000\000\t,\000\000\0008\t.\000\000\0008\t0\000\000\0008\t8\000\000\t\022\0008\tJ\000\000\0080\016\218\0008\008\208\0008\tN\000\000\tP\000\000\000\000\004\204\0008\000\000\005d\002\220\002\220\000\000\000\000\000\000\004\138\002\220\000\000\008\214\000\000\000\000\000\000\000\000\0008\000\000\005\136\0008\000\000\005\220\005\024\000\127\008\216\000\000\000\000\000\000\000\000\tZ\000\000\t\\\000\000\0008\t`\000\000\012,\018\"\tb\000\000\tj\000\000F\006\t \tL\017l\0008\t~\000\000\000\000\t\130\000\000\tbF\006\0008\t\146\000\000\0008\t\148\000\000\t\150\000\000\n\216\t\028\0008\t\156\000\000\t\158\000\000\000\127\t\024\000\000\000\000\023\006\000\000\000\000\002F\n\002\000\000\000\000\001\027\000\000\000\000\000\000<J\000z\nB\tj\t\240@\182\000\000\0036@\182\000\000\tB\000\000\000\000\000\000\000\000\000\000\002\166\000\000\003\170\000\000\000\000\000\000\003\250&\028\003\202&\028&\028\003\202\000\000\000\000\0028\0028\0028\0028\000\000\000\000\000\000\000\000\000\000\000\000\001R\015\238\n\012\013F\001\028\000\000\000\000\001\028\000\000\007\246\000\0000\142\tH\000\000\001R\015\238\tV\014\154\000\000\001R\013F\000\000\000\000\000\000$4\t\156\000\000\000z\000\000\000\000\t\190\000\030\nHN\186\000\000\005\022P&\000\000\000\000\nJ\n:\000k\000\000\000k\000\000\005\022\000\000\005JN\186\000\000\000\000\t\152\nJ\006\162\t\152\000\000\nn\001\028\000\000\007\246\000\000\003\128\001\174\000\000\000\000\n8\000\000\000\000\002F\000\000\004\198\000\000\000\000\000\000<J\000z\000\000\002\166\000\000\005\n\000\000\000\000\000\000\005N\000\000\n\158\002b\n\158\000\000\006\162\n\158\000\000\003\196\000\000\006\162\000\000\006\162\000\000\006\162\000\000\000\000\000\000\000\000\000\000\000z\000\000\006\162\000\000\003\196\000\000\006\162\000\000\004\212\000\000\000\000\tJ\t\202\000\127\002\148\nt\002\142\000\000\002\142\n\160\000\000\n\162\000\000\n\166\000\000\000\000\003R\002\142\016\134\002\142\000\000\000\000\005>\t\180\000\000\tJ\n\170\000\000\006,\003^\n\186\011\194\n\186\000\000\000\000\002\030\000\127\000\000\002F\n\012\000\000\000\000\000\000\005\206\000\000\t\190\000\000\000\000\000\000\000\000\tJ\006,\003^\002\030\002F\005\206\t\192\000\000\006,\003^\002\030\002F\005\206\t\196\000\000\000\127\000\000\n\192\n\188\n\000\000\127\n\\\000\000"), (16, "\n\237\n\237\n\237\n\237\n\237\n\237\n\237\n\237\n\237\n\237\n\237\000:\n\237\n\237\n\237\n\237\n\237\n\237\n\237\n\237\n\237\n\237\000\n\001^\020\131\020\135\n\237\012\022\001j\020\139\006\025\006\002\n\237\016\130\n\237\n\237\n\237\000\158\007y\n\237\017r\008J\000\014\n\237\n\237\005\129\n\237\002\146\000\023\000\027\008~\005\129\008J\007y\000\218\n\237\000\162\000\194\n\237\n\237\004\t\008~\017v\000\250\n\237\n\237\000\162\n\237\006j\n\237\000\198\000J\017z\000N\n\237\000V\n\237\n\237\n\237\n\237\n\237\013\006\000Z\000\158\n\237\n\237\n\237\ny\n\237\n\237\n\237\005\129\n\237\n\237\n\237\n\237\006\n\0182\016\138\n\237\n\237\001^\017\134\007y\005Z\001f\001j\003\198\000\162\n\237\n\237\n\237\000\162\n\237\n\237\n\237\n\237\001^\n\237\t\158\n\237\012\022\001j\n\237\t\146\n\029\n\237\n\237\006\025\000\242\t\158\013~\n\237\008J\000\162\013\174\n\237\000\006\004\t\n\237\016B\000^\008~\n\237\n\237\n\237\n\237\000\162\n\237\n\237\000\162\007y\004\t\n\237\n\237\n\237\005\193\n\237\005\217\n\237\n\237\017\138\n\237\007y\n\237\n\237\012\002\013\006\n\237\n\237\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\n\029\006!\006!\006!\006!\006!\006!\006!\006!\006!\006!\t\146\017\178\020\150\004\162\006!\008N\008^\008n\n\161\008J\006!\001^\006!\006!\006!\012\022\001j\006!\008~\t\158\n\209\006!\004\138\006\194\006!\000.\006\"\016\162\016\202\016\242\017\002\017.\016Z\006!\0069\0069\018\150\005\145\004\t\0069\000\158\002\202\006!\006!\000\162\003\137\001\006\006!\006!\000n\011\145\000r\006!\000z\006!\006!\006!\006!\006!\012\006\000~\002F\006!\006!\006!\022+\006!\006!\006!\000\162\006!\006!\006!\006!\022/\n\174\017\150\006!\006!\005\185\005\185\005\233\000\158\011\145\0222\000\162\005\129\t\158\006!\006!\002\162\006!\006!\006!\006!\000\218\006!\n\186\006!\006\142\005\241\006!\006\146\007e\006!\006!\021\n\007e\006\150\002\218\006!\000\162\012\194\006\154\021\014\011\145\011\145\006!\017z\000\130\011\145\006!\006!\006!\006!\0061\006!\006!\002\254\t\n\n\166\006!\006!\006!\006A\014\230\006A\006!\006!\006A\006!\013\138\006!\006!\017\166\023\146\006!\006!\006A\006A\006A\006A\006A\006A\006A\006A\006A\006A\006A\008r\006A\006A\006A\006A\006A\006A\006A\006A\006A\006A\n\137\018b\008J\002a\006A\020r\006A\002a\n\129\023\018\006A\008~\006A\006A\006A\006A\016\170\006A\006A\006A\006A\006A\006A\006A\006A\006A\005\169\012\198\003\n\003\018\n\222\023\022\000\158\006A\015\022\0061\006A\003f\023\026\0061\0061\006A\006A\006A\006A\006A\003\213\006A\006A\006\017\014\234\023\134\006A\020r\006A\023\154\006A\006A\006A\003\161\023\158\000\162\006A\006A\006A\005>\006A\006A\006A\005\161\006A\006A\006A\006A\019N\0061\008Y\014\170\006A\t\002\t\158\016\178\014\174\006A\t\146\t\218\n\137\003r\006A\006A\n\137\006A\006A\006A\006A\003\161\006A\023\"\006A\003\017\023n\006A\005f\011\206\006A\006A\002\141\n\137\008Y\008Y\006A\023\n\004\138\008Y\006A\006)\019R\006A\016.\015\026\003\190\006A\006A\000\162\006A\023:\006A\006A\023*\013\254\005\129\006A\0081\005\129\0035\018z\013\006\005\129\006A\005\129\006A\005\209\006A\006A\005\129\005\129\006A\006A\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\015.\000\146\020\234\000\150\006\150\000\154\000\174\000\178\000\182\006\154\020\242\t\146\0126\001^\003\206\006\158\012V\012\022\001j\003\214\008J\000\186\004V\001\030\006\174\006\202\004\193\004z\006\206\008~\011\206\005\241\000\190\012\138\011\206\008:\006)\n\137\005\137\002\146\006)\006)\004%\020\174\001*\004\193\000\162\021.\005\249\n\145\015\214\011\206\006)\008\146\006\214\021Z\021f\001\026\008\150\013\186\007=\023J\004\130\001R\004\186\001V\003\229\000\206\t\154\008\158\015J\017\162\023B\006\234\001^\008\162\006)\006\238\008\166\001j\n\177\006\242\006\246\008\170\006\250\0152\001^\004\198\005\129\008\174\012\022\001j\007=\007=\008Y\004\210\006i\007=\t\158\006\254\007\002\004\189\008\178\008\182\007\006\008\186\t\006\000\162\004\222\008\206\005\177\004\193\003\193\020\219\020\223\008\218\007\014\004!\020\227\000\162\004\189\006I\013\"\005\137\n\137\021z\008Y\008Y\008\250\004\193\014~\008Y\008\254\t:\003\229\t\166\017\246\007\018\t>\004\234\011\206\005\137\007\022\003\229\003\229\005\137\016\210\013\006\003\229\tF\n\193\007\026\006i\006I\006I\015N\015^\001\154\006I\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\004\246\000\146\020\234\000\150\006\150\000\154\000\174\000\178\000\182\006\154\020\242\0039\015\186\001^\005\n\006\158\004\189\012\022\001j\005\026\n\185\000\186\017\014\001\030\006\174\006\202\0039\018\146\006\206\0085\005\030\019\154\000\190\t\"\004\189\008:\018\134\003\021\006\001\013B\004\138\016\218\023:\019b\001*\005&\000\162\008J\005*\015n\n\153\0085\006Y\008\146\006\214\021Z\008~\011\206\008\150\014\002\008\145\0085\005R\001R\006\t\001V\003\245\000\206\t\154\008\158\017j\019J\005V\006\234\001^\008\162\019>\006\238\008\166\001j\000\162\006\242\006\246\008\170\006\250\022K\022O\017\022\005^\008\174\022S\0085\008\145\008\145\005\130\005\138\006Q\008\145\015\166\006\254\007\002\005\225\008\178\008\182\007\006\008\186\0039\000\162\006Y\008\206\0039\0039\003\193\021\190\n\201\008\218\007\014\005\153\005\241\022o\022s\006q\0039\015\222\022w\t\158\015\250\005\142\008\250\005\150\0035\019\150\008\254\t:\015r\t\166\0085\007\018\t>\021\238\005\170\005\174\007\022\002\129\003\245\0035\0039\005\201\023B\tF\0085\007\026\006Q\006q\006q\005\198\006a\001\154\006q\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\019\138\000\146\020\234\000\150\006\150\000\154\000\174\000\178\000\182\006\154\020\242\005\214\023\166\015\170\005\234\006\158\005\242\005\250\006\023\006.\0066\000\186\006:\001\030\006\174\006\202\006Z\006r\006\206\005\129\006\162\006\170\000\190\006\178\006\186\008:\006\190\006\198\015\226\006\222\006\230\015\254\006a\007>\001*\007J\007\146\008J\005%\008\n\0082\005\129\008F\008z\006\214\0035\008~\008R\008\150\0035\0035\005\129\008Z\001R\008b\001V\004\017\000\206\008\154\008\158\008j\0035\023\n\006\234\001^\008\162\008\190\006\238\008\166\001j\008\198\006\242\006\246\008\170\006\250\008\214\005\129\008\222\011\153\008\174\008\230\005\129\002\146\008r\008\238\0035\008\246\t2\tB\006\254\007\002\tJ\008\178\008\182\007\006\008\186\tV\000\162\018\022\008\206\tZ\tb\003\193\tf\tr\008\218\007\014\tz\t\138\t\174\t\190\008a\t\198\t\202\t\242\t\158\t\254\008v\008\250\n\006\017v\nF\008\254\t:\004\017\t\166\005\129\007\018\t>\nf\017z\nr\007\022\004\017\004\017\n\182\n\202\n\214\004\017\tF\005\129\007\026\n\238\008a\008a\n\250\011\130\001\154\008a\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\017\134\000\146\011\138\000\150\006\150\000\154\000\174\000\178\000\182\006\154\011\154\014\170\011\166\011\194\011\202\006\158\014\174\011\222\011\230\011\234\014\178\000\186\011\242\001\030\006\174\006\202\011\246\005\129\006\206\019\022\005\129\011\254\000\190\012\014\005\129\008:\005\129\012\"\012*\012.\012>\005\129\005\129\012F\001*\000\162\012^\008J\012f\012\146\012\154\017v\016.\008z\006\214\012\166\008~\012\170\008\150\017\138\012\178\017z\012\182\001R\012\190\001V\012\206\000\206\008\154\008\158\012\242\012\250\012\254\006\234\001^\008\162\013\014\006\238\008\166\001j\013\022\006\242\006\246\008\170\006\250\013\026\005\129\013*\011\153\008\174\0132\017\134\000:\013J\013R\000\218\013\162\013\234\013\246\006\254\007\002\014j\008\178\008\182\007\006\008\186\001^\000\162\014v\008\206\001f\001j\014\150\014\194\014\206\008\218\007\014\014\214\014\242\014\250\014\254\011\153\015\006\015\n\015\018\t\158\015\"\015:\008\250\015V\015z\015\138\008\254\t:\015\142\t\166\000\162\007\018\t>\000\162\015\150\015\154\007\022\015\162\005\129\015\178\015\194\015\202\015\206\tF\017\138\007\026\015\234\011\153\011\153\016\006\015\214\001\154\011\153\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\016\026\000\146\016*\000\150\006\150\000\154\000\174\000\178\000\182\006\154\016:\016R\016b\016n\004\162\006\158\016\151\016\191\016\231\003\173\016\255\000\186\001^\001\030\006\174\006\202\012\022\001j\006\206\017#\017;\022\254\000\190\007\129\003\173\008:\006\142\017~\017\190\006\146\017\219\018\003\018\015\021\n\001*\006\150\018\031\008J\007\129\018'\006\154\021\014\018:\008z\006\214\000\162\008~\018C\008\150\018K\018S\018n\018\174\001R\018\195\001V\018\211\000\206\008\154\008\158\018\219\018\231\018\243\006\234\001^\008\162\018\255\006\238\008\166\001j\019\006\006\242\006\246\008\170\006\250\019\015\019\"\019+\0193\008\174\019n\019\162\005\233\019\183\019\191\011\230\019\203\019\219\007\129\006\254\007\002\019\227\008\178\008\182\007\006\008\186\019\238\000\162\019\242\008\206\023Z\019\255\n\169\020\011\003\173\008\218\007\014\023^\003\173\003\173\020\018\020\031\020+\0203\020>\t\158\020G\020O\008\250\020[\003\173\003\173\008\254\t:\020v\t\166\020\154\007\018\t>\020\158\020\162\006\142\007\022\020\186\006\146\021:\007\129\021b\021\n\tF\006\150\007\026\021r\003\213\003\173\006\154\021\014\001\154\007\129\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\021\170\000\146\020\234\000\150\006\150\000\154\000\174\000\178\000\182\006\154\020\242\021\178\021\206\021\210\021\254\006\158\022\002\022\n\018.\0227\023\002\000\186\n\169\001\030\006\174\006\202\n\169\n\169\006\206\017r\012\166\023\014\000\190\023\030\023&\008:\023.\023W\023b\023r\017v\023\150\023\175\023\219\001*\023\247\024\006\024\n\024\014\018\162\017z\017v\024\023\008\146\006\214\000\000\n\169\000\000\008\150\022\134\000\000\017z\n\169\001R\000\000\001V\000\000\000\206\t\154\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\017\134\006\242\006\246\008\170\006\250\000\000\020:\000\000\003\213\008\174\000\000\017\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\007\002\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\000\000\003\193\000\000\000\000\008\218\007\014\000\000\000\000\000\000\000\000\008E\000\000\000\000\000\000\000\162\000\000\000\000\008\250\000\000\000\000\000\000\008\254\t:\000\000\t\166\000\162\007\018\t>\017\138\000\000\000\000\007\022\000\000\000\000\000\000\000\000\000\000\000\000\tF\017\138\007\026\000\000\008E\008E\000\000\000\000\001\154\008E\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\nq\000\000\000\000\000\000\000\000\006\158\000\000\000\000\017r\000\000\000\000\000\186\000\000\001\030\006\174\006\202\000\000\000\000\006\206\017r\000\000\000\000\000\190\000\000\000\000\008:\000\000\000\000\000\000\000\000\017v\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\017z\017v\000\000\008\146\006\214\000\000\000\000\000\000\008\150\012n\000\000\017z\000\000\001R\000\000\001V\000\000\000\206\t\154\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\018\202\006\242\006\246\008\170\006\250\000\000\000\000\000\000\011u\008\174\nq\019\210\000\000\000\000\nq\nq\000\000\000\000\000\000\006\254\007\002\000\000\008\178\008\182\007\006\008\186\nq\000\162\000\000\008\206\000\000\000\000\000\000\000\000\000\000\008\218\007\014\023v\000\000\000\000\000\000\011u\000\000\000\000\000\000\000\162\000\000\000\000\008\250\000\000\nq\000\000\008\254\t:\000\000\t\166\000\162\007\018\t>\017\138\000\000\000\000\007\022\000\000\000\000\000\000\000\000\000\000\000\000\tF\017\138\007\026\000\000\011u\011u\000\000\000\000\001\154\011u\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\000\000\000\000\000\000\000\000\000\000\006\158\000\000\000\000\000\000\000\000\000\000\000\186\000\000\001\030\006\174\006\202\000\000\000\000\006\206\000\000\000\000\000\000\000\190\000\000\000\000\008:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\146\006\214\000\000\000\000\000\000\008\150\021>\000\000\000\000\000\000\001R\000\000\001V\000\000\000\206\t\154\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\000\000\006\242\006\246\008\170\006\250\000\000\000\000\000\000\000\000\008\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\007\002\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\000\000\000\000\000\000\000\000\008\218\007\014\000\000\000\000\000\000\000\000\011\193\000\000\000\000\000\000\000\000\000\000\000\000\008\250\000\000\000\000\000\000\008\254\t:\000\000\t\166\000\000\007\018\t>\000\000\000\000\000\000\007\022\000\000\000\000\000\000\000\000\000\000\000\000\tF\000\000\007\026\000\000\011\193\011\193\000\000\000\000\001\154\011\193\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\000\000\000\000\000\000\000\000\000\000\006\158\000\000\000\000\000\000\000\000\000\000\000\186\000\000\001\030\006\174\006\202\000\000\000\000\006\206\000\000\000\000\000\000\000\190\000\000\000\000\008:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\146\006\214\000\000\000\000\000\000\008\150\021>\000\000\000\000\000\000\001R\000\000\001V\000\000\000\206\t\154\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\000\000\006\242\006\246\008\170\006\250\000\000\000\000\000\000\000\000\008\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\007\002\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\000\000\000\000\000\000\000\000\008\218\007\014\000\000\000\000\000\000\000\000\011\189\000\000\000\000\000\000\000\000\000\000\000\000\008\250\000\000\000\000\000\000\008\254\t:\000\000\t\166\000\000\007\018\t>\000\000\000\000\000\000\007\022\000\000\000\000\000\000\000\000\000\000\000\000\tF\000\000\007\026\000\000\011\189\011\189\000\000\000\000\001\154\011\189\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\000\000\000\000\000\000\000\000\000\000\006\158\000\000\000\000\000\000\000\000\000\000\000\186\000\000\001\030\006\174\006\202\000\000\000\000\006\206\000\000\000\000\000\000\000\190\000\000\000\000\008:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\146\006\214\000\000\000\000\000\000\008\150\0146\000\000\000\000\000\000\001R\000\000\001V\000\000\000\206\t\154\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\000\000\006\242\006\246\008\170\006\250\000\000\000\000\000\000\000\000\008\174\000\000\000\000\000\000\000\000\000\000\0031\000\000\000\000\000\000\006\254\007\002\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\0031\000\000\000\000\000\000\000\000\008\218\007\014\000\000\017r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0031\000\000\008\250\000\000\000\000\000\000\008\254\t:\000\000\t\166\000\000\007\018\t>\000\000\017v\000\000\007\022\000\000\000\000\000\000\000\000\000\000\000\000\tF\017z\007\026\000\000\0002\006&\000F\000b\001\154\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\000\000\019\026\000\000\000\000\n\029\000\000\017\134\000\000\000\000\000\000\000\000\000\186\000\000\001\030\000\000\006\202\0031\004\169\006\206\000\000\0031\0031\000\190\000\000\000\000\014\182\000\000\000\000\000\000\n\029\000\000\000\000\0031\000\000\001*\000\000\000\000\000\000\000\000\004\169\000\000\000\000\000\000\014\198\006\214\000\000\000\000\0031\000\000\004\169\000\000\000\162\000\000\001R\000\000\001V\0031\000\206\023B\000\000\011\018\000\000\000\000\006\234\001^\017\138\000\000\006\238\001f\001j\000\000\006\242\006\246\008\170\006\250\000\000\000\000\n\017\011\026\004\169\004\169\000\000\000\000\000\000\000\000\n\029\000\000\000\000\000\000\006\254\007\002\000\000\000\000\011\"\007\006\000\000\000\000\000\162\000\000\011b\011j\000\000\n\017\000\000\000\000\000\000\007\014\000\000\017r\011B\000\000\000\000\011*\000\000\011:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\169\t\166\000\000\007\018\014\202\000\000\017v\000\000\007\022\000\000\000\000\011J\000\000\000\000\004\169\014\210\017z\007\026\000\000\0002\0006\000F\000b\001\154\000f\000\000\000j\000\134\000\000\000\138\000\000\000\146\000\000\000\150\n\017\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\n)\000\000\017\134\011R\000\000\000\000\000\000\000\186\000\000\001\030\0112\001\"\000\000\000\000\001&\000\000\000\000\000\000\000\190\000\000\000\000\000\000\004\253\000\000\000\000\n)\000\000\000\000\000\000\000\000\001*\000\000\000\000\001.\000\000\000\000\000\000\011r\011Z\001F\001B\000\000\001J\000\000\000\000\000\000\000\000\000\162\000\000\001R\000\000\001V\000\000\000\206\000\000\000\000\000\000\000\000\000\000\001Z\001^\017\138\000\000\001b\001f\001j\001\190\001n\001r\000\000\001v\000\000\000\000\000\000\000\000\000\000\002\182\000F\000b\000\000\000f\n)\000j\000\134\000\000\000\138\001z\000\146\000\000\000\150\001~\000\154\000\174\000\162\000\182\000\000\006\158\000\000\000\000\000\000\000\000\000\000\001\134\000\000\001\030\006\174\006\202\000\186\000\000\006\206\000\000\001\138\000\000\000\000\000\000\000\000\008:\000\000\000\190\000\000\000\000\000\000\000\000\001\142\000\000\001*\000\000\000\000\001\146\000\000\000\000\003\133\000\000\000\000\008\202\006\214\000\000\001\150\000\000\008\150\000\000\000\000\000\000\001\154\001R\000\000\001V\000\000\000\000\000\000\008\158\000\000\000\000\000\206\006\234\001^\008\162\000\000\006\238\008\166\001j\000\000\006\242\006\246\000\000\006\250\000\000\000\000\000\000\000\000\008\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\007\002\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\000\000\000\162\000\000\000\000\008\218\007\014\000\000\000\000\000\000\000\000\006\158\000\000\000\000\000\000\000\000\000\000\000\000\008\250\001\030\006\174\006\202\008\254\t:\006\206\000\000\000\000\007\018\t>\007y\000\000\008:\007\022\000\000\t\146\000\000\000\000\000\000\000\000\tF\001*\007\026\000\000\008J\007y\000\000\000\000\001\154\000\000\006\210\006\214\000\000\008~\000\000\008\150\000\000\000\000\000\000\000\000\001R\000\000\001V\000\000\000\000\000\000\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\000\000\006\242\006\246\000\000\006\250\000\000\000\000\000\000\000\000\008\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007y\006\254\007\002\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\000\000\000\000\000\000\000\000\008\218\007\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\158\011\213\000\000\008\250\011\213\000\000\000\000\008\254\t:\000\000\000\000\000\000\007\018\t>\000\000\000\000\000\000\007\022\000\000\011\213\000\000\007y\000\000\011\213\tF\000\000\007\026\001\178\011\213\000\000\000\000\000\000\001\154\007y\011\213\000\000\000\000\011\213\011\213\000\000\011\213\011\213\000\000\000\000\001\186\000\000\011\213\002\210\000\000\000\000\011\213\000\000\000\000\011\213\000\000\011\213\011\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\213\000\000\011\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\213\005\129\000\000\000\000\000\000\000\000\002\222\000\000\000\000\000\000\000\000\005\129\005\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\213\011\213\011\213\000\000\011\213\011\213\002\226\000\000\011\213\000\000\000\000\000\000\004!\005\129\000\000\004!\002\234\000\000\005\129\002\146\011\213\000\000\005\129\011\213\011\213\011\213\011\213\000\000\000\000\000\000\004!\011\213\011\213\011\213\004!\011\213\011\213\011\213\004!\004!\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\004!\004!\000\000\004!\004!\000\000\005\129\004!\000\000\004!\004!\000\000\000\000\004!\000\000\005\129\004!\000\000\004!\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\129\000\000\000\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\129\000\000\004!\005\129\005\129\000\000\000\000\005\129\004!\000\000\000\000\000\162\000\000\000\000\000\000\000\000\000\000\005\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\004!\004!\000\000\004!\004\189\004!\000\000\004!\000\000\001=\001=\001=\001=\000\000\001=\004!\001=\001=\000\000\001=\000\000\001=\004!\001=\004!\001=\001=\001=\001=\000\000\004!\004!\004!\017F\004!\004!\004!\000\000\000\000\000\000\001=\001=\001=\000\000\000\000\000\000\000\000\001=\000\000\000\000\000\000\000\000\001=\000\000\000\000\000\000\001=\000\000\000\000\000\000\001=\000\000\000\000\017J\000\000\000\000\001=\000\000\000\000\000\000\006~\006J\000b\001=\000f\000\181\006N\000\134\001=\000\138\000\000\000\146\000\000\000\150\000\000\000\154\000\174\001=\000\182\000\000\000\000\000\000\000\000\011\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\186\000\000\000\000\000\000\000\000\000\000\001=\011\"\000\000\001=\000\000\000\190\000\000\000\181\000\181\000\000\000\000\000\000\000\000\000\000\001=\000\000\000\000\011B\000\000\001=\011*\001=\011:\000\000\001=\000\000\001=\000\000\000\000\004%\000\000\001=\004%\000\000\001=\000\000\000\000\000\000\000\000\000\000\000\206\000\000\000\000\011J\000\000\000\000\000\000\004%\000\000\001=\000\000\004%\001=\001=\000\000\004%\004%\000\000\000\000\000\000\000\000\000\000\004%\017N\000\000\004%\004%\000\000\004%\004%\000\000\000\000\004%\000\000\004%\004%\000\000\000\000\004%\011R\000\000\004%\000\000\004%\004%\000\000\0112\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\181\000\000\000\000\000\000\000\000\000\000\004%\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\181\011Z\000\000\004%\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004%\004%\004%\000\000\004%\004\193\004%\000\000\004%\000\000\000\000\000\000\012)\000\000\000\000\012)\004%\000\000\000\000\000\000\004%\000\000\000\000\004%\000\000\004%\000\000\000\000\000\000\000\000\012)\004%\004%\004%\012)\004%\004%\004%\007.\012)\000\000\000\000\000\000\000\000\000\000\012)\000\000\000\000\012)\012)\000\000\012)\012)\000\000\000\000\0076\000\000\012)\007B\000\000\000\000\012)\000\000\000\000\012)\000\000\012)\012)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012)\000\000\012)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012)\000\000\000\000\000\000\000\000\000\000\007N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012)\012)\012)\000\000\012)\000\000\007R\000\000\012)\000\000\n\013\n\013\n\013\n\013\000\000\n\013\007Z\n\013\n\013\000\000\n\013\000\000\n\013\012)\n\013\012)\n\013\n\013\n\013\n\013\000\000\012)\012)\012)\000\000\012)\012)\012)\000\000\000\000\000\000\n\013\n\013\n\013\000\000\000\000\000\000\000\000\n\013\000\000\000\000\000\000\000\000\n\013\000\000\000\000\000\000\017^\000\000\000\000\000\000\017f\000\000\000\000\000\000\000\000\000\000\n\013\000\000\000\000\000\000\000\000\000\000\000\000\n\013\000\000\000\000\000\000\000\000\n\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004E\n\013\000J\004E\000N\004E\000V\004E\000\000\004E\000\000\000\000\000\000\000Z\004E\004E\000\000\000\000\000\000\000\000\000\000\n\013\000\000\000\000\n\013\000\000\000\000\004E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\013\000\157\004E\004E\000\000\n\013\000\000\n\013\004E\000\000\n\013\000\000\n\013\000\000\000\000\000\000\000\000\n\013\000\000\000\157\n\013\000\000\000\000\000\000\004E\000\000\000\000\004E\000\000\000\000\000\000\000\000\004E\004E\011\"\n\013\004E\000^\017\222\n\013\000\157\000\157\000\000\000\000\004E\000\000\000\000\000\000\004E\004E\000\157\000\000\000\000\011*\000\000\011:\000\000\000\000\004E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\157\004E\000\000\000\000\000\000\000\000\004E\004I\000\000\000n\004I\000r\004I\000z\004I\004E\004I\000\000\000\000\000\000\000~\004I\004I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004I\004E\000\157\000\000\004E\004E\000\000\000\000\004E\0112\004I\004I\000\000\004E\004E\000\000\004I\000\000\004E\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\000\000\000\001\137\000\000\000\000\001\137\004I\000\000\000\000\004I\000\157\000\157\000\000\000\000\004I\004I\000\000\000\000\004I\000\130\001\137\000\000\000\000\000\000\001\137\000\000\004I\000\000\000\000\001\137\004I\004I\000\000\000\000\000\000\001\137\000\000\000\000\001\137\001\137\004I\001\137\001\137\000\000\000\000\000\000\000\000\001\137\000\000\000\000\004I\001\137\000\000\000\000\001\137\000\000\001\137\001\137\000\000\004I\000\000\000\000\000\000\000\000\004I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004I\000\000\000\000\000\000\001\137\000\000\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\137\000\000\000\000\000\000\004I\000\000\000\000\004I\004I\000\000\000\000\004I\000\000\000\000\000\000\000\000\004I\004I\000\000\000\000\000\000\004I\000\000\001\137\001\137\001\206\000\000\001\137\001\137\000\000\000\000\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\137\000\000\000\000\001\137\001\137\001\137\001\137\000\000\000\000\000\000\000\000\002v\001\137\001\137\000\000\001\137\001\137\001\137\t\253\t\253\t\253\t\253\000\000\t\253\000\000\t\253\t\253\000\000\t\253\000\000\t\253\000\000\t\253\000\000\t\253\t\253\t\253\t\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\253\t\253\t\253\000\000\000\000\000\000\000\000\t\253\000\000\000\000\000\000\000\000\t\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\241\t\253\000\000\000\000\000\000\000\000\000\000\000\000\t\253\000\000\000\000\000\000\000\000\t\253\000\000\000\000\000\000\000\000\011\241\000\000\000\000\000\000\t\253\000\000\000\000\000\000\nV\000\000\000\000\000\000\000\000\000\000\000\000\011\241\000\000\000\000\000\000\000\000\000\000\011\241\011\241\000\000\t\253\n^\000\000\t\253\nj\000\000\000\000\011\241\000\000\000\000\011\241\000\000\011\241\000\000\t\253\000\000\000\000\000\000\000\000\t\253\000\000\t\253\000\000\000\000\t\253\000\000\t\253\000\000\000\000\000\000\000\000\t\253\000\000\011\241\t\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\149\000\000\000\000\000\000\000\000\000\000\000\000\t\253\000\000\nv\017b\t\253\n\001\n\001\n\001\n\001\000\000\n\001\000\149\n\001\n\001\000\000\n\001\000\000\n\001\000\000\n\001\011\241\n\001\n\001\n\001\n\001\nz\000\149\011\241\000\000\000\000\000\000\000\000\000\149\000\149\000\000\n\130\n\001\n\001\n\001\011\241\000\000\000\000\000\149\n\001\000\000\011*\000\000\000\149\n\001\000\000\000\000\000\000\017\226\000\000\011\241\011\241\000\000\000\000\000\153\000\000\000\000\000\000\n\001\000\000\000\000\000\000\000\000\000\000\000\149\n\001\000\000\000\000\000\000\000\000\n\001\000\000\000\153\000\000\000\000\000\000\000\000\000\000\000\000\n\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\153\000\000\000\000\000\000\000\000\000\000\000\153\000\153\000\000\000\000\000\000\000\000\n\001\000\149\000\000\n\001\000\153\000\000\000\000\011*\0112\000\153\000\000\000\000\000\000\000\000\n\001\000\000\000\000\000\000\000\000\n\001\000\149\n\001\000\000\000\000\n\001\000\000\n\001\000\000\000\000\000\000\000\153\n\001\000\000\000\000\n\001\000\149\000\149\000\000\0002\0006\000F\000b\000\000\000f\000\000\000j\000\134\000\000\000\138\n\001\000\146\000\000\000\150\n\001\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\153\000\000\000\000\017\234\000\186\018\006\000\000\0112\000\000\000\000\018\018\000\000\000\000\000\000\000\000\000\190\000\000\000\000\000\000\000\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\169\018*\000\000\000\000\000\000\000\000\000\153\000\153\000\202\000\000\000\000\000\000\000\000\018V\000\000\000\000\000\000\000\000\011\026\000\000\000\000\004}\000\206\000\000\004}\000R\004}\000\000\004}\000\000\004}\000\000\000\000\011\"\000\000\004}\004}\000\000\000\000\000\169\000\169\000\000\018v\000\000\000\000\018\198\000\000\000\000\004}\000\169\000\000\000\000\011*\000\000\011:\000\000\018\222\000\000\004}\004}\000\000\018\234\000\000\008-\004}\000\000\018\246\000\000\019\002\000\000\000\000\000\000\000\000\019\018\000\000\011J\019\194\000\000\000\000\000\000\004}\000\000\000\000\004}\000\000\000\000\000\000\000\000\004}\004}\000\000\019\206\004}\004}\004\129\019\230\000\000\004\129\000v\004\129\004}\004\129\000\000\004\129\004}\004}\000\000\000\000\004\129\004\129\000\000\000\169\000\000\000\000\004}\000\000\000\000\000\000\0112\000\000\000\000\004\129\000\000\000\000\004}\000\000\000\000\000\000\000\000\000\000\000\169\004\129\004\129\004}\000\000\000\000\000\000\004\129\004}\000\000\000\000\000\000\000\000\000\000\000\000\000\169\000\169\004}\000\000\000\000\000\000\000\000\000\000\004\129\000\000\000\000\004\129\000\000\000\000\000\000\000\000\004\129\004\129\000\000\000\000\004\129\004\129\004}\000\000\000\000\004}\004}\000\000\004\129\004}\000\000\000\000\004\129\004\129\004}\004}\000\000\000\000\000\000\004}\000\000\000\000\004\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\129\000\000\000\000\000\000\000\000\004\129\004\133\000\000\000\000\004\133\000\142\004\133\000\000\004\133\004\129\004\133\000\000\000\000\000\000\000\000\004\133\004\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\133\004\129\000\000\000\000\004\129\004\129\000\000\000\000\004\129\000\000\004\133\004\133\004\185\004\129\004\129\004\185\004\133\004\185\004\129\004\185\000\000\004\185\000\000\000\000\000\000\000\000\004\185\004\185\000\000\000\000\000\000\000\000\004\133\000\000\000\000\004\133\000\000\000\000\000\000\004\185\004\133\004\133\000\000\000\000\004\133\004\133\000\000\000\000\000\000\004\185\004\185\000\000\004\133\000\000\000\000\004\185\004\133\004\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\133\000\000\000\000\000\000\000\000\004\185\000\000\000\000\004\185\000\210\004\133\000\000\000\000\004\185\004\185\000\000\000\000\004\185\004\185\004\133\000\000\000\000\000\000\000\000\004\133\004\185\000\000\000\000\000\000\004\185\004\185\000\000\000\000\004\133\000\000\000\000\000\000\000\000\000\000\004\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\185\000\000\000\000\000\000\004\133\000\000\000\000\004\133\004\133\004\185\000\000\004\133\001\238\000\000\004\185\002>\004\133\004\133\000\000\000\000\000\000\004\133\000\000\004\185\000\000\000\000\000\000\000\000\000\000\000\000\001\246\000\000\000\000\000\000\002\001\000\000\000\000\000\000\000\000\002\001\000\000\000\000\000\000\004\185\000\000\001\254\004\185\004\185\002\001\002\001\004\185\002^\002f\000\000\000\000\004\185\004\185\002\001\000\000\000\000\004\185\002\030\000\000\000\000\002\006\000\000\002\022\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\001\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\000\000\002\001\002.\000\000\000\000\002\001\002\001\000\000\000\000\002\014\000\000\000\186\000\000\000}\000\000\000\000\000}\000\000\000\000\000\000\000\000\002\001\000\190\000\000\002\001\002\001\002\001\002\001\000\000\000\000\000\000\001\246\000\000\002\001\002\001\000}\002n\0026\002\001\000\000\000}\000\000\000\000\000\202\000\000\000\000\001\254\000\000\000\000\000}\000}\000\000\000}\000}\000\000\000\000\000\000\000\206\000}\000\000\000\000\000\000\002\030\000\000\000\000\002\006\000\000\002\022\000}\000\000\000\000\000\000\000\000\008\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\000\000}\000\000\000\000\000\000\000\000\000\000\000\000\000\162\000\000\000\000\000}\0002\t\182\000F\000b\000\000\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\020\234\000\150\006\150\000\154\000\174\000\178\000\182\006\154\020\242\000}\002.\t\166\000\000\000}\000}\000\000\000\000\002\014\000\000\000\186\000\000\000e\000\000\000\000\000e\000\000\000\000\000\000\000\000\000}\000\190\000\000\000}\000}\000}\000}\000\000\000\000\000\000\000e\000\000\000}\000}\000e\000}\0026\000}\000\000\000e\000\000\000\000\000\202\000\000\000\000\001\254\000\000\000\000\000e\000e\000\000\000e\000e\000\000\000\000\000\000\000\206\000e\000\000\000\000\000\000\000e\000\000\000\000\002\006\000\000\002\022\000e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e\000\000\000e\000\000\000\000\000\000\000\000\000\000\000\000\000\162\000\000\000\000\000e\000\000\003\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e\000e\000\000\000\000\000e\000e\000\000\000\000\002\014\000\000\000\000\000\000\000]\000\000\000\000\000]\000\000\000\000\000\000\000\000\000e\000\000\000\000\000e\000e\000e\000e\000\000\000\000\000\000\000]\000\000\000e\000e\000]\000e\000e\000e\000\000\000]\000\000\000\000\000\000\000\000\000\000\000]\000\000\000\000\000]\000]\000\000\000]\000]\000\000\000\000\000\000\000\000\000]\000\000\000\000\000\000\000]\000\000\000\000\002\006\000\000\000]\000]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000]\000\000\000]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000]\000\000\020\238\000F\000b\000\000\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\020\234\000\150\006\150\000\154\000\174\000\000\000\182\006\154\020\242\000]\000]\000\000\000\000\000]\000]\000\000\000\000\002\014\000\000\000\186\000\000\000a\000\000\000\000\000a\000\000\000\000\000\000\000\000\000]\000\190\000\000\000]\000]\000]\000]\000\000\000\000\000\000\000a\000\000\000]\000]\000a\000]\000]\000]\000\000\000a\000\000\000\000\000\000\000\000\000\000\000a\000\000\000\000\000a\000a\000\000\000a\000a\000\000\000\000\000\000\000\206\000a\000\000\000\000\000\000\000a\000\000\000\000\002\006\000\000\000a\000a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000a\000\000\000a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000a\000\000\003\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000a\000a\000\000\000\000\000a\000a\000\000\000\000\002\014\000\000\000\000\000\000\000q\000\000\000\000\000q\000\000\000\000\000\000\000\000\000a\000\000\000\000\000a\000a\000a\000a\000\000\000\000\000\000\001\246\000\000\000a\000a\000q\000a\000a\000a\000\000\000q\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000q\000q\000\000\000q\000q\000\000\000\000\000\000\000\000\000q\000\000\000\000\000\000\000q\000\000\000\000\002\006\000\000\002\022\000q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\000\000q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000q\0002\006B\006J\000b\000\000\000f\000\000\006N\000\134\000\000\000\138\000\000\000\146\000\000\000\150\000\000\000\154\000\174\000\178\000\182\000\000\000\000\000q\000q\000\000\000\000\000q\000q\000\000\000\000\002\014\000\000\000\186\000\000\000i\000\000\000\000\000i\000\000\000\000\000\000\000\000\000q\000\190\000\000\000q\000q\000q\000q\000\000\000\000\000\000\001\246\000\000\000q\000q\000i\000q\000q\000q\000\000\000i\000\000\000\000\006R\000\000\000\000\001\254\000\000\000\000\000i\000i\000\000\000i\000i\000\000\000\000\000\000\000\206\000i\000\000\000\000\000\000\000i\000\000\000\000\002\006\000\000\002\022\000i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000i\000\000\000i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000i\000i\000\000\000\000\000i\000i\000\000\000\000\002\014\000\000\000\000\000\000\000m\000\000\000\000\000m\000\000\000\000\000\000\000\000\000i\000\000\000\000\000i\000i\000i\000i\000\000\000\000\000\000\001\246\000\000\000i\000i\000m\000i\000i\000i\000\000\000m\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000m\000m\000\000\000m\000m\000\000\000\000\000\000\000\000\000m\000\000\000\000\000\000\000m\000\000\000\000\002\006\000\000\002\022\000m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\000\000m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000m\000m\000\000\000\000\000m\000m\000\000\000\000\002\014\000\000\000\000\000\000\000u\000\000\000\000\000u\000\000\000\000\000\000\000\000\000m\000\000\000\000\000m\000m\000m\000m\000\000\000\000\000\000\001\246\000\000\000m\000m\000u\000m\000m\000m\000\000\000u\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000u\000u\000\000\000u\000u\000\000\000\000\000\000\000\000\000u\000\000\000\000\000\000\002\030\000\000\000\000\002\006\000\000\002\022\000u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\000\000u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\002.\000\000\000\000\000u\000u\000\000\000\000\002\014\000\000\000\000\000\000\001\238\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000u\000\000\000\000\000u\000u\000u\000u\000\000\000\000\000\000\001\246\000\000\000u\000u\000\133\000u\000u\000u\000\000\000\133\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000\133\000\133\000\000\000\133\002f\000\000\000\000\000\000\000\000\000\133\000\000\000\000\000\000\002\030\000\000\000\000\002\006\000\000\002\022\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\000\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\002.\000\000\000\000\000\133\000\133\000\000\000\000\002\014\000\000\000\000\000\000\001\238\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\133\000\000\000\000\000\133\000\133\000\133\000\133\000\000\000\000\000\000\001\246\000\000\000\133\000\133\000y\002n\0026\000\133\000\000\000y\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000y\000y\000\000\000y\000y\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\002\030\000\000\000\000\002\006\000\000\002\022\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000y\002.\000\000\000\000\000y\000y\000\000\000\000\002\014\000\000\000\000\000\000\001\238\000\000\000\000\000\129\000\000\000\000\000\000\000\000\000y\000\000\000\000\000y\000y\000y\000y\000\000\000\000\000\000\001\246\000\000\000y\000y\000\129\000y\0026\000y\000\000\000\129\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000\129\000\129\000\000\000\129\002f\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\002\030\000\000\000\000\002\006\000\000\002\022\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\004\153\000\000\000\000\004\153\000\000\004\153\000\000\004\153\000\000\004\153\000\000\000\000\000\000\000\000\004\153\004\153\000\000\000\000\000\000\000\000\000\000\000\129\002.\000\000\000\000\000\129\000\129\004\153\000\000\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\153\004\153\000\000\000\000\000\129\000\000\004\153\000\129\000\129\000\129\000\129\000\000\000\000\000\000\000\000\000\000\000\129\000\129\000\000\000\129\0026\000\129\004\153\000\000\000\000\004\153\005\226\000\000\000\000\000\000\004\153\004\153\000\000\000\000\004\153\004\153\005\129\000\000\000\000\005\129\000\000\005\129\004\153\005\129\000\000\005\129\004\153\004\153\000\000\000\000\005\129\005\129\000\000\000\000\000\000\000\000\004\153\000\000\005\129\000\000\000\000\000\000\000\000\005\129\000\000\000\000\004\153\000\000\005\129\005\129\000\000\000\000\000\000\005\129\005\129\004\153\000\000\000\000\000\000\005\129\004\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\153\000\000\000\000\000\000\005\129\000\000\005\129\000\000\000\000\005\129\002\146\000\000\000\000\005\129\005\129\002\146\000\000\000\000\005\129\005\129\004\153\005\129\000\000\004\153\004\153\005\129\005\129\004\153\000\000\000\000\005\129\005\129\004\153\004\153\000\000\005\129\000\000\004\153\000\000\000\000\005\129\000\000\000\000\000\000\000\000\005\129\000\000\000\000\000\000\000\000\005\129\000\000\000\000\000\000\005\129\000\000\000\000\000\000\000\000\005\129\000\000\000\000\000\000\000\000\005\129\000\000\000\000\000\000\005\129\000\000\000\000\000\000\n\198\005\129\000\000\000\000\000\000\003i\000\000\003i\000\000\000\000\003i\000\000\000\000\000\000\000\000\000\000\005\129\000\000\000\000\005\129\005\129\005\129\000\000\005\129\005\129\005\129\003i\000\000\005\129\005\129\000\000\000\000\000\000\005\129\005\129\003i\003i\000\000\005\129\003i\003i\000\000\000\000\000\000\000\000\003i\000\000\003i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\000\000\000\000\003i\003i\003i\000\000\003i\003i\000\000\003i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\161\000\000\000\000\001\161\003i\003i\000\000\000\000\000\000\003i\000\000\000\000\003i\000\000\000\000\000\000\000\000\000\000\001\161\000\000\000\000\003i\001\161\000\000\000\000\000\000\000\000\001\161\003i\000\000\003i\000\000\003i\001\161\000\000\000\000\001\161\001\161\000\000\001\161\001\161\000\000\003i\000\000\000\000\001\161\000\000\003i\000\000\001\161\000\000\000\000\001\161\003i\001\161\001\161\003i\000\000\000\000\000\000\000\000\000\000\003i\000\000\000\000\000\000\003q\003q\003q\003q\000\000\003q\000\000\003q\003q\001\161\003q\001\161\003q\000\000\003q\000\000\003q\003q\003q\003q\000\000\001\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\238\000\000\000\000\003q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003q\001\161\001\161\007~\000\000\001\161\000\000\000\000\000\000\001\161\001\030\000\000\t\226\000\000\000\000\t\230\000\000\000\000\000\000\000\000\000\000\003q\000\000\000\000\001\161\000\000\001\161\003q\000\000\000\000\000\000\001*\007\134\001\161\001\161\003q\001\161\001\161\001\161\000\000\t\234\n>\000\000\000\000\n\166\n\190\000\000\000\000\000\000\000\000\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\n\001^\000\000\000\000\n\014\008\166\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\000\000\003q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\n\030\000\000\000\000\000\000\n\"\000\000\000\000\000\162\000\000\000\000\001\030\000\000\t\226\000\000\000\000\t\230\n*\000\000\000\000\000\000\000\000\000\000\000\000\005\169\000\000\n\194\000\000\n\222\000\000\003q\000\000\001*\000\000\000\000\000\000\000\000\000\000\n.\000\000\000\000\t\234\n>\n2\000\000\n\166\n\190\000\000\000\000\011\186\000\000\001R\n6\001V\000\000\000\000\000\000\000\000\001\154\000\000\000\000\n\n\001^\000\000\000\000\n\014\008\166\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\n\030\000\000\000\000\000\000\n\"\000\000\000\000\000\162\000\000\000\000\001\030\000\000\t\226\000\000\000\000\t\230\n*\000\000\000\000\000\000\000\000\000\000\000\000\005\169\000\000\n\194\000\000\n\222\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\n.\000\000\000\000\t\234\n>\n2\000\000\n\166\n\190\000\000\000\000\n\230\000\000\001R\n6\001V\000\000\000\000\000\000\000\000\001\154\000\000\000\000\n\n\001^\000\000\000\000\n\014\008\166\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\n\030\000\000\000\000\000\000\n\"\000\000\000\000\000\162\000\000\000\000\001\030\000\000\t\226\000\000\000\000\t\230\n*\000\000\000\000\000\000\000\000\000\000\000\000\005\169\000\000\n\194\000\000\n\222\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\n.\000\000\000\000\t\234\n>\n2\000\000\n\166\n\190\000\000\000\000\005\021\000\000\001R\n6\001V\000\000\000\000\000\000\000\000\001\154\000\000\012\013\n\n\001^\012\013\000\000\n\014\008\166\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\000\000\000\000\000\000\012\013\000\000\000\000\000\000\012\013\000\000\000\000\000\000\003V\006\254\n\030\000\000\000\000\000\000\n\"\012\013\000\000\000\162\000\000\012\013\000\000\012\013\012\013\000\000\000\000\003^\n*\000\000\003j\000\000\000\000\012\013\000\161\005\169\012\013\n\194\012\013\n\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n.\000\000\000\000\011\026\000\000\n2\000\000\000\000\000\000\000\000\012\013\001\189\000\000\000\000\n6\000\000\000\000\000\000\011\"\000\000\001\154\000\000\012\013\000\000\000\161\000\161\000\000\000\000\003v\000\000\000\000\000\000\000\000\001\030\000\161\t\226\000\000\011*\t\230\011:\000\000\000\000\000\000\000\000\000\000\000\000\012\013\012\013\000\000\012\013\000\000\003z\000\000\012\013\001*\000\000\000\000\000\000\000\000\000\000\000\161\003\130\000\000\t\234\n>\012\013\000\000\n\166\n\190\000\000\012\013\012\013\000\000\001R\000\000\001V\012\013\000\000\000\000\000\000\012\013\012\013\012\013\n\n\001^\000\000\000\000\n\014\008\166\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\161\000\000\000\000\000\000\000\000\001\137\000\000\0112\001\137\000\000\000\000\000\000\000\000\006\254\n\030\000\000\000\000\000\000\n\"\000\161\000\000\000\162\000\000\001\137\000\000\000\000\000\000\000\000\000\000\000\000\n*\000\000\001\137\000\000\000\161\000\161\000\000\005\169\001\137\000\000\000\000\n\222\000\000\000\000\001\137\001\137\000\000\000\000\000\000\000\000\007\178\n.\000\000\008\002\001\137\000\000\n2\001\137\000\165\001\137\001\137\000\000\001\201\000\000\000\000\n6\000\000\000\000\007\186\000\000\000\000\001\154\002\017\000\000\000\000\000\000\011\026\002\017\000\000\000\000\001\137\000\000\001\137\007\194\000\000\000\000\002\017\002\017\000\000\008\018\008\026\011\"\000\000\000\000\000\000\002\017\000\000\000\165\000\165\007\226\000\000\000\000\007\202\000\000\007\218\002\017\000\000\000\165\000\000\000\000\011*\000\000\011:\000\000\000\000\001\137\001\137\001\198\000\000\001\137\001\137\000\000\000\000\001\137\000\000\007\234\000\000\002\017\000\000\000\000\000\000\000\000\000\000\011J\000\000\001\137\000\000\002\017\001\137\001\137\000\000\001\137\000\000\000\000\000\000\000\000\002\130\001\137\001\137\000\000\001\137\001\137\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\017\007\242\000\000\000\000\002\017\000\000\000\000\000\000\007\210\000\165\000\000\000\000\001%\000\000\000\000\001%\0112\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000\000\002\017\000\000\000\000\000\165\000\000\007\186\000\000\002\017\002\017\001%\008\"\007\250\002\017\000\000\001%\000\000\000\000\000\000\000\165\000\165\007\194\000\000\000\000\001%\001%\000\000\001%\001%\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\007\226\000\000\000\000\007\202\000\000\007\218\001%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\234\001\013\001%\000\000\001\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\000\000\001\013\000\000\000\000\000\000\001\013\000\000\000\000\000\000\000\000\001\013\000\000\000\000\000\000\000\000\000\000\007\194\001%\007\242\001\013\001\013\001%\001\013\001\013\000\000\007\210\000\000\000\000\001\013\000\000\000\000\000\000\001\013\000\000\000\000\007\202\000\000\007\218\001\013\000\000\001%\000\000\001%\000\000\000\000\000\000\000\000\000\000\000\000\001%\001%\000\000\001%\007\250\001%\000\000\000\000\000\000\001\013\001\005\001\013\000\000\001\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\013\000\000\000\000\000\000\000\000\000\000\000\000\001\005\000\000\000\000\000\000\001\005\000\000\000\000\000\000\000\000\001\005\000\000\000\000\000\000\000\000\000\000\001\005\001\013\001\013\001\005\001\005\001\013\001\005\001\005\000\000\007\210\000\000\000\000\001\005\000\000\000\000\000\000\001\005\000\000\000\000\007\202\000\000\001\005\001\005\000\000\001\013\000\000\001\013\000\000\000\000\000\000\000\000\000\000\000\000\001\013\001\013\000\000\001\013\001\013\001\013\000\000\000\000\000\000\001\005\001\t\001\005\000\000\001\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\005\000\000\000\000\000\000\000\000\000\000\000\000\001\t\000\000\000\000\000\000\001\t\000\000\000\000\000\000\000\000\001\t\000\000\000\000\000\000\000\000\000\000\001\t\001\005\001\005\001\t\001\t\001\005\001\t\001\t\000\000\007\210\000\000\000\000\001\t\000\000\000\000\000\000\001\t\000\000\000\000\007\202\000\000\001\t\001\t\000\000\001\005\000\000\001\005\000\000\000\000\000\000\000\000\000\000\000\000\001\005\001\005\000\000\001\005\001\005\001\005\000\000\000\000\000\000\001\t\001\025\001\t\000\000\001\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\t\000\000\000\000\000\000\000\000\000\000\000\000\007\186\000\000\000\000\000\000\001\025\000\000\000\000\000\000\000\000\001\025\000\000\000\000\000\000\000\000\000\000\007\194\001\t\001\t\001\025\001\025\001\t\001\025\001\025\000\000\007\210\000\000\000\000\001\025\000\000\000\000\000\000\001\025\000\000\000\000\007\202\000\000\007\218\001\025\000\000\001\t\000\000\001\t\000\000\000\000\000\000\000\000\000\000\000\000\001\t\001\t\000\000\001\t\001\t\001\t\000\000\000\000\000\000\007\234\001\017\001\025\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\000\000\000\000\000\000\000\000\000\000\007\186\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\007\194\001\025\001\025\001\017\001\017\001\025\001\017\001\017\000\000\007\210\000\000\000\000\001\017\000\000\000\000\000\000\001\017\000\000\000\000\007\202\000\000\007\218\001\017\000\000\001\025\000\000\001\025\000\000\000\000\000\000\000\000\000\000\000\000\001\025\001\025\000\000\001\025\001\025\001\025\000\000\000\000\000\000\001\017\001\021\001\017\000\000\001\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\007\186\000\000\000\000\000\000\001\021\000\000\000\000\000\000\000\000\001\021\000\000\000\000\000\000\000\000\000\000\007\194\001\017\001\017\001\021\001\021\001\017\001\021\001\021\000\000\007\210\000\000\000\000\001\021\000\000\000\000\000\000\001\021\000\000\000\000\007\202\000\000\007\218\001\021\000\000\001\017\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\001\017\001\017\000\000\001\017\001\017\001\017\000\000\000\000\000\000\007\234\001\029\001\021\000\000\001\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\021\000\000\000\000\000\000\000\000\000\000\000\000\007\186\000\000\000\000\000\000\001\029\000\000\000\000\000\000\000\000\001\029\000\000\000\000\000\000\000\000\000\000\007\194\001\021\001\021\001\029\001\029\001\021\001\029\001\029\000\000\007\210\000\000\000\000\001\029\000\000\000\000\000\000\007\226\000\000\000\000\007\202\000\000\007\218\001\029\000\000\001\021\000\000\001\021\000\000\000\000\000\000\000\000\000\000\000\000\001\021\001\021\000\000\001\021\001\021\001\021\000\000\000\000\000\000\007\234\007\178\001\029\000\000\001-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\000\000\000\000\000\000\000\000\000\000\000\000\007\186\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\007\194\001\029\007\242\001-\001-\001\029\001-\008\026\000\000\007\210\000\000\000\000\001-\000\000\000\000\000\000\007\226\000\000\000\000\007\202\000\000\007\218\001-\000\000\001\029\000\000\001\029\000\000\000\000\000\000\000\000\000\000\000\000\001\029\001\029\000\000\001\029\001\029\001\029\000\000\000\000\000\000\007\234\007\178\001-\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\000\000\007\186\000\000\000\000\000\000\001!\000\000\000\000\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\007\194\001-\007\242\001!\001!\001-\001!\001!\000\000\007\210\000\000\000\000\001!\000\000\000\000\000\000\007\226\000\000\000\000\007\202\000\000\007\218\001!\000\000\001-\000\000\001-\000\000\000\000\000\000\000\000\000\000\000\000\001-\001-\000\000\008\"\007\250\001-\000\000\000\000\000\000\007\234\007\178\001!\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\007\186\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\007\194\001!\007\242\001)\001)\001!\001)\008\026\000\000\007\210\000\000\000\000\001)\000\000\000\000\000\000\007\226\000\000\000\000\007\202\000\000\007\218\001)\000\000\001!\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\001!\001!\000\000\001!\007\250\001!\000\000\000\000\000\000\007\234\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\030\000\000\001\"\000\000\000\000\001&\000\000\000\000\000\000\000\000\000\000\001)\007\242\000\000\000\000\001)\000\000\000\000\000\000\007\210\000\000\001*\000\000\000\000\001.\000\000\000\000\000\000\000\000\000\000\001>\001B\000\000\001J\001)\t\222\001)\000\000\000\000\000\000\001R\000\000\001V\001)\001)\000\000\001)\007\250\001)\000\000\001Z\001^\000\000\n\206\001b\001f\001j\000\000\001n\001r\000\000\001v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\001~\000\000\000\000\000\162\001\030\000\000\001\"\000\000\000\000\001&\000\000\000\000\001\134\000\000\000\000\000\000\000\000\000\000\000\000\008>\000\000\001\138\008=\000\000\000\000\001*\000\000\000\000\001.\000\000\000\000\000\000\000\000\001\142\001>\001B\000\000\001J\001\146\000\000\000\000\008=\000\000\008=\001R\000\000\001V\001\150\000\000\000\000\000\000\000\000\000\000\001\154\001Z\001^\000\000\000\000\001b\001f\001j\000\000\001n\001r\000\000\001v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\001~\000\000\000\000\000\162\001\030\000\000\001\"\000\000\000\000\001&\000\000\000\000\001\134\000\000\000\000\000\000\000\000\000\000\000\000\008=\000\000\001\138\000\000\000\000\000\000\001*\000\000\000\000\001.\000\000\000\000\000\000\000\000\001\142\001>\001B\000\000\001J\001\146\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\001\150\000\000\000\000\000\000\000\000\000\000\001\154\001Z\001^\000\000\000\000\001b\001f\001j\000\000\001n\001r\000\000\001v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\001~\000\000\000\000\000\162\001\030\000\000\001\"\000\000\000\000\001&\000\000\000\000\001\134\000\000\000\000\000\000\000\000\000\000\000\000\014\186\000\000\001\138\000\000\000\000\000\000\001*\000\000\000\000\001.\000\000\000\000\000\000\000\000\001\142\001>\001B\000\000\001J\001\146\000\000\001\030\000\000\001\"\000\000\001R\001&\001V\001\150\000\000\000\000\000\000\000\000\000\000\001\154\001Z\001^\000\000\000\000\001b\001f\001j\001*\001n\001r\001.\001v\000\000\000\000\000\000\000\000\001>\004\226\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\001R\001z\001V\000\000\000\000\001~\000\000\000\000\000\162\000\000\001Z\001^\000\000\000\000\001b\001f\001j\001\134\001n\001r\000\000\001v\000\000\000\000\000\000\000\000\001\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001z\001\142\000\000\000\000\001~\000\000\001\146\000\162\001\030\000\000\001\"\000\000\000\000\001&\000\000\001\150\001\134\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\001\138\000\000\000\000\000\000\001*\000\000\000\000\001.\000\000\000\000\000\000\000\000\001\142\001>\001\130\000\000\001J\001\146\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\001\150\000\000\000\000\000\000\000\000\000\000\001\154\001Z\001^\000\000\000\000\001b\001f\001j\000\000\001n\001r\000\000\001v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001z\000\000\000\000\003\202\001~\000\000\000\000\000\162\003a\000\000\003a\000\000\000\000\003a\000\000\000\000\001\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\000\000\000\000\000\000\003a\000\000\000\000\003a\000\000\000\000\000\000\000\000\001\142\003a\003a\000\000\003a\001\146\000\000\000\000\000\000\000\000\000\000\003a\000\000\003a\001\150\000\000\000\000\000\000\000\000\000\000\001\154\003a\003a\000\000\000\000\003a\003a\003a\000\000\003a\003a\000\000\003a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\004!\000\000\000\000\000\000\000\000\003a\000\000\000\000\000\000\003a\000\000\000\000\003a\000\000\000\000\004!\000\000\000\000\000\000\000\000\000\000\003a\000\000\004!\004!\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\001\030\000\000\0012\004!\004!\0016\000\000\004!\000\000\003a\004!\000\000\000\000\004!\003a\000\000\004!\000\000\004!\004!\000\000\001*\000\000\003a\001.\000\000\000\000\000\000\000\000\003a\001:\001N\000\000\001J\000\000\000\000\000\000\000\000\000\000\004!\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\022\001^\000\000\000\000\003\026\001f\001j\004!\003\030\003\"\000\000\003&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\004!\003*\000\000\004\189\004!\003.\004!\000\000\000\162\000\000\000\000\001\030\000\000\0012\004!\000\000\0016\0036\004!\000\000\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\001*\004!\004!\001.\000\000\000\000\003:\000\000\000\000\001:\004\202\003>\001J\000\000\000\000\000\000\000\000\000\000\000\000\001R\003B\001V\000\000\000\000\000\000\000\000\001\154\000\000\000\000\003\022\001^\000\000\000\000\003\026\001f\001j\000\000\003\030\003\"\000\000\003&\000\000\000\000\000\000\000\000\001\030\000\000\0012\000\000\000\000\0016\000\000\000\000\000\000\000\000\000\000\003*\000\000\000\000\000\000\003.\000\000\000\000\000\162\000\000\000\000\001*\000\000\000\000\001.\000\000\000\000\0036\000\000\000\000\001:\0032\000\000\001J\000\000\000\000\001\030\000\000\006\202\000\000\001R\006\206\001V\000\000\000\000\000\000\000\000\000\000\003:\000\000\003\022\001^\000\000\003>\003\026\001f\001j\001*\003\030\003\"\000\000\003&\003B\000\000\000\000\000\000\006\210\008*\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001R\003*\001V\000\000\000\000\003.\000\000\000\000\000\162\000\000\006\234\001^\000\000\000\000\006\238\001f\001j\0036\006\242\006\246\000\000\006\250\000\000\000\000\000\000\000\000\001\030\000\000\006\202\000\000\000\000\006\206\000\000\000\000\000\000\000\000\006\254\007\002\003:\000\000\000\000\007\006\000\000\003>\000\162\000\000\000\000\001*\000\000\000\000\000\000\000\000\003B\007\014\000\000\000\000\006\210\006\214\001\154\000\000\000\173\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\007\018\000\000\006\234\001^\011\026\007\022\006\238\001f\001j\000\000\006\242\006\246\000\000\006\250\007\026\000\000\000\000\000\000\000\000\011\"\001\154\000\000\000\000\000\000\000\000\000\173\000\173\000\000\006\254\007\002\000\000\000\000\000\000\007\006\000\000\011B\000\162\001\030\011*\006\202\011:\000\000\006\206\000\000\000\000\007\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\011J\000\000\000\000\000\000\000\000\007\018\006\210\007\n\000\000\000\000\007\022\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\007\026\000\000\000\000\000\000\000\000\000\000\001\154\006\234\001^\000\000\000\000\006\238\001f\001j\000\000\006\242\006\246\011R\006\250\000\000\000\000\000\000\000\000\001\030\0112\t\226\000\000\000\000\t\230\000\000\000\000\000\000\000\000\006\254\007\002\000\000\000\173\000\000\007\006\000\000\000\000\000\162\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\007\014\000\173\000\173\t\234\t\246\000\000\000\000\011\018\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\007\018\000\000\n\n\001^\011\026\007\022\n\014\001f\001j\000\000\n\018\n\022\000\000\n\026\007\026\000\000\000\000\000\000\000\000\011\"\001\154\000\000\000\000\000\000\000\000\000\189\011j\000\000\006\254\n\030\000\000\000\000\000\000\n\"\000\000\011B\000\162\001\030\011*\t\226\011:\000\000\t\230\000\000\000\000\n*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\011J\000\000\000\000\000\000\000\000\n.\t\234\n&\000\000\000\000\n2\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\n6\000\000\000\000\000\000\000\000\000\000\001\154\n\n\001^\000\000\000\000\n\014\001f\001j\000\000\n\018\n\022\011R\n\026\000\000\000\000\000\000\000\000\001\030\0112\t\226\000\000\000\000\t\230\000\000\000\000\000\000\000\000\006\254\n\030\000\000\000\189\000\000\n\"\000\000\000\000\000\162\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\n*\011r\011Z\t\234\n>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\n.\000\000\n\n\001^\000\000\n2\n\014\001f\001j\000\000\n\018\n\022\000\000\n\026\n6\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\n\030\000\000\000\000\000\000\n\"\000\000\000\000\000\162\000\000\000\000\000\000\000\000\0002\0006\000F\000b\n*\000f\000\000\000j\000\134\007\169\000\138\017r\000\146\000\000\000\150\000\000\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\n.\000\000\000\000\000\000\000\000\n2\007\169\000\186\017v\000\000\000\000\000\000\000\000\000\000\n6\000\000\007\169\007\169\019\234\000\000\001\154\000\000\007\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\153\000\000\000\000\001\153\000\000\000\202\000\000\007\169\000\000\000\000\018V\000\000\007\169\000:\017\134\000:\007\169\007\169\001\153\000\206\000\000\000\000\001\153\000\000\007\169\000\000\000\000\000\000\007\169\007\169\000\000\000\000\000\000\001\153\000\000\000\000\000\000\001\153\007\169\001\153\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\169\001\153\000\000\000\000\001\153\000\000\001\153\000\000\000\000\007\169\000\000\000\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\169\000\000\017\138\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\153\000\000\000\000\000\000\007\169\000\000\000\000\007\169\007\169\000\000\000\000\007\169\000\000\000\000\000\000\000\000\007\169\007\169\000\000\005\129\000\000\007\169\005\129\000\000\001\153\003\166\005\129\001\153\005\129\000\000\000\000\001\153\000\000\005\129\005\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\153\000\000\000\000\000\000\000\000\001\153\001\153\000\000\000\000\000\000\000\000\003\174\000\000\000\000\000\000\001\153\001\153\001\153\000\000\007\169\0002\000\214\000F\000b\000\000\000f\000\000\000j\000\134\000\000\000\138\000\000\000\146\000\000\000\150\005\129\000\154\000\174\000\178\000\182\003\254\000\000\000\000\004N\000\218\000\000\000\000\007\169\000\000\000\000\000\000\000\000\000\186\000\000\000\000\007\169\000\000\000\000\004\006\007\169\007\169\000\000\002\t\000\190\000\000\000\000\000\000\000\000\000\000\007\169\000\000\000\000\000\000\004\014\000\000\000\000\000\000\002\t\000\000\004^\004f\000\000\000\000\000\000\000\202\000\000\000\000\000\000\007\169\004.\000\230\000\000\004\022\005\129\004&\000\000\000\000\000\000\000\206\000\000\000\000\000\000\007\169\011\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0046\000\000\000\000\000\000\000\000\000\000\011\026\007\169\000\000\000\000\007\169\007\169\002\t\000\237\000\000\000\000\000\237\000\000\000\000\007\169\007\169\011\"\000\000\000\162\007\169\000\000\000\000\000\177\000\177\000\000\000\000\004\006\000\000\000\000\000\000\000\237\004>\011B\000\000\002\t\011*\000\234\011:\004\030\000\000\000\000\004\014\000\000\000\000\000\000\000\237\000\000\000\237\000\237\000\000\002\t\000\000\000\000\000\000\000\000\002\t\002\t\004.\011J\011Y\004\022\000\000\004&\000\000\000\000\004n\004F\002\t\000\000\000\000\000\000\000\213\000\000\000\000\000\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0046\000\000\000\000\000\000\000\000\000\000\000\213\000\000\000\000\000\000\000\213\011R\000\237\000\000\000\000\000\000\000\000\000\000\0112\000\000\000\000\004\014\000\000\000\000\000\000\000\213\000\000\000\213\000\213\000\205\000\177\000\000\000\205\000\000\000\000\000\000\004>\000\213\000\000\000\237\004\022\000\000\004&\004\030\000\000\000\177\011Z\000\205\000\000\000\000\000\000\000\205\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\237\000\237\000\205\000\213\000\000\000\000\000\205\000\000\000\205\000\205\000\237\004F\000\237\000\000\000\000\000\213\000\000\000\000\000\205\000\000\000\000\004\022\000\000\000\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\000\000\000\000\209\000\000\000\000\000\000\000\213\000\000\000\000\000\213\000\000\000\205\000\000\004\030\000\000\000\000\000\000\000\209\000\000\000\000\000\000\000\209\000\000\000\205\000\000\000\213\000\000\000\000\000\000\000\000\000\213\000\213\000\209\000\000\000\000\000\000\000\209\000\000\000\209\000\209\000\213\000\213\000\213\000\000\000\000\000\000\000\000\000\205\000\209\000\000\000\205\004\022\000\000\000\209\004\030\000\225\000\000\000\000\000\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\205\000\000\000\000\000\000\000\000\000\205\000\205\004\006\000\209\000\000\000\000\000\225\000\000\000\000\000\000\000\205\000\205\000\205\000\000\000\000\000\209\000\000\004\014\000\000\000\000\000\000\000\225\000\000\000\225\000\225\000\000\000\000\000\000\000\000\000\217\000\000\000\000\000\217\000\225\000\000\000\000\004\022\000\000\004&\000\209\000\000\000\000\000\209\000\000\000\000\000\000\004\030\004\006\000\000\000\000\000\000\000\217\000\000\000\000\000\000\000\000\000\000\000\000\000\209\0046\000\000\000\000\004\014\000\209\000\209\000\000\000\217\000\000\000\217\000\217\000\000\000\225\000\000\000\209\000\209\000\209\000\000\000\000\000\217\000\000\000\000\004\022\000\000\004&\000\000\000\221\000\000\000\000\000\221\000\000\000\000\000\000\000\000\000\000\000\000\000\225\000\000\000\000\000\225\000\000\000\000\000\000\004\030\004\006\000\217\000\000\000\000\000\221\000\000\000\000\000\000\000\000\000\000\000\000\000\225\000\000\000\217\000\000\004\014\000\225\000\225\000\000\000\221\000\000\000\221\000\221\000\000\000\000\000\000\000\225\000\225\000\225\000\000\000\000\000\221\000\000\000\000\004\022\000\000\004&\000\217\000\000\000\000\000\217\000\000\000\000\000\000\004\030\000\229\000\000\000\000\000\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\217\0046\000\000\000\000\000\000\000\217\000\217\004\006\000\000\000\000\000\000\000\229\000\000\000\221\000\000\000\217\000\217\000\217\000\000\000\000\000\000\000\000\004\014\000\000\000\000\000\000\000\229\000\000\000\229\000\229\003\254\000\000\000\000\000\245\000\000\000\000\000\000\000\221\004.\000\000\000\221\004\022\000\000\004&\004\030\000\000\000\000\000\000\004\006\000\000\000\000\000\000\000\245\000\000\000\000\000\000\000\221\000\000\000\000\000\000\000\000\000\221\000\221\004\014\0046\000\000\000\000\000\245\000\000\000\245\004f\000\221\000\221\000\221\000\000\000\000\000\229\000\000\000\000\004.\000\000\000\000\004\022\000\000\004&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\254\000\000\000\000\000\233\000\000\000\000\000\000\004>\000\000\000\000\000\229\000\000\0046\000\000\004\030\000\000\000\000\000\000\004\006\000\000\000\000\000\000\000\233\000\000\000\245\000\000\000\229\000\000\000\000\000\000\000\000\000\229\000\229\004\014\000\000\000\000\000\000\000\233\000\000\000\233\000\233\000\229\000\229\000\229\000\000\000\000\000\000\000\000\004>\004.\000\000\000\245\004\022\000\000\004&\004\030\003\254\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\245\000\000\000\000\000\000\000\000\000\245\000\245\004\006\0046\000\000\000\000\000\241\000\000\000\000\000\000\004n\004F\000\245\000\000\000\000\000\233\000\000\004\014\000\000\000\000\000\000\000\241\000\000\000\241\004f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004.\003\185\000\000\004\022\003\185\004&\004>\000\000\003\185\000\233\003\185\000\000\000\000\004\030\000\000\003\185\003\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\233\0046\000\000\000\000\000\000\000\233\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\233\004F\000\233\000\000\002-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\185\000\000\004>\000\000\000\000\000\241\000\000\000\000\000\000\004\030\000\000\000\000\002-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002-\000\241\000\000\000\000\002-\002-\000\241\000\241\000\000\000\000\000\000\000\000\000\000\000\000\002-\000\000\000\241\004F\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002-\0002\005.\000F\000b\003\185\000f\000\000\000j\000\134\000\000\000\138\000\000\000\146\002-\000\150\000\000\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\186\002-\000\000\000\000\002-\002-\000\000\000\000\000\000\000\000\000\000\000\190\000\000\002-\002-\000\000\000\000\000\000\002-\000\000\000\000\0002\000\214\000F\000b\000\000\000f\000\000\000j\000\134\000\000\000\138\000\202\000\146\000\000\000\150\000\000\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\000\206\000\000\000\000\000\000\0052\0056\000\000\000\186\000\000\0002\005.\000F\000b\000\000\000f\000\000\000j\000\134\000\190\000\138\000\000\000\146\000\000\000\150\000\000\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\000\000\186\000\000\000\000\000\000\000\230\000\000\000\000\000\000\000\000\000\000\000\000\000\190\000\206\000\000\000\000\000\000\000\000\005:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\000\000\000\000\000\000\000\002y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\206\000\000\000\000\000\000\021\182\0056\000\162\000\000\000\000\0002\005.\000F\000b\000\000\000f\000\000\000j\000\134\000\000\000\138\000\000\000\146\000\000\000\150\000\234\000\154\000\174\000\178\000\182\000\000\000\000\000\000\0002\000\214\000F\000b\000\000\000f\000\000\000j\000\134\000\186\000\138\000\000\000\146\000\000\000\150\002)\000\154\000\174\000\178\000\182\000\190\000\000\000\000\000\000\000\000\000\000\021\186\000\000\000\000\000\000\000\000\000\000\000\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\000\000\190\000\000\000\000\002q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\206\000\000\000\000\000\000\0052\0056\000\000\000\000\000\000\000\202\000\000\000\000\011\018\000\000\000\000\000\230\000\000\0002\005.\000F\000b\000\000\000f\000\206\000j\000\134\000\000\000\138\000\000\000\146\011\026\000\150\000\000\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\"\000\000\000\000\000\000\000\186\000\000\000\185\011j\000\000\000\000\000\000\000\000\000\000\005B\000\000\000\190\011B\000\000\000\162\011*\000\000\011:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\000\000\000\000\000\000\000\000\000\011J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\206\000\000\000\000\000\000\021\182\0056\000\000\000\000\000\000\002!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011R\000\000\000\000\000\000\000\000\000\000\000\000\0112\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\194\000\000\000\000\000\000\000\185\011Z"))
+    ((16, "\001\146\000\006\000\000\000\000\000\241\000\000\000\000\000\000\001\146\000\000\002B)\234\000\000\000[B\146\000\000\000\000\025x\000\000\029\170\000\000\000\000\000\000\000\000\000\000\000\000\0266\000\000\030h\000\000\000\000\000\000\000\000\000\000\031&\000\000\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\000L\000\000)\234\031\228\028\224\000\176C\218\000\000\000\000\000\000D\170\001\140\028\224\001J\028\224\000\000\001\030\000\000\028\224\000\000\000\133\001\2348\246\000\000\000\000:\252\000\000=f\000\000=\2388\2468\246\018^\018^=f\018^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000;\1328\246\000\000\000\000;\132\000\000;\132\000\0008\246\000\000\000\000\000\000\020\196\000\133\000\000\018^\000\0000P8\246\02708\246\000\000\000\000\000\000\000\000\000\000\000\000 28\246!*8\246!\1548\246\"\1468\246\000\0008\246\000\0008\246#\0028\246#\2508\246$j8\246%b8\246%\2108\246\001^8\246\000\000\000\000\000\000\000\000\000\0008\246&\2028\246':8\246(28\246\000\000\000\0008\246\000\000\000\000\017\244*f\000\000\000\000\001X\000\000\000\000\000\000\000\000\025F\000[\000\000*\014\000\000\000\179\018^\000\0008\246\001\170\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000\000\001\176\000\000\000\000\002h\000\000\002\252=f\000\000\000\000\000\000\000\000\000\000\000\000>\1508\246\000\000>\150\000\000>\150=f\000\000\000\000/6\000\133\000\000\018^\003\006\000\0008\246\003,\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000C\0228\246\000\0008\246\000\000\000\000\0034\000\000\000G<,\004\0068\246\004\004\000\000\000\000=f\000G\000\000\000\000\000\000\000\000\000\000D\236=fEB=fE\246=fFL=f\000\000=f\000\000=fG\000=fGV=fH\n=fH`=fI\0208\246\003\210=f\000\000=fIj=fJ\030=fJt\003\194\000\000\003\212\000\000\000\1358\246\000\000\000\135\000\000\000\000\000\210)\234\000\000\000\210\000\000\000\000\003\2308\246\000\000\003\234\000\000\018^\003\254\000\000\000\000\005d\000\000\018^\004\160\000\000\000\000\004\228\000\000\000\000\001\234\000\000\005\204\000\000*fJ\248\005\174\005\160\000\133\005\004\005\214K\218\000\176\000\000\000\000\000tM$\000\000\000\000\000\000\005\224\005\216\0026\005\238K\218\001\030K\218\000\000\000\000\000\031\000\000\000\000\005:\000\000\005@\006\012K\218\005^\000\000\000\000\000t\000\000\005b\006>\000\000MhL\130\000\000\000\133\006F\000\000\025F\000\133\006L\000\000\000\000)\008\028\224\005n\000\000\006\006\000\000\005\160\000\000\000\t)\234\000\000)\234\000\000\005\144\000\000\000\t\000\000\016\030\026X\006fK\218\005\180\006\144\000\000N\182\000[\000\000\003\210\004B)\234\005\186\000\000\000i\000\000\001z\000\000\006\150\000\000\000\000;\192\000[\000\000\000i\000\000\000\000\000\000\000\000\000\000\006\1288\246\005\202\019\012\006\1368\246\005\210\006\134\000\136\005\254\006\182\000\000?\142?\224\018^\005\218\000\000\005\220?\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\1628\246\000\000@\162\000\000@\162?\224\000\000\000\000\024\154\000\133\000\000\018^\005\224\000\0008\246\005\224\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000,\0068\246\000\0008\246\000\000\005\232\000\000\000\135\000\000\000\000\000\000\000\000\000\0000\174?\2241\166?\2242\022?\2243\014?\224\000\000?\224\000\000?\2243~?\2244v?\2244\230?\2245\222?\2246N8\246\006\024?\224\000\000?\2247F?\2247\182?\2248\174\018^\005\248\000\000\000\0008\246\000\000\006\216\000\000\001V\006\1768\246\006|\000\000\006\1828\246\006\134\000\000\001:\000\000\006\182\006\182\001V\000\000\001V\000\000\016\030\006\182\006\182\000\000\000\000\000\000\023\162\000\000\000\000\000\000\000\000\006\2148\246\006\030\019\012\019\218\000\133\006\250\000\000\006\2269\204\007\n9\204\007\0208\246\006>\019\012\019\012\001J\001L\000\133\000\000\000\000\000\000\001L\000\000\001\236\001\012\000\000\000\000\006D\000\000\000\000\000\000\007 \000\000\007\"\000\000\000\000\007V\007\n8\246\006R\0074\000\000<\182\007\022\018^\006j\019\012\000\000\000\000\006\148\000\000\0012\000\000\005^\000\000\001V\000\000\000\000\006\230\000\000\021\164\026X\007.K\218\006|\007Z\000\000\000\133\000\000\003\0128\246,N\000\000@\2448\246\006\132\000\000\018^\006\136\000\000\006\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\1828\246\000\000A\182\000\000A\182B\008\018^\006\140B\008\000\000\000\000M\198\000\133\000\000\018^\006\144\000\0008\246\006\142\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\246\000W8\246\006\146\000\000\000\000-\028+6\007F8\246\000\000\007\016\000\000\000\000\000\133\000\000\000\000\006\208,N\000\000\006\208,N\000\000\000\004\000\000\000\000\030\144B\008:\026B\008<\246B\008A\000B\008\000\000B\008\000\000B\008NrB\008N\164B\008N\252B\008O<B\008OlB\008O\190B\008O\238B\008P\016\000\000\006\166\000\000\006\182-\196\000\000.l\006\194.l/~\006\204.l\000\000\000\000\000\000\000\000\000\000\006\196\000\000\007\166\000\000\000\133\000\000\000^\007\194\000\000\000F\007\148\000\133\007\000\007\188K\218\007\004\000\172\000\0008\246\007\226\000\000\000,\000\166\003\252\007\196K\218\007\012\007\232\000\000\003\1568\246\007\234\000\000\007\238\000\000\025F\000\133\003\2268\246\007\248\000\000\007\252\000\000\012\022\000K\000\000\012\022\000\000\000\000\021\188\004\0048\246\007\254\000\000\008\004\000\000\000\000\001\168\007\212\000\133\0076\007\242K\218\007:\002\200\000\0008\246\008\022\000\000\003\246\000\000\000\000\008\014\000\000\012\022\000\000\007\248\018^\007B\008*\000\000\000,\000\000\008\016K\218\007Z\0088\000\000\004d8\246\008:\000\000\008<\000\000\025F\000\133\004\1868\246\008>\000\000\008B\000\000\000\000\000\000\008\014\000\000\000\000\0012\000\000\006\182\000\000\000,\000\000\000\000\000\236\019\218\000\000\000\236\000\000\000\000\007n\000\000\001\182\000\003\019\012\000\000\004\006\000K\004\006\000\000\0012\000\000\006\182\000\000\006\182\000\000\000\000\000\000\007n\000\000\000\000\007x\000\000\002*\005^\0012\004\006\000\000\000\000\000\000\0012\000\000\006\182\000\000\002*\000\000\000\000\000\238\000\015\016\030\000\000\016\218\000\000\tf\016\030\000\000\000\000\tf\000\000\000\000\007~\000\000\000\000\007\148\000\000\002\166\006\182\000\000\002\166\000\000\000\000\008\n\000\000\0012\000\000\006\182\000\000\000\000\000\000\017j:T\000\000\008p\000\000\017j\008v\000\000\008x\000\000\021\164\000\133\002\216\000\0008\246\008z\000\000\008\\\008L\000\133\007\166\008bK\218\007\170\004F\000\0008\246\008\134\000\000\000,\004H\000\0008\246\008\140\000\000\025F\000\133\004\158\000\0008\246\008\142\000\000\003\022\017j\000\000\021\188\004\196\000\0008\246\008\156\000\000\000\000\000\000\008\134\008v\000\133\007\214\008\146K\218\007\218\004\228\000\0008\246\008\182\000\000\003\014\000\000\008\158\018^\007\232\008\196\000\000\003\018\000\000\005.\000\0008\246\008\200\000\000\025F\000\133\005^\000\0008\246\008\202\000\000\003\022\000\000\000\000\007\244\000\000\003\014\007\214\008n\000\000\000\000\000\000\008r\000\000\002\150\001:\000\000\016\030\008\200\000\000\000\0008\246\008*\006\182\000\000\008\000\000\000\000\136\000\000\000\000\001R\016\030\000\000\016\030\000\000\007\240\000\000\001R\000\000=f\003\134=f\000\000=f\000\000\007\242\000\000\003\134\000\000\019\012\0046\019\012\000\000\019\012\000\000\007\244\000\000\0046\000\000=f\003\134\007\248\000\000?\152\000\133\004D?\152\000\000?\152\000\000\007\250\000\000\004D\000\000=f\003\134\007\254\000\000\000\000\022\220\000\000\000\000\008l\n\226\000\000\000\000\008F\000\133\000\000\000\000\000\000\000\000\002\028\n\226\000\000\002~\t\024\000\000\000\000\000\000\008\188\000\000\000\000\000\000\000\000\027\024\028\136\000\000\006\018\000\000\n\226\000\000\004\144\n\226\000\000\000G\000J\000J\000\000\002N\000J\000\000\008>\000\000\000\000\000\000\000\000\008\208\000\000\029\024\000\000)\234\n\226\000\000\004\224\n\226\000\000\008\210\000\000\n\226\008\212\000\000\011B\011\174\008\214\000\000\008\216\000\000\012:\022\022\n\226\008\\\n\226\008\222\000\000\008\224\000\000\008\228\000\000)\234\000\000\004t)\234\000\000\008f\013\178\000\000\000\004\n\226\000\000\005\022\n\226\000\000\0030\004*\000\133\000\000\001(\000\133\000\000\008n\000\000\000\000\000\000\000\000\008\242\000\000\013B\027f\008\246\000\000\008\248\000\000\n\226\t\004\000\000\n\226\t\006\000\000\n\226\t\008\000\000\n\006\018\226\n\226\008\138\n\226\t\012\000\000\t\014\000\000\000\000\005&\n\226\000\000\0050\001z\001z\000\000\000\000\000\000\005\030\001z\000\000\008\142\000\000\000\000\000\000\000\000\n\226\000\000\005@\n\226\000\000\005^\004H\000\133\008\144\000\000\000\000\000\000\000\000\t\022\000\000\t\024\000\000\n\226\t\030\000\000\014\"\027f\t \000\000\t\"\000\000\023l\008\204\008\252\020Z\n\226\t.\000\000\000\000\t2\000\000\t\004\023l\n\226\t6\000\000\n\226\t8\000\000\t<\000\000\012\202\008\192\n\226\tH\000\000\tJ\000\000\000\133\008\190\000\000\000\000\022\220\000\000\000\000\002N\t\170\000\000\000\000\001\023\000\000\000\000\000\0008\246\000\171\t\248\t\024\t\162=f\000\000\002\140=f\000\000\008\236\000\000\000\000\000\000\000\000\000\000\002\174\000\000\001\024\000\000\000\000\000\000\004\006\024\130\005\158\024\130\024\130\005\158\000\000\000\000\000F\000F\000F\000F\000\000\000\000\000\000\000\000\000\000\000\000\001V\016\030\t\186\013n\000K\000\000\000\000\003\246\000\000\008\014\000\000,N\008\240\000\000\001V\016\030\008\246\014\198\000\000\001V\013n\000\000\000\000\000\000\021\164\000F\000\000\000\171\000\000\000\000\t>\0014\t\182L\186\000\000\002DM\252\000\000\000\000\t\184\t\168\000\133\000\000\000\133\000\000\002D\000\000\005TL\186\000\000\000\000\t\002\t\200\006\182\t\020\000\000\001\168\003\246\000\000\008\014\000\000\003\138\004\130\000\000\000\000\t\188\000\000\000\000\002N\000\000\004\182\000\000\000\000\000\0008\246\000\171\000\000\002\174\000\000\004\212\000\000\000\000\000\000\005^\000\000\n\190\004\130\n\190\000\000\006\182\n\190\000\000\006\166\000\000\006\182\000\000\006\182\000\000\006\182\000\000\000\000\000\000\000\000\000\000\000\171\000\000\006\182\000\000\006\166\000\000\006\182\000\000\006:\000\000\000\000\tf\tJ\000\133\004t\t\242\003(\000\000\003(\n\028\000\000\n\030\000\000\n \000\000\000\000\004`\003(\025\162\003(\000\000\000\000\003z\t*\000\000\tf\000\133\t0\000\000\007\254\n,\000\000\007f\006*\nD\002\128\nD\000\000\000\000\0050\000\133\000\000\002L\t\148\000\000\000\000\000\000\002\232\000\000\tH\000\000\000\000\000\000\t\136\000\133\tR\000\000\000\000\007\254\007f\006*\0050\002L\002\232\tT\000\000\007f\006*\0050\002L\002\232\tX\000\000\000\133\000\000\nX\nV\t\152\000\133\t\242\000\000"), (16, "\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\004\138\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\008J\002\146\000\158\006\029\011\t\005\133\020\159\020\163\000:\008~\011\t\020\167\011\t\011\t\011\t\017\214\007}\011\t\000\n\006\002\006\142\011\t\011\t\006\146\011\t\000\023\000\027\021&\020\178\006\150\008J\007}\000\162\011\t\006\154\021*\011\t\011\t\000\014\008~\006m\011\173\011\t\011\t\002\202\011\t\005\133\011\t\003\141\n\166\013\006\t\n\011\t\000\158\011\t\011\t\011\t\011\t\011\t\017^\006=\006=\011\t\011\t\011\t\006=\011\t\011\t\011\t\005\245\011\t\011\t\011\t\011\t\n\174\n\157\011\173\011\t\011\t\011\230\t\158\007}\003\198\000\162\006\n\017\218\001^\011\t\011\t\011\t\012\022\001j\011\t\011\t\011\t\011\t\n\186\011\t\006m\011\t\013~\0085\011\t\006\029\018\166\011\t\011\t\000\194\011\173\011\173\t\158\004\197\011\t\011\173\012\002\013\174\011\t\005\173\007i\011\t\000\162\n\222\007i\011\t\011\t\011\t\011\t\004)\011\t\011\t\004\197\007}\005\133\011\t\011\t\011\t\000\198\011\t\003\217\011\t\011\t\000\218\011\t\007}\011\t\011\t\005\197\013\006\011\t\011\t\006%\006%\006%\006%\006%\006%\006%\006%\006%\006%\006%\004\162\006%\006%\006%\006%\006%\006%\006%\006%\006%\006%\n\189\008r\013\138\004\162\006%\008N\008^\008n\011\206\t\146\006%\001^\006%\006%\006%\012\022\001j\006%\008J\005>\016\130\006%\006\194\005\165\006%\006\142\004\197\008~\006\146\012\006\000\158\016Z\021&\006%\006\150\008v\005\149\004\013\000\006\006\154\021*\000\250\006%\006%\004\197\000\162\001^\006%\006%\002e\001f\001j\006%\002e\006%\006%\006%\006%\006%\011\173\000\162\000\158\006%\006%\006%\019j\006%\006%\006%\005\237\006%\006%\006%\006%\006j\t\146\000\242\006%\006%\t\002\000\162\n\189\006\021\005\237\012\166\016\138\n\189\n\189\006%\006%\014\170\000\162\006%\006%\006%\006%\014\174\006%\t\158\006%\014\178\005\141\006%\004\138\005f\006%\006%\019n\002\145\018\206\t\002\001\006\006%\020\247\020\251\000\162\n\189\004\013\020\255\006%\001\026\002F\n\189\006%\006%\006%\006%\t\006\006%\006%\003\021\005\181\016.\006%\006%\006%\006E\002\162\006E\006%\006%\006E\006%\003\217\006%\006%\023\190\005\221\006%\006%\006E\006E\006E\006E\006E\006E\006E\006E\006E\006E\006E\013\254\006E\006E\006E\006E\006E\006E\006E\006E\006E\006E\n\133\n\237\005\189\005\189\006E\020\142\006E\000\158\002\218\002\254\006E\005\245\006E\006E\006E\006E\005\141\006E\006E\006E\006E\006E\006E\006E\006E\006E\000.\006\"\016\162\016\202\016\242\017\002\017.\006E\005\141\t\"\006E\000\162\005\141\003\025\012\194\006E\006E\006E\006E\006E\006E\006E\014\230\006E\nA\014~\006E\020\142\006E\023\198\006E\006E\006E\017z\003\165\023\202\006E\006E\006E\n\141\006E\006E\006E\005\253\006E\006E\006E\006E\n\157\015\186\005Z\015\214\006E\021\218\006E\n\133\023.\005\157\017\230\006E\n\133\n\133\006E\006E\017\134\n\181\006E\006E\006E\006E\003\165\006E\n\133\006E\006E\003\n\006E\004\138\0232\006E\006E\015^\nA\023\162\003=\0236\006E\001^\018\190\020\202\006E\012\022\001j\006E\016B\n\165\n\133\006E\006E\003=\006E\012\198\006E\006E\016\170\006\005\000J\006E\000N\014\234\000V\013\006\023\210\006]\006E\023V\006E\000Z\006E\006E\n\157\000\162\006E\006E\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\t\218\000\146\021\006\000\150\006\150\000\154\000\174\000\178\000\182\006\154\021\014\023>\001^\005)\003\018\006\158\012\022\001j\011\206\003f\n\157\000\186\005\245\001\030\006\174\006\202\006\013\000n\006\206\000r\t\146\000z\000\190\004\193\016\178\008:\006]\n\157\000~\008J\003r\000^\023F\003\190\001*\003=\000\162\021J\008~\004%\003=\003=\004\193\008\146\006\214\021v\021\130\016\210\008\150\013\186\003\206\007A\003=\001R\017\014\001V\003\233\000\206\t\154\008\158\015\022\015.\0126\006\234\001^\008\162\018\194\006\238\008\166\001j\011\173\006\242\006\246\008\170\006\250\n\157\003=\003\214\023^\008\174\011\206\019\182\022G\007A\007A\023V\005\213\000\130\007A\006\254\007\002\022K\004V\008\178\008\182\007\006\008\186\012V\000\162\008J\008\206\022N\004z\003\197\015J\011\173\008\218\007\014\008~\t\158\004\193\004\130\016\218\006M\012\138\011\206\000\162\021\150\n\157\017\022\008\250\004\186\004\198\015n\008\254\t:\003\233\t\166\004\193\007\018\t>\000\162\011\206\004\210\007\022\003\233\003\233\011\173\011\173\015\166\003\233\tF\011\173\007\026\n\229\006M\006M\015\026\0152\001\154\006M\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\013\"\000\146\021\006\000\150\006\150\000\154\000\174\000\178\000\182\006\154\021\014\0065\005\229\008]\015\222\006\158\023&\t\158\011\206\005\205\023f\000\186\n\197\001\030\006\174\006\202\018\142\005\133\006\206\015N\005\133\023^\000\190\n\149\005\133\008:\005\133\019f\015\250\0039\017\202\005\133\005\133\013B\001*\008]\008]\008J\015r\n\213\008]\004\222\004\234\008\146\006\214\021v\008~\n\205\008\150\014\002\019\178\011\206\006U\001R\015\170\001V\003\249\000\206\t\154\008\158\n\221\022g\022k\006\234\001^\008\162\022o\006\238\008\166\001j\018\"\006\242\006\246\008\170\006\250\006e\022\139\022\143\004\246\008\174\0089\022\147\0065\005\n\005\026\002\146\005\030\0065\0065\006\254\007\002\015\226\005&\008\178\008\182\007\006\008\186\018\178\000\162\023\178\008\206\019~\0089\003\197\005*\019Z\008\218\007\014\n\173\005R\006U\023\154\0089\006u\005V\015\254\005^\t\158\019\166\005\130\008\250\017\186\005\138\0065\008\254\t:\006-\t\166\022\n\007\018\t>\005\142\002\133\006e\007\022\005\133\003\249\005\150\013\006\005\170\005\174\tF\0089\007\026\005\198\006u\006u\005\214\005\234\001\154\006u\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\005\242\000\146\021\006\000\150\006\150\000\154\000\174\000\178\000\182\006\154\021\014\005\250\001^\006\023\006.\006\158\012\022\001j\0066\006:\006Z\000\186\006r\001\030\006\174\006\202\0089\006\162\006\206\006\170\t\146\006\178\000\190\006\186\006\190\008:\006\198\006\222\006\230\008J\007>\0089\007J\007\146\001*\006-\000\162\008J\008~\008\n\006-\006-\0082\008z\006\214\008F\008~\008R\008\150\008Z\008b\008\149\006-\001R\008j\001V\004\021\000\206\008\154\008\158\008\190\008\198\008\214\006\234\001^\008\162\008\222\006\238\008\166\001j\008\230\006\242\006\246\008\170\006\250\008\238\006-\008\246\011\181\008\174\t2\tB\tJ\008\149\008\149\tV\tZ\tb\008\149\006\254\007\002\tf\tr\008\178\008\182\007\006\008\186\0039\000\162\tz\008\206\t\138\t\174\003\197\t\190\008]\008\218\007\014\t\198\t\158\t\202\t\242\0039\008e\t\254\n\006\nF\t\158\nf\nr\008\250\n\182\n\202\n\214\008\254\t:\004\021\t\166\n\238\007\018\t>\n\250\011\130\011\138\007\022\004\021\004\021\008]\008]\011\154\004\021\tF\008]\007\026\011\166\008e\008e\011\194\011\202\001\154\008e\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\011\222\000\146\011\234\000\150\006\150\000\154\000\174\000\178\000\182\006\154\015\214\003\177\011\242\011\246\011\254\006\158\012\014\012\"\012*\012.\012>\000\186\012F\001\030\006\174\006\202\003\177\012^\006\206\012f\012\146\0039\000\190\012\154\012\170\008:\0039\0039\004\162\012\178\012\182\012\190\012\206\012\242\001*\012\250\001^\008J\0039\023&\012\022\001j\012\254\008z\006\214\013\014\008~\013\022\008\150\013\026\013*\0132\013J\001R\013R\001V\013\162\000\206\008\154\008\158\013\234\013\246\0039\006\234\001^\008\162\014j\006\238\008\166\001j\000\162\006\242\006\246\008\170\006\250\014v\014\150\014\194\011\181\008\174\014\206\014\214\014\242\014\250\014\254\015\006\015\n\015\018\015\"\006\254\007\002\015:\015V\008\178\008\182\007\006\008\186\003\177\000\162\015z\008\206\023\138\003\177\003\177\015\138\015\142\008\218\007\014\005\237\015\150\015\154\015\162\015\178\011\181\003\177\003\177\015\194\t\158\015\202\015\206\008\250\015\234\016\006\016\026\008\254\t:\016*\t\166\016:\007\018\t>\016R\016b\016n\007\022\016\151\016\191\016\231\003\177\016\255\017#\tF\017;\007\026\017R\011\181\011\181\017b\017\138\001\154\011\181\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\017\155\000\146\017\242\000\150\006\150\000\154\000\174\000\178\000\182\006\154\018\007\018/\018;\018K\018S\006\158\018f\018o\018w\003\177\018\127\000\186\018\154\001\030\006\174\006\202\018\218\018\239\006\206\018\255\019\007\023\026\000\190\007\133\003\177\008:\019\019\019\031\019+\019>\019G\019O\019\138\019\190\001*\019\211\019\219\008J\007\133\019\231\019\247\019\255\020\n\008z\006\214\020\014\008~\020\027\008\150\020'\020.\020;\020G\001R\020O\001V\020Z\000\206\008\154\008\158\020c\020k\020w\006\234\001^\008\162\020\146\006\238\008\166\001j\0192\006\242\006\246\008\170\006\250\020\182\020\186\020\190\020\214\008\174\021V\021~\021\142\021\198\021\206\021\234\021\238\022\026\007\133\006\254\007\002\023v\017Z\008\178\008\182\007\006\008\186\022\030\000\162\022&\008\206\023\134\017^\022S\023\030\003\177\008\218\007\014\023\230\023\138\003\177\003\177\023*\023:\023B\023J\023s\t\158\023z\023\131\008\250\023\142\003\177\003\177\008\254\t:\023\158\t\166\023\194\007\018\t>\023\219\017j\000:\007\022\023\234\023\243\024\023\007\133\0243\024B\tF\024F\007\026\024J\024S\003\177\000\000\000\000\001\154\007\133\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\021\006\000\150\006\150\000\154\000\174\000\178\000\182\006\154\021\014\000\000\000\000\000\000\000\000\006\158\000\162\000\000\017V\000\000\000\000\000\186\000\000\001\030\006\174\006\202\000\000\000\000\006\206\000\000\000\000\017n\000\190\000\000\000\000\008:\000\000\000\000\000\000\000\000\017Z\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\017^\000\000\000\000\008\146\006\214\000\000\000\000\000\000\008\150\022\162\000\000\000\000\000\000\001R\000\000\001V\018B\000\206\t\154\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\017j\006\242\006\246\008\170\006\250\000\000\000\000\000\000\017Z\008\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017^\006\254\007\002\000\000\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\000\000\003\197\000\000\000\000\008\218\007\014\000\000\000\000\017V\000\000\000\000\008I\000\000\000\000\000\162\000\000\017j\000\000\008\250\000\000\000\000\000\000\008\254\t:\000\000\t\166\000\000\007\018\t>\017n\017Z\000\000\007\022\000\000\000\000\000\000\000\000\000\000\000\000\tF\017^\007\026\000\000\008I\008I\000\000\000\000\001\154\008I\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\162\000\150\006\150\000\154\000\174\000\178\000\182\006\154\017j\000\000\000\000\000\000\000\000\006\158\000\000\017n\018Z\000\000\000\000\000\186\000\000\001\030\006\174\006\202\000\000\000\000\006\206\000\000\000\000\000\000\000\190\n!\000\000\008:\000\000\000\000\000\000\000\000\017Z\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\017^\000\000\000\000\008\146\006\214\000\000\000\162\000\000\008\150\012n\000\000\000\000\000\000\001R\000\000\001V\000\000\000\206\t\154\008\158\000\000\017n\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\017j\006\242\006\246\008\170\006\250\000\000\000\000\000\000\011\145\008\174\017V\n!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\007\002\000\000\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\017Z\000\000\000\000\000\000\008\218\007\014\000\000\000\000\000\000\000\000\017^\011\145\000\000\000\000\000\162\000\000\000\000\000\000\008\250\000\000\000\000\000\000\008\254\t:\000\000\t\166\000\000\007\018\t>\017n\000\000\000\000\007\022\000\000\000\000\020V\000\000\000\000\017V\tF\017j\007\026\000\000\011\145\011\145\000\000\000\000\001\154\011\145\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\017Z\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\017^\000\000\000\000\000\000\000\000\006\158\000\000\000\000\000\000\000\000\000\000\000\186\000\000\001\030\006\174\006\202\000\162\000\000\006\206\000\000\000\000\000\000\000\190\000\000\005\133\008:\000\000\000\000\000\000\000\000\018\246\017n\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\146\006\214\000\000\005\133\000\000\008\150\021Z\000\000\000\000\000\000\001R\000\000\001V\005\133\000\206\t\154\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\000\000\006\242\006\246\008\170\006\250\000\000\000\162\000\000\000\000\008\174\017V\005\133\000\000\000\000\000\000\000\000\005\133\002\146\000\000\006\254\007\002\017n\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\017Z\000\000\000\000\000\000\008\218\007\014\000\000\000\000\000\000\000\000\017^\011\221\000\000\000\000\000\000\000\000\000\000\000\000\008\250\000\000\000\000\000\000\008\254\t:\000\000\t\166\000\000\007\018\t>\000\000\005\133\000\000\007\022\000\000\000\000\000\000\000\000\000\000\000\000\tF\019\238\007\026\000\000\011\221\011\221\005\133\000\000\001\154\011\221\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\000\000\000\000\000\000\000\000\000\000\006\158\000\000\000\000\000\000\000\000\000\000\000\186\000\000\001\030\006\174\006\202\000\162\000\000\006\206\000\000\000\000\000\000\000\190\000\000\000\000\008:\000\000\000\000\000\000\000\000\000\000\017n\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\146\006\214\000\000\000\000\000\000\008\150\021Z\000\000\000\000\000\000\001R\000\000\001V\000\000\000\206\t\154\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\000\000\006\242\006\246\008\170\006\250\000\000\000\000\000\000\000\000\008\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\007\002\000\000\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\000\000\000\000\000\000\000\000\008\218\007\014\000\000\000\000\000\000\000\000\000\000\011\217\000\000\000\000\000\000\000\000\000\000\000\000\008\250\000\000\000\000\000\000\008\254\t:\000\000\t\166\000\000\007\018\t>\000\000\000\000\000\000\007\022\000\000\000\000\000\000\000\000\000\000\000\000\tF\000\000\007\026\000\000\011\217\011\217\000\000\000\000\001\154\011\217\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\000\000\000\000\000\000\000\000\000\000\006\158\000\000\000\000\000\000\000\000\000\000\000\186\000\000\001\030\006\174\006\202\000\000\000\000\006\206\000\000\000\000\000\000\000\190\000\000\000\000\008:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\146\006\214\000\000\000\000\000\000\008\150\0146\000\000\000\000\000\000\001R\000\000\001V\000\000\000\206\t\154\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\000\000\006\242\006\246\008\170\006\250\000\000\000\000\000\000\000\000\008\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\007\002\000\000\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\000\000\000\000\000\000\000\000\008\218\007\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007}\000\000\000\000\008\250\000\000\t\146\000\000\008\254\t:\000\000\t\166\000\000\007\018\t>\008J\007}\000\000\007\022\000\000\000\000\000\000\000\000\000\000\008~\tF\000\000\007\026\000\000\0002\006&\000F\000b\001\154\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\186\000\000\001\030\000\000\006\202\007}\000\000\006\206\000\000\000\000\000\000\000\190\000\000\000\000\014\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\198\006\214\t\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\000\000\000\206\000\000\005\133\000\000\000\000\000\000\006\234\001^\000\000\007}\006\238\001f\001j\000\000\006\242\006\246\008\170\006\250\000\000\000\000\000\000\007}\000\000\000\000\005\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\007\002\005\133\005\133\000\000\000\000\007\006\000\000\000\000\000\162\000\000\000\000\0002\0006\000F\000b\000\000\000f\007\014\000j\000\134\000\000\000\138\000\000\000\146\000\000\000\150\005\133\000\154\000\174\000\178\000\182\005\133\002\146\000\000\000\000\005\133\000\000\t\166\000\000\007\018\014\202\000\000\000\000\000\186\007\022\001\030\000\000\001\"\000\000\000\000\001&\014\210\000\000\007\026\000\190\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\000\000\000\000\001*\005\133\000\000\001.\000\000\000\000\000\000\000\000\000\000\001F\001B\005\133\001J\000\000\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\017V\000\206\000\000\000\000\005\133\000\000\000\000\001Z\001^\000\000\000\000\001b\001f\001j\001\190\001n\001r\000\000\001v\000\000\000\000\000\000\017Z\000\000\005\133\000\000\000\000\005\133\005\133\000\000\000\000\005\133\017^\000\000\001z\000\000\006\158\000\000\000\000\001~\000\000\005\133\000\162\000\000\001\030\006\174\006\202\000\000\000\000\006\206\000\000\001\134\000\000\000\000\000\000\000\000\008:\0196\000\000\000\000\n!\001\138\017j\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\142\008\202\006\214\000\000\000\000\001\146\008\150\000\000\003\137\000\000\000\000\001R\n!\001V\001\150\000\000\000\000\008\158\000\000\000\000\001\154\006\234\001^\008\162\000\000\006\238\008\166\001j\000\000\006\242\006\246\000\000\006\250\000\000\000\000\000\162\000\000\008\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\007\002\000\000\017n\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\000\000\000\000\000\000\000\000\008\218\007\014\006\158\000\000\000\000\000\000\n!\000\000\000\000\000\000\001\030\006\174\006\202\000\000\008\250\006\206\000\000\000\000\008\254\t:\000\000\000\000\008:\007\018\t>\000\000\000\000\000\000\007\022\000\000\000\000\001*\000\000\000\000\000\000\tF\000\000\007\026\000\000\000\000\006\210\006\214\000\000\001\154\000\000\008\150\000\000\000\000\000\000\000\000\001R\004\173\001V\000\000\000\000\000\000\008\158\000\000\000\000\000\000\006\234\001^\008\162\000\000\006\238\008\166\001j\000\000\006\242\006\246\000\000\006\250\000\000\004\173\000\000\000\000\008\174\000\000\000\000\000\000\000\000\000\000\000\000\004\173\000\000\000\000\006\254\007\002\000\000\000\000\008\178\008\182\007\006\008\186\000\000\000\162\000\000\008\206\000\000\000\000\000\000\000\000\000\000\008\218\007\014\000\000\000\000\000\000\000\000\000\000\000\000\n\021\000\000\004\173\004\173\011\241\000\000\008\250\011\241\000\000\000\000\008\254\t:\000\000\000\000\000\000\007\018\t>\000\000\000\000\000\000\007\022\000\000\011\241\000\000\000\000\n\021\011\241\tF\000\000\007\026\001\178\011\241\000\000\000\000\000\000\001\154\000\000\011\241\000\000\000\000\011\241\011\241\000\000\011\241\011\241\000\000\000\000\001\186\004\173\011\241\002\210\000\000\000\000\011\241\000\000\000\000\011\241\000\000\011\241\011\241\000\000\000\000\000\000\004\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\241\000\000\011\241\000\000\n\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\241\000\000\000\000\0002\t\182\000F\000b\002\222\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\021\006\000\150\006\150\000\154\000\174\000\178\000\182\006\154\021\014\011\241\011\241\011\241\000\000\011\241\011\241\002\226\000\000\011\241\000\000\000\186\000\000\004%\000\000\000\000\004%\002\234\000\000\000\000\000\000\011\241\000\190\000\000\011\241\011\241\011\241\011\241\000\000\000\000\000\000\004%\011\241\011\241\011\241\004%\011\241\011\241\011\241\004%\004%\000\000\000\000\000\202\000\000\000\000\004%\017V\000\000\004%\004%\000\000\004%\004%\000\000\000\000\004%\000\206\004%\004%\000\000\000\000\004%\000\000\000\000\004%\000\000\004%\004%\017Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017^\000\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\162\000\000\004%\000\000\000\000\003\197\018^\000\000\000\000\004%\000\000\017j\000\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004%\004%\004%\000\000\004%\004\193\004%\n!\004%\000\000\001=\001=\001=\001=\000\000\001=\004%\001=\001=\000\000\001=\000\000\001=\004%\001=\004%\001=\001=\001=\001=\000\162\004%\004%\004%\017F\004%\004%\004%\000\000\000\000\000\000\001=\001=\001=\000\000\017n\000\000\000\000\001=\000\000\000\000\000\000\000\000\001=\000\000\000\000\000\000\001=\000\000\000\000\000\000\001=\000\000\000\000\017J\n!\000\000\001=\000\000\000\000\000\000\000\000\000\000\000\000\001=\000\000\000\000\000\000\000\000\001=\000\000\000\000\0002\0006\000F\000b\000\000\000f\001=\000j\000\134\000\000\000\138\017V\000\146\000\000\000\150\000\000\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\000\000\001=\000\000\000\000\001=\000\000\000\000\000\186\017Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001=\000\000\020\006\000\000\000\000\001=\000\000\001=\004)\000\000\001=\004)\017N\000\000\000\000\000\000\000\000\000\000\001=\000\000\000\000\001=\000\000\000\202\000\000\000\000\004)\000\000\018\130\000\000\004)\000\000\017j\000:\004)\004)\001=\000\206\000\000\001=\001=\004)\000\000\000\000\004)\004)\000\000\004)\004)\000\000\017\158\004)\000\000\004)\004)\000\000\000\000\004)\000\000\000\000\004)\000\000\004)\004)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\162\000\000\000\000\000\000\000\000\004)\000\000\004)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017n\000\000\004)\000\000\000\000\000\000\021\n\000F\000b\004)\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\021\006\000\150\006\150\000\154\000\174\000\000\000\182\006\154\021\014\004)\004)\004)\000\000\004)\004\197\004)\000\000\004)\000\000\000\186\000\000\012E\000\000\000\000\012E\004)\000\000\000\000\000\000\004)\000\190\000\000\004)\000\000\004)\000\000\000\000\000\000\000\000\012E\004)\004)\004)\012E\004)\004)\004)\007.\012E\000\000\000\000\000\000\000\000\000\000\012E\000\000\000\000\012E\012E\000\000\012E\012E\000\000\000\000\0076\000\206\012E\007B\000\000\000\000\012E\000\000\000\000\012E\000\000\012E\012E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\182\000F\000b\000\000\000f\000\000\000j\000\134\000\000\000\138\012E\000\146\012E\000\150\000\000\000\154\000\174\000\000\000\182\000\000\000\000\000\000\012E\000\000\000\000\003\197\000\000\000\000\000\000\007N\004I\000\186\000J\004I\000N\004I\000V\004I\000\000\004I\000\000\000\000\000\190\000Z\004I\004I\000\000\012E\012E\012E\000\000\012E\000\000\007R\000\000\012E\000\000\004I\000\000\000\000\000\000\000\000\000\000\007Z\000\000\000\000\000\000\004I\004I\000\000\012E\000\000\012E\004I\000\000\0035\000\000\000\206\012E\012E\012E\000\000\012E\012E\012E\000\000\000\000\000\000\000\000\004I\0035\000\000\004I\000\000\000\000\000\000\000\000\004I\004I\000\000\000\000\004I\000^\000\000\000\000\000\000\0035\000\000\000\000\004I\000\000\000\000\000\000\004I\004I\000\000\000\000\000\000\000\162\000\000\000\000\000\000\000\000\004I\000\000\004M\000\000\000n\004M\000r\004M\000z\004M\004I\004M\000\000\000\000\000\000\000~\004M\004M\000\000\005\133\004I\000\000\005\133\000\000\000\000\004I\005\133\000\000\005\133\004M\000\000\000\000\000\000\005\133\005\133\004I\000\000\000\000\000\000\004M\004M\000\000\000\000\000\000\000\000\004M\000\000\000\000\0035\000\000\000\000\000\000\000\000\0035\0035\004I\000\000\000\000\004I\004I\000\000\004M\004I\000\000\004M\0035\000\000\004I\004I\004M\004M\000\000\004I\004M\000\130\000\000\000\000\000\000\005\133\000\000\0035\004M\000\000\000\000\000\000\004M\004M\000\218\000\000\0035\000\000\023^\000\000\000\000\000\000\004M\000\000\000\000\001^\000\000\000\000\000\000\001f\001j\000\000\004M\000\000\000\000\000\000\n\017\n\017\n\017\n\017\000\000\n\017\004M\n\017\n\017\000\000\n\017\004M\n\017\000\000\n\017\000\000\n\017\n\017\n\017\n\017\000\000\004M\000\000\000\162\000\000\000\000\000\000\000\000\005\133\000\000\000\000\n\017\n\017\n\017\001\137\000\000\000\000\001\137\n\017\000\000\000\000\004M\000\000\n\017\004M\004M\000\000\017\174\004M\000\000\017V\017\182\001\137\004M\004M\000\000\001\137\n\017\004M\000\000\000\000\001\137\000\000\000\000\n\017\000\000\000\000\001\137\000\000\n\017\001\137\001\137\017Z\001\137\001\137\000\000\000\000\000\000\n\017\001\137\000\000\000\000\017^\001\137\000\000\000\000\001\137\000\000\001\137\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\017\000\000\000\000\n\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\137\n-\001\137\017j\n\017\000\000\000\000\000\000\000\000\n\017\000\000\n\017\001\137\000\000\n\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\017\000\000\000\000\n\017\n-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\137\001\137\001\206\n\017\001\137\001\137\018\n\n\017\001\137\000\000\000\000\000\000\000\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\137\000\000\000\000\001\137\001\137\001\137\001\137\017n\000\000\000\000\000\000\002v\001\137\001\137\000\000\001\137\001\137\001\137\n\001\n\001\n\001\n\001\000\000\n\001\000\000\n\001\n\001\n-\n\001\000\000\n\001\000\000\n\001\000\000\n\001\n\001\n\001\n\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\001\n\001\n\001\000\000\000\000\000\000\000\000\n\001\000\000\000\000\000\000\000\000\n\001\0002\000\214\000F\000b\000\000\000f\000\000\000j\000\134\000\000\000\138\000\000\000\146\n\001\000\150\000\000\000\154\000\174\000\178\000\182\n\001\000\000\000\000\000\000\000\000\n\001\000\000\000\000\n\005\n\005\n\005\n\005\000\186\n\005\n\001\n\005\n\005\000\000\n\005\000\000\n\005\000\000\n\005\000\190\n\005\n\005\n\005\n\005\000\000\000\000\000\000\000\000\000\000\000\000\n\001\000\000\000\000\n\001\000\000\n\005\n\005\n\005\000\000\000\000\000\202\000\000\n\005\000\000\000\000\n\001\000\230\n\005\000\000\000\000\n\001\018\014\n\001\000\000\000\206\n\001\000\000\000\000\000\000\000\000\000\000\n\005\000\000\n\001\000\000\000\000\n\001\000\000\n\005\000\000\000\000\000\000\000\000\n\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\001\n\005\004\129\017\178\n\001\004\129\000R\004\129\000\000\004\129\000\000\004\129\000\000\000\000\000\162\000\000\004\129\004\129\000\000\000\000\000\000\n\005\000\000\000\000\n\005\000\000\000\000\000\000\000\000\004\129\000\000\000\000\000\000\000\234\000\000\000\000\n\005\000\000\000\000\004\129\004\129\n\005\000\000\n\005\000\000\004\129\n\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\005\000\000\011u\n\005\000\000\000\000\000\000\004\129\000\000\000\000\004\129\000\000\000\000\000\000\000\000\004\129\004\129\000\000\n\005\004\129\004\129\000\000\n\005\000\000\000\000\000\000\000\000\004\129\000\000\000\000\000\000\004\129\004\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\129\000\000\004\133\000\000\000\000\004\133\000v\004\133\000\000\004\133\004\129\004\133\000\000\000\000\000\000\000\000\004\133\004\133\000\000\000\000\004\129\000\000\000\000\000\000\000\000\004\129\000\000\000\000\000\000\004\133\000\000\000\000\000\000\000\000\000\000\004\129\000\000\000\000\011\018\004\133\004\133\000\000\000\000\000\000\000\000\004\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\129\011\026\000\000\004\129\004\129\000\000\004\133\004\129\000\000\004\133\000\000\000\000\004\129\004\129\004\133\004\133\011\"\004\129\004\133\004\133\000\000\000\000\011b\011j\000\000\000\000\004\133\000\000\000\000\000\000\004\133\004\133\011B\000\000\000\000\011*\000\000\011:\000\000\000\000\004\133\000\000\004\137\000\000\000\000\004\137\000\142\004\137\000\000\004\137\004\133\004\137\000\000\000\000\000\000\000\000\004\137\004\137\011J\000\000\004\133\000\000\000\000\000\000\000\000\004\133\000\000\000\000\000\000\004\137\000\000\000\000\000\000\000\000\000\000\004\133\000\000\000\000\000\000\004\137\004\137\000\000\000\000\000\000\000\000\004\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\133\011R\000\000\004\133\004\133\000\000\004\137\004\133\0112\004\137\000\000\000\000\004\133\004\133\004\137\004\137\000\000\004\133\004\137\004\137\005\001\000\000\000\000\000\000\000\000\000\000\004\137\000\000\000\000\000\000\004\137\004\137\000\000\000\000\000\000\011r\011Z\000\000\000\000\000\000\004\137\000\000\004\189\000\000\000\000\004\189\000\000\004\189\000\000\004\189\004\137\004\189\000\000\000\000\000\000\000\000\004\189\004\189\000\000\000\000\004\137\000\000\000\000\000\000\000\000\004\137\000\000\000\000\000\000\004\189\000\000\000\000\000\000\000\000\000\000\004\137\000\000\000\000\000\000\004\189\004\189\000\000\000\000\000\000\000\000\004\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\137\000\000\001\238\004\137\004\137\002>\004\189\004\137\000\000\004\189\000\210\000\000\004\137\004\137\004\189\004\189\000\000\004\137\004\189\004\189\001\246\000\000\000\000\000\000\002\005\000\000\004\189\000\000\000\000\002\005\004\189\004\189\000\000\000\000\000\000\001\254\000\000\000\000\002\005\002\005\004\189\002^\002f\000\000\000\000\000\000\000\000\002\005\000\000\000\000\004\189\002\030\000\000\000\000\002\006\000\000\002\022\002\005\000\000\000\000\004\189\000\000\000\000\000\000\000\000\004\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\189\000\000\002&\000\000\002\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\005\000\000\000\000\000\000\000\000\000\000\004\189\000\000\000\000\004\189\004\189\000\000\000\000\004\189\000\000\000\000\000\000\000\000\004\189\004\189\000\000\000\000\000\000\004\189\000\000\002\005\002.\000\000\000\000\002\005\002\005\000\000\000\000\002\014\000\000\000\000\000\000\000}\000\000\000\000\000}\000\000\000\000\000\000\000\000\002\005\000\000\000\000\002\005\002\005\002\005\002\005\000\000\000\000\000\000\001\246\000\000\002\005\002\005\000}\002n\0026\002\005\000\000\000}\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000}\000}\000\000\000}\000}\000\000\000\000\000\000\000\000\000}\000\000\000\000\000\000\002\030\000\000\000\000\002\006\000\000\002\022\000}\000e\000\000\000\000\000e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e\002&\000\000\000}\000e\000\000\000\000\000\000\000\000\000e\000\000\000\000\000\000\000}\000\000\001\254\000\000\000\000\000e\000e\000\000\000e\000e\000\000\000\000\000\000\000\000\000e\000\000\000\000\000\000\000e\000\000\000\000\002\006\000\000\002\022\000e\000}\002.\000\000\000\000\000}\000}\000\000\000\000\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e\000}\000e\000\000\000}\000}\000}\000}\000\000\000\000\000\000\000\000\000e\000}\000}\000\000\000}\0026\000}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e\000e\000\000\000\000\000e\000e\000\000\000\000\002\014\000\000\000\000\000\000\000]\000\000\000\000\000]\000\000\000\000\000\000\000\000\000e\000\000\000\000\000e\000e\000e\000e\000\000\000\000\000\000\000]\000\000\000e\000e\000]\000e\000e\000e\000\000\000]\000\000\000\000\000\000\000\000\000\000\000]\000\000\000\000\000]\000]\000\000\000]\000]\000\000\000\000\000\000\000\000\000]\000\000\000\000\000\000\000]\000\000\000\000\002\006\000\000\000]\000]\000a\000\000\000\000\000a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000a\000]\000\000\000]\000a\000\000\000\000\000\000\000\000\000a\000\000\000\000\000\000\000]\000\000\000a\000\000\000\000\000a\000a\000\000\000a\000a\000\000\000\000\000\000\000\000\000a\000\000\000\000\000\000\000a\000\000\000\000\002\006\000\000\000a\000a\000]\000]\000\000\000\000\000]\000]\000\000\000\000\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000a\000]\000a\000\000\000]\000]\000]\000]\000\000\000\000\000\000\000\000\000a\000]\000]\000\000\000]\000]\000]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000a\000a\000\000\000\000\000a\000a\000\000\000\000\002\014\000\000\000\000\000\000\000q\000\000\000\000\000q\000\000\000\000\000\000\000\000\000a\000\000\000\000\000a\000a\000a\000a\000\000\000\000\000\000\001\246\000\000\000a\000a\000q\000a\000a\000a\000\000\000q\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000q\000q\000\000\000q\000q\000\000\000\000\000\000\000\000\000q\000\000\000\000\000\000\000q\000\000\000\000\002\006\000\000\002\022\000q\000i\000\000\000\000\000i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\246\002&\000\000\000q\000i\000\000\000\000\000\000\000\000\000i\000\000\000\000\000\000\000q\000\000\001\254\000\000\000\000\000i\000i\000\000\000i\000i\000\000\000\000\000\000\000\000\000i\000\000\000\000\000\000\000i\000\000\000\000\002\006\000\000\002\022\000i\000q\000q\000\000\000\000\000q\000q\000\000\000\000\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000i\000q\000i\000\000\000q\000q\000q\000q\000\000\000\000\000\000\000\000\000i\000q\000q\000\000\000q\000q\000q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000i\000i\000\000\000\000\000i\000i\000\000\000\000\002\014\000\000\000\000\000\000\000m\000\000\000\000\000m\000\000\000\000\000\000\000\000\000i\000\000\000\000\000i\000i\000i\000i\000\000\000\000\000\000\001\246\000\000\000i\000i\000m\000i\000i\000i\000\000\000m\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000m\000m\000\000\000m\000m\000\000\000\000\000\000\000\000\000m\000\000\000\000\000\000\000m\000\000\000\000\002\006\000\000\002\022\000m\000u\000\000\000\000\000u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\246\002&\000\000\000m\000u\000\000\000\000\000\000\000\000\000u\000\000\000\000\000\000\000m\000\000\001\254\000\000\000\000\000u\000u\000\000\000u\000u\000\000\000\000\000\000\000\000\000u\000\000\000\000\000\000\002\030\000\000\000\000\002\006\000\000\002\022\000u\000m\000m\000\000\000\000\000m\000m\000\000\000\000\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000m\000u\000\000\000m\000m\000m\000m\000\000\000\000\000\000\000\000\000u\000m\000m\000\000\000m\000m\000m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\002.\000\000\000\000\000u\000u\000\000\000\000\002\014\000\000\000\000\000\000\001\238\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000u\000\000\000\000\000u\000u\000u\000u\000\000\000\000\000\000\001\246\000\000\000u\000u\000\133\000u\000u\000u\000\000\000\133\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000\133\000\133\000\000\000\133\002f\000\000\000\000\000\000\000\000\000\133\000\000\000\000\000\000\002\030\000\000\000\000\002\006\000\000\002\022\000\133\001\238\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\246\002&\000\000\000\133\000y\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\133\000\000\001\254\000\000\000\000\000y\000y\000\000\000y\000y\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\002\030\000\000\000\000\002\006\000\000\002\022\000y\000\133\002.\000\000\000\000\000\133\000\133\000\000\000\000\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\133\000y\000\000\000\133\000\133\000\133\000\133\000\000\000\000\000\000\000\000\000y\000\133\000\133\000\000\002n\0026\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000y\002.\000\000\000\000\000y\000y\000\000\000\000\002\014\000\000\000\000\000\000\001\238\000\000\000\000\000\129\000\000\000\000\000\000\000\000\000y\000\000\000\000\000y\000y\000y\000y\000\000\000\000\000\000\001\246\000\000\000y\000y\000\129\000y\0026\000y\000\000\000\129\000\000\000\000\000\000\000\000\000\000\001\254\000\000\000\000\000\129\000\129\000\000\000\129\002f\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\002\030\000\000\000\000\002\006\000\000\002\022\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002&\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\004\157\000\000\000\000\004\157\000\000\004\157\000\000\004\157\000\000\004\157\000\000\000\000\000\000\000\000\004\157\004\157\000\000\000\000\000\000\000\000\000\000\000\129\002.\000\000\000\000\000\129\000\129\004\157\000\000\002\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\157\004\157\000\000\000\000\000\129\000\000\004\157\000\129\000\129\000\129\000\129\000\000\000\000\000\000\000\000\000\000\000\129\000\129\000\000\000\129\0026\000\129\004\157\000\000\000\000\004\157\005\226\000\000\000\000\000\000\004\157\004\157\000\000\000\000\004\157\004\157\000\000\000\000\000\000\000\000\000\000\000\000\004\157\000\000\000\000\000\000\004\157\004\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\157\000\000\000\000\000\000\0002\0006\000F\000b\000\000\000f\004\157\000j\000\134\000\000\000\138\004\157\000\146\000\000\000\150\000\000\000\154\000\174\000\178\000\182\000\000\004\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\133\000\000\018\022\000\186\0182\000\000\000\000\000\000\000\000\018>\000\000\000\000\004\157\000\000\000\190\004\157\004\157\000\000\000\000\004\157\000\000\000\000\005\133\000\000\004\157\004\157\000\000\000\000\018V\004\157\000\000\000\000\005\133\005\133\000\000\000\202\000\000\000\000\005\133\005\133\018\130\000\000\005\133\000\000\005\133\000\000\005\133\000\000\005\133\000\206\000\000\000\000\000\000\005\133\005\133\000\000\000\000\005\133\000\000\000\000\000\000\000\000\005\133\002\146\000\000\000\000\005\133\000\000\000\000\018\162\000\000\000\000\018\242\000\000\005\133\000\000\005\133\005\133\005\133\005\133\000\000\000\000\005\133\000\000\019\n\000\000\000\000\000\000\005\133\019\022\000\000\0081\000\000\000\000\019\"\000\000\000\000\000\000\005\133\000\000\000\000\005\133\019.\000\000\000\000\019\222\005\133\002\146\005\133\000\000\005\133\005\133\000\000\000\000\000\000\000\000\000\000\000\000\005\133\000\000\019\234\000\000\005\133\005\133\020\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\133\005\133\000\000\000\000\005\133\005\133\000\000\000\000\005\133\000\000\005\133\000\000\000\000\005\133\005\133\005\133\000\000\000\000\005\133\000\000\000\000\000\000\000\000\000\000\n\198\005\133\000\000\000\000\000\000\003m\000\000\003m\000\000\000\000\003m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\133\000\000\000\000\005\133\005\133\003m\000\000\005\133\000\000\000\000\000\000\000\000\005\133\005\133\003m\003m\000\000\005\133\003m\003m\000\000\000\000\000\000\000\000\003m\000\000\003m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\000\000\000\000\003m\003m\003m\000\000\003m\003m\000\000\003m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\000\000\000\000\000\000\000\000\003m\000\000\000\000\003m\000\000\000\000\000\000\000\000\000\000\000\000\001\161\000\000\003m\001\161\000\000\000\000\000\000\000\000\000\000\000\000\003m\000\000\003m\000\000\003m\000\000\000\000\000\000\001\161\000\000\000\000\000\000\001\161\000\000\003m\000\000\000\000\001\161\000\000\003m\000\000\000\000\000\000\001\161\000\000\003m\001\161\001\161\003m\001\161\001\161\000\000\000\000\000\000\003m\001\161\000\000\000\000\001\030\001\161\t\226\000\000\001\161\t\230\001\161\001\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\001\161\000\000\001\161\t\234\n>\000\000\000\000\n\166\n\190\000\000\000\000\000\000\001\161\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\n\001^\000\000\000\000\n\014\008\166\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\001\161\001\161\007~\000\000\001\161\000\000\000\000\000\000\001\161\000\000\000\000\000\000\006\254\n\030\000\000\000\000\000\000\000\000\n\"\000\000\000\000\000\162\000\000\001\161\000\000\001\161\000\000\000\000\000\000\000\000\n*\007\134\001\161\001\161\000\000\001\161\001\161\001\161\005\173\001\030\n\194\t\226\n\222\000\000\t\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n.\000\000\000\000\000\000\000\000\n2\000\000\000\000\001*\000\000\000\000\011\186\000\000\000\000\n6\000\000\000\000\t\234\n>\000\000\001\154\n\166\n\190\000\000\000\000\000\000\000\000\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\n\001^\000\000\000\000\n\014\008\166\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\n\030\000\000\000\000\000\000\000\000\n\"\000\000\001\030\000\162\t\226\000\000\000\000\t\230\000\000\000\000\000\000\000\000\n*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\173\000\000\n\194\001*\n\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\234\n>\n.\000\000\n\166\n\190\000\000\n2\000\000\000\000\001R\000\000\001V\n\230\000\000\000\000\n6\000\000\000\000\000\000\n\n\001^\001\154\000\000\n\014\008\166\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\n\030\000\000\000\000\000\000\000\000\n\"\000\000\001\030\000\162\t\226\000\000\000\000\t\230\000\000\000\000\000\000\000\000\n*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\173\000\000\n\194\001*\n\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\234\n>\n.\000\000\n\166\n\190\000\000\n2\000\000\000\000\001R\000\000\001V\005\025\000\000\000\000\n6\000\000\000\000\000\000\n\n\001^\001\154\000\000\n\014\008\166\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\254\n\030\000\000\000\000\000\000\000\000\n\"\000\000\000\000\000\162\000\000\000\000\000\000\012)\000\000\000\000\012)\000\000\n*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\173\000\000\n\194\000\000\n\222\012)\000\000\000\000\000\000\012)\000\000\000\000\000\000\003V\n.\000\000\000\000\000\000\000\000\n2\012)\000\000\000\000\000\000\012)\001\189\012)\012)\n6\000\000\003^\000\000\000\000\003j\001\154\001\030\012)\t\226\000\000\012)\t\230\012)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\012)\000\000\000\000\t\234\n>\000\000\000\000\n\166\n\190\000\000\000\000\000\000\012)\001R\000\000\001V\000\000\000\000\000\000\003v\000\000\000\000\000\000\n\n\001^\000\000\000\000\n\014\008\166\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\000\000\012)\012)\000\000\012)\000\000\003z\000\000\012)\000\000\000\000\000\000\006\254\n\030\000\000\000\000\003\130\000\000\n\"\000\000\012)\000\162\000\000\000\000\000\000\012)\012)\000\000\000\000\001\137\n*\012)\001\137\000\000\000\000\012)\012)\012)\005\173\000\000\000\000\000\000\n\222\000\000\000\000\000\000\000\000\001\137\000\000\000\000\000\000\000\000\n.\000\000\000\000\000\000\001\137\n2\000\000\000\000\000\000\000\000\001\137\001\201\000\000\000\000\n6\000\000\001\137\001\137\000\000\000\000\001\154\000\000\000\000\000\000\007\178\000\000\001\137\008\002\000\000\001\137\000\000\001\137\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\186\000\000\000\000\000\000\002\021\000\000\000\000\000\000\000\000\002\021\001\137\000\000\001\137\000\000\000\000\007\194\000\000\000\000\002\021\002\021\000\000\008\018\008\026\000\000\000\000\000\000\000\000\002\021\000\000\000\000\000\000\007\226\000\000\000\000\007\202\000\000\007\218\002\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\137\001\137\001\198\000\000\001\137\001\137\000\000\000\000\001\137\000\000\007\234\000\000\002\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\137\000\000\002\021\001\137\001\137\000\000\001\137\000\000\000\000\000\000\000\000\002\130\001\137\001\137\000\000\001\137\001\137\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\021\007\242\000\000\000\000\002\021\000\000\000\000\000\000\007\210\000\000\000\000\000\000\001%\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\021\000\000\002\021\000\000\000\000\000\000\000\000\007\186\000\000\002\021\002\021\001%\008\"\007\250\002\021\000\000\001%\000\000\000\000\000\000\000\000\000\000\007\194\000\000\000\000\001%\001%\000\000\001%\001%\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\007\226\000\000\000\000\007\202\000\000\007\218\001%\001\013\000\000\000\000\001\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\013\007\234\000\000\001%\001\013\000\000\000\000\000\000\000\000\001\013\000\000\000\000\000\000\001%\000\000\007\194\000\000\000\000\001\013\001\013\000\000\001\013\001\013\000\000\000\000\000\000\000\000\001\013\000\000\000\000\000\000\001\013\000\000\000\000\007\202\000\000\007\218\001\013\001%\007\242\000\000\000\000\001%\000\000\000\000\000\000\007\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\013\000\000\001\013\000\000\001%\000\000\001%\000\000\000\000\000\000\000\000\000\000\001\013\001%\001%\000\000\001%\007\250\001%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\013\001\013\000\000\000\000\001\013\000\000\000\000\000\000\007\210\000\000\000\000\000\000\001\005\000\000\000\000\001\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\013\000\000\001\013\000\000\000\000\000\000\000\000\001\005\000\000\001\013\001\013\001\005\001\013\001\013\001\013\000\000\001\005\000\000\000\000\000\000\000\000\000\000\001\005\000\000\000\000\001\005\001\005\000\000\001\005\001\005\000\000\000\000\000\000\000\000\001\005\000\000\000\000\000\000\001\005\000\000\000\000\007\202\000\000\001\005\001\005\001\t\000\000\000\000\001\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\t\001\005\000\000\001\005\001\t\000\000\000\000\000\000\000\000\001\t\000\000\000\000\000\000\001\005\000\000\001\t\000\000\000\000\001\t\001\t\000\000\001\t\001\t\000\000\000\000\000\000\000\000\001\t\000\000\000\000\000\000\001\t\000\000\000\000\007\202\000\000\001\t\001\t\001\005\001\005\000\000\000\000\001\005\000\000\000\000\000\000\007\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\t\000\000\001\t\000\000\001\005\000\000\001\005\000\000\000\000\000\000\000\000\000\000\001\t\001\005\001\005\000\000\001\005\001\005\001\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\t\001\t\000\000\000\000\001\t\000\000\000\000\000\000\007\210\000\000\000\000\000\000\001\025\000\000\000\000\001\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\t\000\000\001\t\000\000\000\000\000\000\000\000\007\186\000\000\001\t\001\t\001\025\001\t\001\t\001\t\000\000\001\025\000\000\000\000\000\000\000\000\000\000\007\194\000\000\000\000\001\025\001\025\000\000\001\025\001\025\000\000\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\025\000\000\000\000\007\202\000\000\007\218\001\025\001\017\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\186\007\234\000\000\001\025\001\017\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\001\025\000\000\007\194\000\000\000\000\001\017\001\017\000\000\001\017\001\017\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\001\017\000\000\000\000\007\202\000\000\007\218\001\017\001\025\001\025\000\000\000\000\001\025\000\000\000\000\000\000\007\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\001\017\000\000\001\025\000\000\001\025\000\000\000\000\000\000\000\000\000\000\001\017\001\025\001\025\000\000\001\025\001\025\001\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\001\017\000\000\000\000\001\017\000\000\000\000\000\000\007\210\000\000\000\000\000\000\001\021\000\000\000\000\001\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\001\017\000\000\000\000\000\000\000\000\007\186\000\000\001\017\001\017\001\021\001\017\001\017\001\017\000\000\001\021\000\000\000\000\000\000\000\000\000\000\007\194\000\000\000\000\001\021\001\021\000\000\001\021\001\021\000\000\000\000\000\000\000\000\001\021\000\000\000\000\000\000\001\021\000\000\000\000\007\202\000\000\007\218\001\021\001\029\000\000\000\000\001\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\186\007\234\000\000\001\021\001\029\000\000\000\000\000\000\000\000\001\029\000\000\000\000\000\000\001\021\000\000\007\194\000\000\000\000\001\029\001\029\000\000\001\029\001\029\000\000\000\000\000\000\000\000\001\029\000\000\000\000\000\000\007\226\000\000\000\000\007\202\000\000\007\218\001\029\001\021\001\021\000\000\000\000\001\021\000\000\000\000\000\000\007\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\234\000\000\001\029\000\000\001\021\000\000\001\021\000\000\000\000\000\000\000\000\000\000\001\029\001\021\001\021\000\000\001\021\001\021\001\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\007\242\000\000\000\000\001\029\000\000\000\000\000\000\007\210\000\000\000\000\000\000\007\178\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\000\000\001\029\000\000\000\000\000\000\000\000\007\186\000\000\001\029\001\029\001-\001\029\001\029\001\029\000\000\001-\000\000\000\000\000\000\000\000\000\000\007\194\000\000\000\000\001-\001-\000\000\001-\008\026\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\007\226\000\000\000\000\007\202\000\000\007\218\001-\007\178\000\000\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\186\007\234\000\000\001-\001!\000\000\000\000\000\000\000\000\001!\000\000\000\000\000\000\001-\000\000\007\194\000\000\000\000\001!\001!\000\000\001!\001!\000\000\000\000\000\000\000\000\001!\000\000\000\000\000\000\007\226\000\000\000\000\007\202\000\000\007\218\001!\001-\007\242\000\000\000\000\001-\000\000\000\000\000\000\007\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\234\000\000\001!\000\000\001-\000\000\001-\000\000\000\000\000\000\000\000\000\000\001!\001-\001-\000\000\008\"\007\250\001-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\007\242\000\000\000\000\001!\000\000\000\000\000\000\007\210\000\000\000\000\000\000\007\178\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000\000\001!\000\000\000\000\000\000\000\000\007\186\000\000\001!\001!\001)\001!\007\250\001!\000\000\001)\000\000\000\000\000\000\000\000\000\000\007\194\000\000\000\000\001)\001)\000\000\001)\008\026\000\000\000\000\000\000\000\000\001)\000\000\000\000\001\030\007\226\001\"\000\000\007\202\001&\007\218\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008>\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\001.\000\000\000\000\007\234\000\000\001)\001>\001B\000\000\001J\000\000\t\222\000\000\000\000\000\000\001)\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Z\001^\000\000\n\206\001b\001f\001j\000\000\001n\001r\000\000\001v\000\000\000\000\001)\007\242\000\000\000\000\001)\000\000\000\000\000\000\007\210\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\000\000\001~\000\000\000\000\000\162\000\000\001)\000\000\001)\000\000\000\000\000\000\000\000\001\134\000\000\001)\001)\000\000\001)\007\250\001)\000\000\000\000\001\138\008A\000\000\001\030\000\000\001\"\000\000\000\000\001&\000\000\000\000\000\000\001\142\000\000\000\000\000\000\000\000\001\146\008A\000\000\008A\000\000\008A\000\000\001*\000\000\001\150\001.\000\000\000\000\000\181\000\000\001\154\001>\001B\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\000\000\000\000\011\026\000\000\000\000\000\000\000\000\001Z\001^\000\000\000\000\001b\001f\001j\000\000\001n\001r\011\"\001v\000\000\000\000\000\000\000\000\000\181\000\181\001\030\000\000\001\"\000\000\000\000\001&\000\000\000\000\011B\001z\000\000\011*\000\000\011:\001~\014\186\000\000\000\162\000\000\000\000\000\000\001*\000\000\000\000\001.\000\000\001\134\000\000\000\000\000\000\001>\001B\000\000\001J\011J\000\000\001\138\000\000\000\000\000\000\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\001\142\000\000\001Z\001^\000\000\001\146\001b\001f\001j\000\000\001n\001r\000\000\001v\001\150\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\011R\000\000\000\000\000\000\000\000\001z\000\000\0112\000\000\000\000\001~\000\000\001\030\000\162\001\"\000\000\000\000\001&\000\000\000\181\000\000\000\000\001\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\001*\000\181\011Z\001.\000\000\000\000\000\000\000\000\000\000\001>\004\226\001\142\001J\000\000\000\000\000\000\001\146\000\000\000\000\001R\000\000\001V\000\000\000\000\000\000\001\150\000\000\000\000\000\000\001Z\001^\001\154\000\000\001b\001f\001j\000\000\001n\001r\000\000\001v\000\000\000\000\000\000\006~\006J\000b\001\030\000f\001\"\006N\000\134\001&\000\138\000\000\000\146\001z\000\150\000\000\000\154\000\174\001~\000\182\000\000\000\162\000\000\000\000\000\000\001*\000\000\000\000\001.\000\000\001\134\000\000\000\186\000\000\001>\001\130\000\000\001J\000\000\000\000\001\138\000\000\000\000\000\190\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\001\142\000\000\001Z\001^\000\000\001\146\001b\001f\001j\000\000\001n\001r\000\000\001v\001\150\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\000\000\000\206\000\000\000\000\001z\000\000\003\202\000\000\000\000\001~\000\000\003e\000\162\003e\000\000\000\000\003e\000\000\000\000\000\000\000\000\001\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\003e\000\000\000\000\003e\000\000\000\000\000\000\000\000\000\000\003e\003e\001\142\003e\000\000\000\000\000\000\001\146\000\000\000\000\003e\000\000\003e\000\000\000\000\000\000\001\150\000\000\000\000\000\000\003e\003e\001\154\000\000\003e\003e\003e\004%\003e\003e\004%\003e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\003e\000\000\000\000\000\000\000\000\003e\004%\004%\003e\000\000\000\000\000\000\000\157\004%\000\000\000\000\000\000\003e\000\000\004%\004%\000\000\000\000\004%\000\000\000\000\004%\000\000\000\000\004%\000\157\000\000\004%\000\000\004%\004%\000\000\000\000\000\000\003e\000\000\000\000\000\000\000\000\003e\011\"\000\000\000\000\000\000\000\000\000\000\000\157\000\157\003e\000\000\004%\000\000\000\000\000\000\003e\000\000\000\157\000\000\000\000\011*\000\000\011:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\000\000\000\000\001\030\000\000\0012\000\000\000\000\0016\000\000\000\157\000\000\000\000\000\000\000\000\000\000\004%\004%\000\000\000\000\004\193\004%\000\000\004%\001*\000\000\000\000\001.\000\000\000\000\000\000\004%\000\000\001:\001N\004%\001J\000\000\004%\000\000\000\000\000\000\000\000\001R\000\000\001V\004%\000\000\000\157\000\000\004%\004%\000\000\003\022\001^\0112\000\000\003\026\001f\001j\000\000\003\030\003\"\000\000\003&\000\000\000\000\000\157\000\000\000\000\000\000\001\030\000\000\0012\000\000\000\000\0016\000\000\000\000\000\000\003*\000\000\000\157\000\157\000\000\003.\000\000\000\000\000\162\000\000\000\000\000\000\001*\000\000\000\000\001.\000\000\0036\000\000\000\000\000\000\001:\004\202\000\000\001J\000\000\000\000\000\000\000\000\000\000\000\000\001R\000\000\001V\000\000\000\000\000\000\000\000\000\000\003:\000\000\003\022\001^\000\000\003>\003\026\001f\001j\000\000\003\030\003\"\000\000\003&\003B\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003*\000\000\000\000\000\000\000\000\003.\000\000\001\030\000\162\0012\000\000\000\000\0016\000\000\000\000\000\000\000\000\0036\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\001.\000\000\000\000\000\000\000\000\000\000\001:\0032\003:\001J\000\000\000\000\000\000\003>\000\000\000\000\001R\000\000\001V\000\000\000\000\000\000\003B\000\000\000\000\000\000\003\022\001^\001\154\000\000\003\026\001f\001j\000\000\003\030\003\"\000\000\003&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003*\000\000\000\000\000\000\000\000\003.\000\000\000\000\000\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0036\0002\006&\000F\000b\006>\000f\006\142\000j\000\134\006\146\000\138\000\000\000\146\000\000\000\150\006\150\000\154\000\174\000\178\000\182\006\154\003:\000\000\000\000\000\000\000\000\003>\000\000\000\000\001\030\000\000\006\202\000\186\000\000\006\206\003B\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\190\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\210\008*\000\000\000\000\000\000\000\202\000\000\000\000\000\000\000\000\001R\001\030\001V\006\202\000\000\000\000\006\206\000\000\000\000\000\206\006\234\001^\000\000\000\000\006\238\001f\001j\000\000\006\242\006\246\000\000\006\250\001*\000\000\000\000\008\170\000\000\000\000\000\000\000\000\000\000\006\210\006\214\000\000\000\000\000\000\006\254\007\002\000\000\000\000\000\000\001R\007\006\001V\000\000\000\162\000\000\000\000\000\000\000\000\000\162\006\234\001^\000\000\007\014\006\238\001f\001j\000\000\006\242\006\246\000\000\006\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\018\006\254\007\002\t\166\000\000\007\022\000\000\007\006\000\000\000\000\000\162\000\000\000\000\000\000\007\026\000\000\000\000\000\000\000\000\007\014\001\154\000\000\001\030\000\000\006\202\000\000\000\000\006\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\018\000\000\001*\000\000\000\000\007\022\000\000\000\000\000\000\000\000\000\000\006\210\007\n\000\000\007\026\000\000\000\149\000\000\000\000\000\000\001\154\001R\001\030\001V\t\226\000\000\000\000\t\230\000\000\000\000\000\000\006\234\001^\000\000\000\149\006\238\001f\001j\000\000\006\242\006\246\000\000\006\250\001*\000\000\000\000\000\000\000\000\000\000\000\149\000\000\000\000\t\234\t\246\000\000\000\149\000\149\006\254\007\002\000\000\000\000\000\000\001R\007\006\001V\000\149\000\162\000\000\011*\000\000\000\149\000\000\n\n\001^\000\000\007\014\n\014\001f\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\149\000\000\000\000\000\000\000\000\000\000\007\018\006\254\n\030\000\000\000\000\007\022\000\000\n\"\000\000\000\000\000\162\000\000\000\000\000\000\007\026\000\000\000\000\000\000\000\000\n*\001\154\000\000\001\030\000\000\t\226\000\000\000\000\t\230\000\000\000\000\000\000\000\000\000\149\000\000\000\000\000\000\000\000\000\000\000\000\0112\000\000\n.\000\000\001*\000\000\000\000\n2\000\000\000\000\000\000\000\000\000\149\t\234\n&\000\000\n6\000\000\000\000\000\000\000\000\000\000\001\154\001R\001\030\001V\t\226\000\149\000\149\t\230\000\000\000\000\000\000\n\n\001^\000\000\000\000\n\014\001f\001j\000\000\n\018\n\022\000\000\n\026\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\234\n>\000\000\000\000\000\000\006\254\n\030\000\000\000\000\000\000\001R\n\"\001V\000\000\000\162\000\000\007\173\000\000\000\000\000\000\n\n\001^\000\000\n*\n\014\001f\001j\000\000\n\018\n\022\000\000\n\026\000\000\000\000\000\000\000\000\000\000\000\000\007\173\000\000\000\000\000\000\000\000\000\000\000\000\n.\006\254\n\030\007\173\007\173\n2\000\000\n\"\000\000\007\173\000\162\000\000\000\000\000\000\n6\000\000\000\000\000\000\000\000\n*\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\173\000\000\000\000\000\000\000\000\007\173\000:\000\000\000\000\007\173\007\173\000\000\000\000\n.\000\000\000\000\000\000\007\173\n2\000\000\001\153\007\173\007\173\001\153\000\000\000\000\000\000\n6\000\000\000\000\000\000\007\173\000\000\001\154\000\000\000\000\000\000\000\000\001\153\000\000\000\000\007\173\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\173\000\000\001\153\000\000\000\000\000\000\001\153\000\000\001\153\001\153\000\000\000\000\000\000\000\000\000\000\007\173\000\000\000\000\001\153\000\000\000\000\001\153\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\173\000\000\000\000\007\173\007\173\000\000\000\000\007\173\000\000\001\153\000\000\000\000\007\173\007\173\000\000\000\000\005\133\007\173\000\000\005\133\000\000\001\153\000\000\005\133\000\000\005\133\000\000\000\000\000\000\000\000\005\133\005\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\153\003\166\000\000\001\153\000\000\000\000\000\000\001\153\000\000\000\000\000\000\000\000\007\173\000\000\000\000\000\000\000\000\000\000\000\000\001\153\000\000\000\000\000\000\000\000\001\153\001\153\000\000\000\000\005\133\000\000\003\174\000\000\000\000\000\000\001\153\001\153\001\153\000\218\000\000\000\000\007\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\173\000\000\000\000\000\000\007\173\007\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\173\000\000\000\000\000\000\000\000\003u\003u\003u\003u\000\000\003u\000\000\003u\003u\000\000\003u\000\000\003u\000\000\003u\007\173\003u\003u\003u\003u\005\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\238\007\173\000\000\003u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003u\000\000\000\000\000\000\000\000\000\000\000\000\007\173\000\000\000\000\007\173\007\173\003\254\000\000\000\000\004N\000\000\000\000\000\000\007\173\007\173\003u\000\000\000\000\007\173\000\000\000\000\003u\000\000\000\000\004\006\000\000\000\000\000\000\002\013\003u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\014\000\000\000\000\000\000\002\013\000\000\004^\004f\000\000\000\000\000\237\000\000\000\000\000\237\000\000\000\000\004.\000\000\000\000\004\022\000\000\004&\000\000\000\000\000\000\000\000\000\000\000\000\004\006\000\000\000\000\003u\000\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0046\004\014\000\000\000\000\000\000\000\237\000\000\000\237\000\237\000\000\000\000\000\000\002\013\000\000\000\000\000\000\000\000\004.\000\000\000\000\004\022\000\000\004&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003u\000\000\000\000\000\000\000\000\000\000\000\000\004>\000\000\000\000\002\013\000\000\0046\000\000\004\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\000\002\013\000\213\000\000\000\000\000\213\002\013\002\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004n\004F\002\013\000\000\000\213\000\000\000\000\000\000\000\213\004>\000\000\000\000\000\237\000\000\000\000\000\000\004\030\000\000\000\000\004\014\000\000\000\000\000\000\000\213\000\000\000\213\000\213\000\000\000\237\000\205\000\000\000\000\000\205\000\237\000\237\000\213\000\000\000\000\004\022\000\000\004&\000\000\000\000\000\237\004F\000\237\000\000\000\205\000\000\000\000\000\000\000\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\205\000\000\000\000\000\000\000\205\000\000\000\205\000\205\000\000\000\000\000\000\000\213\000\000\000\000\000\000\000\000\000\205\000\000\000\000\004\022\000\000\000\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\000\000\000\000\213\000\000\000\205\000\000\004\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\205\000\000\000\213\000\209\000\000\000\000\000\209\000\213\000\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\213\000\213\000\000\000\209\000\000\000\000\000\000\000\209\000\205\000\000\000\000\000\205\000\000\000\000\000\000\004\030\000\000\000\000\000\209\000\000\000\000\000\000\000\209\000\000\000\209\000\209\000\000\000\205\000\225\000\000\000\000\000\225\000\205\000\205\000\209\000\000\000\000\004\022\000\000\000\209\000\000\000\000\000\205\000\205\000\205\000\000\004\006\000\000\000\000\000\000\000\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\209\004\014\000\000\000\000\000\000\000\225\000\000\000\225\000\225\000\000\000\000\000\000\000\209\000\000\000\000\000\000\000\000\000\225\000\000\000\000\004\022\000\000\004&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\000\000\000\000\209\000\000\0046\000\000\004\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\225\000\000\000\209\000\217\000\000\000\000\000\217\000\209\000\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\209\000\209\000\000\004\006\000\000\000\000\000\000\000\217\000\225\000\000\000\000\000\225\000\000\000\000\000\000\004\030\000\000\000\000\004\014\000\000\000\000\000\000\000\217\000\000\000\217\000\217\000\000\000\225\000\221\000\000\000\000\000\221\000\225\000\225\000\217\000\000\000\000\004\022\000\000\004&\000\000\000\000\000\225\000\225\000\225\000\000\004\006\000\000\000\000\000\000\000\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\217\004\014\000\000\000\000\000\000\000\221\000\000\000\221\000\221\000\000\000\000\000\000\000\217\000\000\000\000\000\000\000\000\000\221\000\000\000\000\004\022\000\000\004&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\217\000\000\000\000\000\217\000\000\0046\000\000\004\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\000\000\217\000\229\000\000\000\000\000\229\000\217\000\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\217\000\217\000\217\000\000\004\006\000\000\000\000\000\000\000\229\000\221\000\000\000\000\000\221\000\000\000\000\000\000\004\030\000\000\000\000\004\014\000\000\000\000\000\000\000\229\000\000\000\229\000\229\000\000\000\221\003\254\000\000\000\000\000\245\000\221\000\221\004.\000\000\000\000\004\022\000\000\004&\000\000\000\000\000\221\000\221\000\221\000\000\004\006\000\000\000\000\000\000\000\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0046\004\014\000\000\000\000\000\000\000\245\000\000\000\245\004f\000\000\000\000\000\000\000\229\000\000\000\000\000\000\000\000\004.\000\000\000\000\004\022\000\000\004&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004>\000\000\000\000\000\229\000\000\0046\000\000\004\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\245\000\000\000\229\003\254\000\000\000\000\000\233\000\229\000\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\229\000\229\000\229\000\000\004\006\000\000\000\000\000\000\000\233\004>\000\000\000\000\000\245\000\000\000\000\000\000\004\030\000\000\000\000\004\014\000\000\000\000\000\000\000\233\000\000\000\233\000\233\000\000\000\245\003\254\000\000\000\000\000\241\000\245\000\245\004.\000\000\000\000\004\022\000\000\004&\000\000\000\000\004n\004F\000\245\000\000\004\006\000\000\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0046\004\014\000\000\000\000\000\000\000\241\000\000\000\241\004f\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\000\004.\003\189\000\000\004\022\003\189\004&\000\000\000\000\003\189\000\000\003\189\000\000\000\000\000\000\000\000\003\189\003\189\000\000\000\000\000\000\000\000\004>\000\000\000\000\000\233\000\000\0046\000\000\004\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\000\233\000\000\000\000\000\000\0021\000\233\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\233\004F\000\233\000\000\000\000\003\189\000\000\000\000\000\000\004>\000\000\000\000\000\241\000\000\000\000\000\000\004\030\0021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0021\000\000\000\000\000\241\0021\0021\000\000\000\000\000\241\000\241\000\000\000\000\000\000\000\000\0021\000\000\000\000\000\000\000\241\004F\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\005.\000F\000b\000\000\000f\0021\000j\000\134\000\000\000\138\003\189\000\146\000\000\000\150\000\000\000\154\000\174\000\178\000\182\000\000\0021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0021\000\000\000\190\0021\0021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0021\0021\000\000\000\000\000\000\0021\000\000\000\000\000\000\000\000\000\000\000\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\206\000\000\000\000\000\000\0052\0056\0002\000\214\000F\000b\000\000\000f\000\000\000j\000\134\000\000\000\138\000\000\000\146\000\000\000\150\000\000\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\005.\000F\000b\000\186\000f\000\000\000j\000\134\000\000\000\138\000\000\000\146\000\000\000\150\000\190\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\000\000\005:\000\000\000\000\000\000\000\000\000\000\000\186\000\000\000\000\000\000\000\202\000\000\000\000\000\000\000\000\000\000\000\230\000\190\000\000\000\000\002}\000\000\000\000\000\000\000\206\000\000\000\000\0002\005.\000F\000b\000\000\000f\000\000\000j\000\134\000\000\000\138\000\202\000\146\000\000\000\150\000\000\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\000\000\000\000\206\000\000\000\000\000\000\021\210\0056\000\000\000\186\000\000\0002\000\214\000F\000b\000\162\000f\000\000\000j\000\134\000\190\000\138\000\000\000\146\000\000\000\150\000\000\000\154\000\174\000\178\000\182\000\000\000\000\000\000\000\234\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\000\000\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\190\000\206\000\000\002-\000\000\0052\0056\000\000\021\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\000\000\000\000\000\000\000\012\013\000\230\002u\000\000\000\000\0002\005.\000F\000b\000\206\000f\000\000\000j\000\134\000\000\000\138\000\000\000\146\012\013\000\150\000\000\000\154\000\174\000\178\000\182\000\000\nV\000\000\000\000\000\000\000\000\000\000\000\000\012\013\000\000\005B\000\000\000\186\000\000\012\013\012\013\000\000\000\000\n^\000\000\000\000\nj\000\000\000\190\012\013\000\162\000\000\012\013\000\000\012\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\202\000\000\000\000\000\000\000\000\000\000\012\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\206\000\000\000\000\000\153\021\210\0056\000\000\000\000\000\000\002%\000\000\nv\000\000\000\000\000\000\0002\006B\006J\000b\000\000\000f\000\153\006N\000\134\000\000\000\138\000\000\000\146\000\169\000\150\012\013\000\154\000\174\000\178\000\182\nz\000\153\012\013\000\000\000\000\000\000\000\000\000\153\000\153\000\000\n\130\011\026\000\186\000\000\012\013\000\000\000\000\000\153\000\000\000\000\011*\000\000\000\153\000\190\000\000\021\222\011\"\000\000\000\000\012\013\012\013\000\000\000\169\000\169\000\000\000\000\000\000\000\161\000\000\000\000\000\000\000\000\000\169\000\153\006R\011*\000\000\011:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\026\000\000\000\000\000\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011J\000\165\011\"\000\000\000\000\000\000\000\000\000\000\000\161\000\161\000\000\000\000\000\000\000\153\000\000\000\000\000\000\000\000\000\161\011\026\0112\011*\000\000\011:\000\000\000\173\000\000\000\000\000\000\000\000\000\000\000\000\000\153\000\000\011\"\000\000\000\000\000\000\000\169\000\000\000\165\000\165\000\000\011\026\000\161\0112\000\000\000\153\000\153\000\000\000\165\000\000\000\000\011*\000\000\011:\000\000\000\169\011\"\000\000\000\000\000\000\000\000\000\000\000\173\000\173\011\018\000\000\000\000\000\000\000\000\000\000\000\169\000\169\011B\000\000\011J\011*\000\000\011:\000\000\000\000\000\161\000\000\011\026\000\000\000\000\000\000\000\000\0112\011\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\"\011J\000\161\000\000\000\000\000\000\000\189\011j\011\018\011\026\000\000\000\000\000\000\000\000\000\000\000\165\011B\000\161\000\161\011*\000\000\011:\0112\000\000\011\"\000\000\011\026\000\000\000\000\000\000\000\177\000\177\000\000\000\000\000\165\000\000\000\000\000\000\000\000\011R\011B\011\"\011J\011*\000\000\011:\0112\000\185\011j\000\165\000\165\000\000\000\000\000\000\000\000\000\000\000\000\011B\000\173\000\000\011*\000\000\011:\000\000\000\000\000\000\011J\000\000\000\000\000\000\000\000\000\000\000\000\000\173\000\173\000\000\000\000\000\000\000\000\000\000\011R\000\000\000\000\011J\000\000\000\000\000\000\0112\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\000\000\000\011R\000\000\000\000\000\000\000\000\000\000\000\000\0112\000\000\000\000\011r\011Z\000\000\000\000\000\000\000\000\000\000\011R\000\000\000\177\000\000\000\000\000\000\000\000\0112\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\177\011Z\000\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\185\011Z"))
   
   let lhs =
-    (16, "\000\012\000\011\000\n\000\t\000\008\000\007\000\006\000\005\000\004\000\003\000\002\000\001\000\000\001\006\001\006\001\006\001\005\001\005\001\005\001\005\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\001\000\001\000\001\000\000\255\000\254\000\254\000\254\000\253\000\253\000\253\000\252\000\252\000\252\000\251\000\251\000\251\000\250\000\249\000\248\000\247\000\247\000\246\000\246\000\245\000\245\000\244\000\244\000\243\000\243\000\242\000\241\000\241\000\240\000\240\000\239\000\239\000\239\000\238\000\238\000\237\000\236\000\235\000\234\000\233\000\232\000\231\000\230\000\229\000\228\000\227\000\226\000\225\000\225\000\224\000\224\000\223\000\223\000\222\000\222\000\221\000\221\000\221\000\220\000\220\000\220\000\220\000\220\000\219\000\219\000\219\000\219\000\219\000\218\000\217\000\217\000\217\000\217\000\216\000\216\000\215\000\215\000\214\000\214\000\213\000\213\000\213\000\212\000\212\000\212\000\211\000\211\000\211\000\211\000\210\000\210\000\210\000\210\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\208\000\207\000\207\000\206\000\206\000\206\000\205\000\205\000\204\000\204\000\204\000\203\000\203\000\202\000\202\000\202\000\201\000\200\000\199\000\199\000\198\000\198\000\197\000\197\000\196\000\196\000\195\000\195\000\194\000\193\000\192\000\192\000\191\000\191\000\190\000\189\000\189\000\189\000\189\000\188\000\187\000\186\000\186\000\185\000\184\000\184\000\183\000\183\000\183\000\183\000\183\000\182\000\182\000\182\000\182\000\181\000\181\000\181\000\181\000\180\000\180\000\180\000\180\000\179\000\178\000\178\000\177\000\177\000\177\000\176\000\175\000\175\000\175\000\175\000\174\000\173\000\173\000\173\000\173\000\172\000\172\000\172\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\170\000\170\000\169\000\169\000\168\000\168\000\167\000\167\000\166\000\166\000\166\000\166\000\165\000\165\000\165\000\165\000\164\000\164\000\164\000\164\000\164\000\163\000\162\000\162\000\162\000\161\000\160\000\160\000\159\000\159\000\158\000\158\000\157\000\157\000\156\000\156\000\155\000\155\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\153\000\152\000\151\000\151\000\150\000\150\000\149\000\149\000\148\000\148\000\147\000\147\000\146\000\146\000\145\000\145\000\144\000\144\000\143\000\143\000\142\000\142\000\141\000\141\000\140\000\140\000\139\000\139\000\138\000\138\000\137\000\137\000\136\000\136\000\135\000\135\000\134\000\134\000\133\000\133\000\132\000\132\000\131\000\131\000\130\000\130\000\129\000\129\000\128\000\128\000\127\000\127\000~\000~\000}\000}\000|\000|\000{\000{\000z\000z\000y\000y\000x\000x\000w\000w\000v\000u\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000t\000s\000r\000q\000p\000o\000n\000m\000l\000k\000j\000j\000j\000i\000i\000i\000h\000h\000h\000h\000g\000f\000e\000d\000c\000b\000a\000a\000a\000`\000`\000`\000_\000_\000^\000^\000^\000]\000]\000\\\000[\000[\000[\000Z\000Y\000Y\000X\000X\000W\000W\000V\000V\000U\000U\000T\000T\000S\000S\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000Q\000Q\000P\000P\000O\000O\000N\000N\000N\000N\000N\000M\000M\000L\000L\000L\000L\000K\000J\000I\000I\000I\000H\000H\000H\000G\000G\000G\000G\000G\000G\000F\000F\000F\000F\000F\000E\000E\000E\000E\000E\000E\000E\000D\000D\000D\000D\000D\000D\000D\000C\000C\000C\000C\000C\000C\000C\000B\000B\000B\000B\000B\000B\000B\000A\000A\000A\000A\000A\000A\000A\000A\000A\000A\000A\000A\000A\000@\000@\000@\000@\000@\000@\000@\000@\000@\000@\000@\000@\000@\000?\000?\000?\000?\000?\000?\000?\000?\000?\000?\000?\000?\000?\000>\000>\000>\000>\000>\000>\000>\000>\000>\000>\000>\000>\000>\000=\000=\000=\000=\000=\000<\000;\000;\000;\000;\000;\000;\000:\0009\0008\0007\0006\0005\0005\0005\0005\0005\0005\0005\0004\0004\0004\0004\0003\0002\0002\0001\0001\0000\0000\000/\000/\000.\000.\000-\000-\000,\000,\000+\000+\000*\000*\000)\000)\000(\000(\000'\000'\000&\000&\000%\000%\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000#\000#\000#\000\"\000\"\000\"\000\"\000!\000!\000!\000!\000!\000 \000\031\000\031\000\031\000\030\000\030\000\029\000\028\000\027\000\027\000\027\000\027\000\026\000\026\000\026\000\025\000\025\000\024\000\024\000\024\000\023\000\023\000\023\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\021\000\021\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\016\000\016\000\016\000\016\000\016\000\015\000\015\000\014\000\013\000\013\000\013\000\013\000\013")
+    (16, "\000\012\000\011\000\n\000\t\000\008\000\007\000\006\000\005\000\004\000\003\000\002\000\001\000\000\001\t\001\t\001\t\001\008\001\008\001\008\001\008\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\003\001\003\001\003\001\003\001\002\001\001\001\001\001\001\001\000\001\000\001\000\000\255\000\255\000\255\000\254\000\254\000\254\000\253\000\252\000\251\000\250\000\250\000\249\000\249\000\248\000\248\000\247\000\247\000\246\000\246\000\245\000\244\000\244\000\243\000\243\000\242\000\242\000\242\000\241\000\241\000\240\000\239\000\238\000\237\000\236\000\235\000\234\000\233\000\232\000\231\000\230\000\229\000\228\000\227\000\227\000\226\000\226\000\225\000\225\000\224\000\224\000\223\000\223\000\223\000\222\000\222\000\222\000\222\000\222\000\221\000\221\000\221\000\221\000\221\000\220\000\219\000\219\000\219\000\219\000\218\000\218\000\217\000\217\000\216\000\216\000\215\000\215\000\215\000\214\000\214\000\214\000\213\000\213\000\213\000\213\000\212\000\212\000\212\000\212\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\210\000\209\000\209\000\208\000\208\000\208\000\207\000\207\000\206\000\206\000\206\000\205\000\205\000\204\000\204\000\204\000\203\000\202\000\201\000\201\000\200\000\200\000\199\000\199\000\198\000\198\000\197\000\197\000\196\000\195\000\194\000\194\000\193\000\193\000\192\000\191\000\191\000\191\000\191\000\190\000\189\000\188\000\188\000\187\000\186\000\186\000\185\000\185\000\185\000\185\000\185\000\184\000\184\000\184\000\184\000\183\000\183\000\183\000\183\000\182\000\182\000\182\000\182\000\181\000\180\000\180\000\179\000\179\000\179\000\178\000\177\000\177\000\177\000\177\000\176\000\175\000\175\000\175\000\175\000\174\000\174\000\174\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\172\000\172\000\171\000\171\000\170\000\170\000\169\000\169\000\168\000\168\000\168\000\168\000\167\000\167\000\167\000\167\000\166\000\166\000\166\000\166\000\166\000\165\000\164\000\164\000\164\000\163\000\162\000\162\000\161\000\161\000\160\000\160\000\159\000\159\000\158\000\158\000\157\000\157\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\155\000\154\000\153\000\153\000\152\000\152\000\151\000\151\000\150\000\150\000\149\000\149\000\148\000\148\000\147\000\147\000\146\000\146\000\145\000\145\000\144\000\144\000\143\000\143\000\142\000\142\000\141\000\141\000\140\000\140\000\139\000\139\000\138\000\138\000\137\000\137\000\136\000\136\000\135\000\135\000\134\000\134\000\133\000\133\000\132\000\132\000\131\000\131\000\130\000\130\000\129\000\129\000\128\000\128\000\127\000\127\000~\000~\000}\000}\000|\000|\000{\000{\000z\000z\000y\000y\000x\000w\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000v\000u\000t\000s\000r\000q\000p\000o\000n\000m\000l\000l\000l\000k\000k\000k\000j\000j\000j\000j\000i\000h\000g\000f\000e\000d\000c\000c\000c\000b\000b\000b\000a\000a\000`\000`\000`\000_\000_\000^\000]\000]\000]\000\\\000[\000[\000Z\000Z\000Y\000Y\000X\000X\000W\000W\000V\000V\000U\000U\000T\000T\000T\000T\000T\000T\000T\000T\000T\000T\000T\000T\000T\000T\000T\000T\000T\000T\000T\000S\000S\000R\000R\000Q\000Q\000P\000P\000P\000P\000P\000O\000O\000N\000N\000N\000N\000M\000L\000K\000K\000K\000J\000J\000J\000I\000I\000I\000I\000I\000I\000H\000H\000H\000H\000H\000G\000G\000G\000G\000G\000G\000G\000F\000F\000F\000F\000F\000F\000F\000E\000E\000E\000E\000E\000E\000E\000D\000D\000D\000D\000D\000D\000D\000C\000C\000C\000C\000C\000C\000C\000C\000C\000C\000C\000C\000C\000B\000B\000B\000B\000B\000B\000B\000B\000B\000B\000B\000B\000B\000A\000A\000A\000A\000A\000A\000A\000A\000A\000A\000A\000A\000A\000@\000@\000@\000@\000@\000@\000@\000@\000@\000@\000@\000@\000@\000?\000?\000?\000?\000?\000>\000=\000=\000=\000=\000=\000=\000<\000;\000:\0009\0008\0008\0007\0006\0006\0006\0006\0006\0006\0006\0005\0005\0005\0005\0005\0005\0004\0003\0003\0002\0002\0001\0001\0000\0000\000/\000/\000.\000.\000-\000-\000,\000,\000+\000+\000*\000*\000)\000)\000(\000(\000'\000'\000&\000&\000%\000%\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000$\000#\000#\000#\000\"\000\"\000\"\000\"\000!\000!\000!\000!\000!\000 \000\031\000\031\000\031\000\030\000\030\000\029\000\028\000\027\000\027\000\027\000\027\000\026\000\026\000\026\000\025\000\025\000\024\000\024\000\024\000\023\000\023\000\023\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\021\000\021\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\016\000\016\000\016\000\016\000\016\000\015\000\015\000\014\000\013\000\013\000\013\000\013\000\013")
   
   let goto =
-    ((16, "\001\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\011\000\000\000\223\012\200\000\000\000\167\000_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003`\000\000\006\204\000\167\000_\000\000\000\000\000\000\000\000\000\000\017l\000$\008t\000\000\000\000\000\000\005\014\000\000\001\138\000\233\023\246\000\000\000\000\000\027\000\000\nH\000\000\007\178\019V\004\254\027\196\004\254\017\030)N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013^\027\196\000\000\000\000\013\128\000\000\014p\000\000\005\000\000\000\000\000\000\000\000\000\000\246\000\000$\198\000\000\000\000\008T\000\000\t\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000v\000\000\031.\000\000\031\194\000\000\"6\000\000%N\000\000'\192\000\000*X\000\000,f\000\000,\210\000\0002R\000\000 R\000\000\007\012\000\000\000\000\000\000\000\000\000\0008B\000\0009\246\000\000:\026\000\000\016\018\000\000\000\000\017r\000\000\000\000\000\211\000\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0009\000\164\000\000\000\136\000\000\000\000\002\236\000\00050\000\000\000\000\000\000\000\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\140\000\000\000\000\000\000\000\000\000\000\000\000\012\234)N\000\000\021\156\000\000\026d\026\154\000\000\000\000\000\000\0010\000\000&\002\000\000\000\0005\132\000\000\000\000\000\000\002\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\224\000\000#\146\000\000\000\000\000\000\000\000\000\012\000\000\000\0005\166\000\000\000\000\000\000 \146\002\182\000\000\000\000\000\000\000\000\000\000\000\000\n\002\000\000\018\232\000\000\022\174\000\000\023\216\000\000\024\238\000\000%\188\000\000%\246\000\000(H\000\000+\184\000\000-\028\000\000)\170\000\000\000\n\000\000/t\000\0003\012\000\0004X\000\000\000\000\000\000\000\000\000\000\000D6\028\000\000\002*\000\000\000\000\000-\016\238\000\000\002\158\000\000\000\000\000\000\005\180\000\000\000\000\000\000)f\000\000\000\000\000\000\000\000\000\000*\006\000\000\000\000\000\000\000\000\000\000\000\000\000\140\000\000\000\000\000\000\000\150\000\000\000\000\000\000\0026\000\000\000\000\011.\000\167\000\000\000\000\001\005\013F\000\000\000\000\000\000\000\000\000\000\004H\000\000\011r\000\000%n\000\000\000\000\004\178\000\000\000\000\000\000\000\000\000\000\000\000\012z\000\000\000\000\000\000\000\245\000\000\000\000\000\000\000\000\003B\015\204\000\000\002\138\000\000\000\000\001|\002\226\000\000\000\000\000\000\000\000\t\026\000\000\000\000\000\000\000\000\000\000\000\000\000'\0218\000\000\022\170\000\000\000\000\000\000\001\006\000\000\013\244\001~\000\000\016$\000\000\000\000\000\000\000\232\001\168\000\000\000\000\000\000\011>\000\000\000\000\001\206\000\000\000\242\000\000\000\000\000\000\000\000\001@\002\182\000\000\002D\000\000\000\000\000\000\000\000\000\000\000\00066\000\000\001(\000\0006\184\000\000\000\000\0024\000\000\008N\000\000\005\158\004V*\030\000\000\000\000\000\000\006\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015f*\030\000\000\015\240\000\000\021\204\019\150\000\000\000\000\000\000\004\224\000\000&X\000\000\000\0006\214\000\000\000\000\000\000\004\228\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\174\000\000&\196\000\000\000\000\000\000\004 \000\000\000\000\000\000\000\000\000\000\000\000\002\192\000\000\007j\000\000\014\030\000\000\0178\000\000\023\250\000\000\030D\000\000#\240\000\000'\172\000\000(\028\000\000)\238\000\000/\002\000\000\012\242\000\000.x\000\0005\008\000\0005&\000\000*\190\000\000\000\000\000\0007|\000\000\000\000\000\000\000\011\000\0007\184\000\000\000\000\000\0007\210\000\000\000\000\0000\000\000\026\176\000!\000\196\000\000\002\156\000\000\014\254\002l\tX\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008.\000\000*l\000x\005T\000\000\000\000\000\000/\008\000\000/\168\000\000/\190\000\000+\136,\012\000z\001\003\005X\000\000\000\000\000\000\000\183\000\000\000\000\001\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008j\000\000\000\000\000\000\000\000\000\000&\240\000\000,\134\000\000\000\000\000\000\000\000\000\000\000\000\015|\000\000\003\136\000\000\000\000\000\000\000\000\t\252\001\250\000\000\016\162\000\000\000\000\000\000\000W\000\000\000\000 \230\006\152\000\000\003`/\136\000\000\000\000,b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013|,b\000\000\018j\000\000\019\158\002t,\212\000\000\n\\\000\000\000\000\000\000\006\000\000\000'\168\000\000\000\0008n\000\000\000\000\000\000\006*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\142\000\0009^\000\000\000\000\000\000\022\028\000\000\000\00000\000\000\000\000\000\000\000\000\0062\000\000\000\000\000\000\005\226\000\000\000\000\007\174\000\000\002v\000\000\000\000\000\000\000R\000\000\007\216\000\000\020\134\000\000\027\"\000\0001\018\000\0003P\000\0004\244\000\0006(\000\0007\140\000\0008\000\000\0008\226\000\0009\\\000\000:.\000\000\000\000\000\000\000\000\000\000\000\228\000\000\013\012\000\000\027\182\002\222\000\000\028\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004v\000\000\000\000\000\000\000\000\000\000\000\000\003\158\000\000\000\000\022\138\000\000\000\000\000\0000\166\000\000\000\000\008\130\000\000\000\000\000\000\025T\000\000\000\000\000\000\000\0000\188\000\000\000\000\000\000\000\000\002\n\006\002\000\0001>\000\000\000\000\000\000\000\000\027D\003\210\000\000\028\140\000\000\000\000\006j\000\0001\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\252\000\000\000\000\028\030\000\000\000\000\000\0001\198\000\000\000\000\005\180\000\000\000\000\014\192\000\000\029 \000\000\000\000'\254\000\000\000\000\000\000\015<\000\000\000\000\028\234\000\000\000\000\000\000\000\0002\028\000\000\000\000\000\000\000\000\003<\008d\000\00022\000\000\000\000\000\000\000\000\000\000\000\000\016\200\000\000\000\000\006D\000\000\017F\000\000\015<\000\000\000\000\004>.~\000\000\005&\000\000\000\000\000\000\000\000\004 \000\000-f\000\000\029\212\001\182\030h\000\000\005\002\000\000\017\236\000\000\018\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\136\031\140\005\014  \000\000\000\000\000\000\006>\000\000\019\016\000\000\005\218\000\000\000\000\015z\001\222!D\000\000\006\188\000\000\019\220!\234\000\000\000\000\020Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\002\t\214\000\000\007\200\000\000\000\000\000\000\000\000\007r\000\000\021&\000\000\000\000\000\000\030\2169~\000\000\000\000\000\000$\160\000\000\000\000\000\000\000\000\n*\005`\000\000\000\0002\146\000\000\000\000\000\000\000\000\005h\000\000\000\000 F\000\000\000\000\000\0002\222\000\000\000\000\002.\000\000\000\0003v\000\000\000\000\004\018\005z\000\000\000\0003z\000\000\000\000\008@%P\000\000\006\166\000\000\000\0003\214\000\000\000\000\000\000\000\000\000\000\000\000\007\202\000\000\000\000\"\254\000\000\000\000\000\0003\236\000\000\000\000\000\000\000\000\000\000(\150\000\000\000\000\000\000\000-\000\000\000\000\000\0004\002\000\000\000\000\004&\008p\000\000\000\0004v\000\000\000\000\008Z\000\000\000\000\000\000\000\000\004 \000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\148\000\000\021d\000\000\000\000\000\0009\130\000\000\n\162\000\000\000\000\000\000\006p\000\000\000\000\003J\021\226\000\000\023.\000\000\000\000\000\000\003\148\000\000\"\170\007\004-V\000\0000\004\000\000\000\000\000\000\007L\000\000.*\007x.\192\000\000.\248\000\000\000\000\000\000\007\164\000\0000\156\007\232\000\000\000\000\001f\006j\007\252\014\026\000\000\015\164\000\000\000\000\000\000\007\254\000\0005\252\008\024\000\000\000\000\000\000\002l\000\000\000\000\000\000\000\000\000\000\003.\000\000\000\000\003^\000\000\000\022\000\000\000\000\000\000\003\156\000\000\000\000\000\000\000\000\000\000\000C\000\000\008\184\003\192\001B\000\000\000\000\004\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\246\000?\000\000\000\000\000\003\000\000\000\000\000\000\004\198\000\000\000\000\006~\008H\000\000\000\000\000\000\000\000\017p\019D\004\234\000\000\022\016\000\000\000\000\000\000\000\000\000\000\000\000\003.\000\000\000\000\004\180\000\000\000\000\003\170\000\000\000\000\003|\000\000\000\000\003\222\000\000\t\012\004d\002z\000\000\000\000\008\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\252\022\140\000\000\000\000\000\000\000\000\023\024\000\000\000\000\011:\000\000\000\000\015\026\000\000\000\000\000\000\023@\000\000\000\000\0009\023`\005\136\000\000\024L\000\000\000\000\000\000\000\000\000\000\000\000\005\154\000\000\t\012\007\250\000\142\000\000\000\000\000\000\000\000\002`\000\000\000\000\000\000\000\000\000\000\000\000\008\008\000\000\000\000\004\024\000\000\t,\006X\003\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\200\000\000\000\000\019(\024V\000\000\000\000\000\000\000\000\002T\000\000\003\156\000\000\0208\000\000\000\000\000\000\000\000\000\000\000\000\000\011\020\164\000\000\000\000\021\128\000\000\000\000\000\000\000\000\000B\000\000\021\254\000\000\000\000\000\000\000\000\004\190\000\000\000\000\000\000\000\155\000\000\000\000\000Y\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\190\007\228\000\000\000\000\000\000\001\006\000\000\000\000\026\234\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000-\000\000\000\000\000\000\000\000\000\000\000\144\n\156\000\167\013\028\019\030\005\210\000\000\000\000\0030\006\188\008\148\t\"\000\000\000\000\000\000\000\000\000\000\000\000\004\170\023\172\000\000\"(\008\008\000\000\000\000\t<\000\000\024x\000\000\025n\000\000\000\000\005\024\024\182\000\000\"\216\000\000\007.#\188\000\000\000\000\000\000\018\020\0030\000\000\008r\000\000\000\000\000\000\008\230\000\000\011\000\000\000\008.\006\170\000\000\000\000\000\000\000\000\004H\000\000\004\178\000\000\008\180\000\000\000\000\020\130\000\000\000\000\000\000\000\000\011 \000\000\000\000\0030\t\246\000\000\026\\\000\000\015<\006`\000\000\000\000\000\000\000\000\000\000\004\174\000\000\000\000\000\000\000\000\000\0004\132\008\140\000\000\003\164\000\000\000\000\000\000\000\000\000\000\001\216\000\000\011\238\t\200\012l\000\000\003\180\013v\000\000\t\228\000\000\0048\000\000\005\128\000\000\006\004\000\000\000\000\000\000\000\000\000\000\008\232\000\000\007L\000\000\n\002\000\000\007\208\000\000\015<\006\206\000\000\006(\000\000\006\240\006\004\000\000\006\156\000\000\008\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\250\000\000\t`\000\000\000\000\000\000\000\000\000\000\0064\000\000\000\000\006z\008\148\007\224\000\000\008\018\000\000\000\000\003\222\n\020\000\000\007j\000\000\000\000\000\000\000\000\008\188\000\000\000\000\000\000\000\000\000\000\000\000\008\190\008\192\t\146\t.\008\230\t.\000\000\000\000\008\224\t\164\t^\t\030\t^\000\000\000\000\006L\000\000\000\000\000\000\000\000\n0\000\000\000\000"), (16, "\001\200\001\223\000>\000h\002u\004g\000\017\001<\002!\002\"\000\n\004|\000\005\004\206\000>\002E\001g\000*\002m\003n\003V\000\210\004e\000\211\001i\000>\004h\004t\004}\004t\004\207\004\210\004t\001?\004\225\000\t\000\008\000\t\003\007\005\026\005\027\004\127\000\016\004P\003!\000\166\001\202\000j\000*\004d\001\203\004\226\000k\002G\004\229\004t\000l\002\143\004}\004t\002\147\004\224\005\031\005 \0008\000j\004e\0009\000\212\002F\004h\004t\000\213\004\013\004\206\000h\001\200\001\223\000*\000i\000u\001+\005$\0055\005\006\004u\0056\004u\001\200\001\223\004u\004\207\004\210\004t\005b\003\157\003b\001\228\000\226\001 \005c\000j\000>\0008\005:\002\148\005d\002F\003 \002\149\001h\002!\002\"\004u\005\t\001-\004\214\004u\001h\000j\002[\000*\001\202\001\133\000k\004\019\001\203\000F\000l\004u\002\143\004\215\003!\002\147\001\202\002\\\001%\000\247\001\203\001@\001\135\0053\001\156\000\163\000\176\001\216\000>\000\210\000F\000\233\002a\004u\000u\003C\002b\000\163\001D\003(\000+\001\217\003\159\003|\000v\0053\001\200\001\223\000\163\000\164\003)\003h\001'\000\175\003j\001\228\002[\002v\005f\005*\002\148\004W\000\227\001\158\002\149\000*\002T\004\031\000w\000*\001x\002f\000>\000j\002\247\003W\000\212\003v\003\247\005g\000\213\004\128\003<\004\239\002\162\000\248\003\141\004k\003N\001\232\002[\000>\001\202\002\\\000*\002m\001\203\005\001\002\163\000\173\000\177\001A\000>\001\216\005\012\002\\\000\226\001E\002a\001\233\002$\001\023\002b\002H\001\234\001\216\000v\001\217\001\235\004v\002a\004B\004\216\001\236\002b\000\163\001D\003(\005i\001\217\003j\000\252\001t\000j\001\200\001\223\003p\005j\005\132\000*\000w\002\187\005\133\004\014\005\019\000\255\005\160\002f\000>\002K\002L\002N\005d\005\161\003 \001\136\003\143\002\162\002\228\002f\002\226\004l\000\017\0037\005\135\001\232\002\190\004\016\002\195\001\152\003<\002\163\001\135\000>\005\137\000n\003N\001\232\003!\000\186\001\202\002\\\002\198\001\146\001\203\001\233\004\219\000y\000\227\005\179\001\234\001\216\002\229\000*\001\235\000j\002a\001\233\002\193\001\236\002b\000}\001\234\003\020\000\215\001\217\001\235\001@\001\200\001\223\000>\001\236\002\143\001\162\005+\002\147\003\153\001\154\002d\004\225\001\159\003\007\000>\0009\000\017\000*\002m\003n\003V\002!\002\"\004\218\000\163\001D\003(\002f\004\226\000\251\005\180\004\229\004t\002\195\004\167\000\163\000\176\003)\004\215\005.\001\139\000F\001\200\001\201\003!\001\232\001\202\002\196\000j\000\252\001\203\004\168\002\148\001%\000\253\001\153\002\149\002\143\000\254\000*\002\147\002\\\004C\000\255\000h\001\233\000*\004o\000q\003<\001\234\001\216\003x\003A\001\235\003N\002a\0009\000>\001\236\002b\000\163\001D\003(\005\182\001\217\000j\001&\001\202\001B\004u\004\254\001\203\005j\005\132\002H\003}\001\228\005\184\001 \004U\002[\002o\000*\004\027\002\148\000\163\000\176\000j\002\149\001\161\000>\001+\000k\001\163\002f\005E\000l\000>\0037\005\186\000>\002\143\000F\001n\002\169\003<\000F\003\008\004\151\005\188\002J\003N\001\232\002\194\002\\\000>\004V\002#\002!\002\"\000u\004z\000\163\000\164\001\216\001,\004\216\003O\002\162\002a\000E\000\250\001\233\002b\000\163\001D\003(\001\234\001\217\004\160\003\127\001\235\002\163\001\200\001\223\000j\001\236\003)\000F\002\148\003\203\003j\004\167\002\149\001I\000\224\004\161\000>\004\164\004t\004\018\005d\005\166\003V\004\\\002\187\001\216\003\029\002f\004\168\002\193\005\001\003W\000\173\003v\004a\000*\003\030\005\002\003<\001\217\002\162\004\029\003\141\002\233\003N\001\232\003!\004\163\001\202\002\190\005\154\000F\001\203\005\155\002\163\001q\000\248\000\163\000\164\001 \004\171\000v\005\176\000>\004\161\001\233\004\164\004t\001\200\001\223\001\234\002\165\004%\000>\001\235\004\228\004u\000\180\004W\001\236\000\171\002\193\000>\001\200\001\223\000w\005d\005\166\003V\004'\000\163\000\164\004\226\003\209\002i\004\229\004t\000\163\000\176\001u\000\163\001D\005I\003\253\005\159\002\162\000\172\001\233\000\173\004(\004q\000\149\003!\001F\001\202\000\163\000\164\002\236\001\203\002\163\000*\001\238\002!\002\"\002\195\004u\004'\000j\005\171\001\202\002\245\004\157\000y\001\203\004\173\005\228\000\150\002\\\002\196\004\152\000\151\000\173\001%\000*\000>\000F\000{\001\216\000\178\001p\001w\001s\002a\003e\004u\004\155\002b\000\163\001D\003(\005\172\001\217\004\154\0053\001(\004|\000\173\000h\000h\005j\005\132\000q\000i\000*\002d\004n\001\231\002!\002\"\005\022\001\228\000>\004}\004t\005\145\005\146\004\176\003g\003p\000>\000D\002f\000C\002\252\003\130\003W\000*\005\174\000*\004\232\004\142\004t\003<\002\\\000\163\000\176\003A\005\237\003N\001\232\000*\000j\000j\001\216\000\163\000\176\000k\000k\002a\000E\000l\000l\002b\000\163\001D\003(\005\172\001\217\001\216\001\233\001b\004\016\001\200\001\223\001\234\005j\005\132\005\150\001\235\005M\002d\004u\001\217\001\236\000u\000u\000>\001\200\002\014\004l\005d\005\166\003V\000F\000*\001\230\000*\002f\000h\004u\000*\003W\000i\005\174\000*\001\030\001 \0036\003<\003e\004\209\005\024\003A\000*\003N\001\232\003!\003\030\001\202\004\200\004t\002\143\001\203\001^\002\147\000\163\000\164\004\207\004\210\004t\001\232\000j\005\173\001\202\005[\001\233\0053\001\203\001\200\001\223\001\234\002\246\000j\003f\001\235\000>\001\205\000k\001\214\001\236\001\233\000l\000>\001\200\001\201\001\234\005d\005\166\003V\001\235\000F\003\138\000\163\000\164\001\236\002[\000v\000v\002u\002\148\000\163\001D\003s\002\149\004\152\000u\000\173\003\132\004u\003\\\000*\000*\003!\001F\001\202\001\"\003\130\004u\001\203\003\030\000w\000w\005\239\004\131\001m\003\140\005\004\000j\005\175\001\202\005\240\000*\003\138\001\203\0025\000*\002D\002\\\003,\006\000\000F\001(\002\143\000\173\000F\002\147\000\149\001\216\006\001\001p\002u\001s\002a\000F\004\234\004|\002b\000\163\001D\003(\005\172\001\217\001\216\000*\005\014\000>\003\139\000y\000\188\005j\005\132\000\150\004}\004t\002d\000\151\001\217\005@\005E\003\143\002\187\000{\000>\000@\001~\000C\002[\000v\003\185\005\143\002\148\002f\003\193\000*\002\149\003W\002\162\005\174\005\205\002\189\000h\003\210\003<\002\\\000i\002\190\003A\005\190\003N\001\232\002\163\000w\000E\001\216\002!\002\"\000\163\000\164\002a\005r\002\151\000F\002b\000\163\001D\003(\005\172\001\217\001\216\001\233\005\194\004u\001\200\001\223\001\234\005j\005\132\002\193\001\235\003\146\002d\002\160\001\217\001\236\000j\002\185\000>\001\200\001\201\000k\005d\005\166\003V\000l\004\030\005\213\005\248\002f\0010\003\135\003\168\003W\005\218\005\174\000\210\005\001\000\211\000\173\003<\003\021\003\030\002\187\003A\000F\003N\001\232\003!\000u\001\202\003\162\002\195\002\143\001\203\000\210\002\147\0016\003\025\002\162\002\223\002\240\002\226\000j\005\183\001\202\002\196\001\233\002\190\001\203\001\200\001\223\001\234\002\163\002\143\000F\001\235\002\147\000\163\001D\000j\001\236\001\222\000\212\000>\003\164\005\219\000\213\005d\005\166\003V\005s\004/\003\"\002\229\000\163\001D\002[\005H\000j\002\193\002\148\000\212\005`\005\212\002\149\000\213\005Q\001F\0041\003&\000*\005\224\000\226\003!\004\137\001\202\003\030\000j\001m\001\203\004\225\002\148\003\219\005v\004\029\002\149\005w\0042\000\173\005\187\000v\000\226\001\200\001\223\004\215\000h\005\223\004\226\002\\\000s\004\229\004t\002\195\001p\0041\001s\000>\0049\001\216\003\162\002m\003n\003V\002a\000w\004|\002\196\002b\000\163\001D\003(\005\172\001\217\001\216\004;\000>\000@\000A\000C\004<\005j\005\132\004}\004t\002u\002d\003!\001\217\001\202\000j\000\147\002\187\001\203\003\163\000k\005E\004;\000*\000l\002u\0050\005\233\002f\000*\000\227\000E\003W\002\162\005\174\004u\002\192\000y\003\007\003<\002\\\004?\002\190\003A\004\003\003N\001\232\002\163\000u\000\227\001\216\000{\004H\004K\002\162\002a\000F\004\003\0041\002b\000\163\001D\003(\005\172\001\217\004N\001\233\004u\002\163\004J\004J\001\234\005j\005\132\002\193\001\235\004\170\002d\004\005\004\221\001\236\001\233\0041\005x\000>\000@\001z\000C\000j\0051\004r\004\004\005E\004\168\002f\001\240\005T\005h\003W\000\232\005\174\001\200\001\223\002\\\003\229\003<\003\030\005\205\005\205\003A\005\152\003N\001\232\001\216\000E\000>\005\225\002\195\002a\002m\003n\003V\002b\000\163\001D\003(\004s\001\217\004\022\003|\000v\002\196\001\233\000F\004\174\004\222\003)\001\234\002\195\000F\002d\001\235\000\163\001D\004\237\003!\001\236\001\202\000F\004\235\005z\001\203\002\200\003\008\000w\001F\005\181\002f\000h\005\205\0051\003W\000s\003v\001\200\001\223\001m\005\235\003<\005G\004\175\004\223\003A\0051\003N\001\232\005\163\005y\000>\004\135\000x\003P\002m\003n\003V\004\236\000\210\003\254\000\211\005\134\005\163\001p\005\244\001s\005\241\001\233\003\013\000>\003T\003\030\001\234\000y\000j\005l\001\235\005\163\000\160\000k\003!\001\236\001\202\000l\005\242\003\017\001\203\000{\005\251\005\245\005\177\0051\000>\000\210\005\227\000\233\005\246\000\163\001D\002t\005\249\005\238\000j\002\143\005\169\000\212\002\147\000u\002\\\000\213\001F\004\168\005F\005\206\005\208\005\243\005y\005\252\001\216\005\185\005\253\001m\003\184\002a\005\250\006\005\000\000\002b\000\163\001D\003(\000\000\001\217\003z\003|\000\226\005\237\000j\001\200\001\223\000\212\003)\000\000\000\000\000\213\002d\001p\000j\001s\000>\000\000\002\148\000>\005>\000\000\002\149\002m\003n\003V\000\000\005\237\000\000\002f\000\000\000\000\005\210\003W\000\238\003v\000\000\000\226\002\\\000\000\003<\000\000\000\000\000\000\003A\000\000\003N\001\232\001\216\003!\000\000\001\202\000\000\002a\000\000\001\203\000v\002b\000\163\001D\003(\000\000\001\217\003\161\003|\000\000\000>\001\233\001\200\001\223\000\000\003)\001\234\000\000\004\160\002d\001\235\000\163\001D\000\000\000w\001\236\000>\000\000\000\227\000\000\002m\003n\003V\000>\002\249\004\161\002f\004\164\004t\005\238\003W\000>\003v\000\000\000\163\001D\000\000\003<\005\238\004\160\000x\003A\000\000\003N\001\232\000\000\003!\003\190\001\202\002\162\000\000\000\000\001\203\000\227\005{\000\000\004\161\000>\004\164\004t\003\005\000y\003\019\002\163\001\233\0017\000z\000\000\000\000\001\234\000\000\000\000\000\000\001\235\002\\\000{\001Y\000\000\001\236\000\241\000\000\000\000\000\000\003\202\001\216\003\208\004u\000\252\000\000\002a\001S\000\163\005?\002b\000\163\001D\003(\000\000\001\217\004\026\003|\001\001\000\251\005K\005B\001\200\001\223\003)\000\000\000\000\001Y\002d\000\000\000\000\000\000\000\000\001\150\004u\000\000\000>\000\000\000\000\000\252\005d\001S\003 \000\000\000\253\002f\000\000\000\000\000\254\003W\002\164\003v\000\000\000\255\002\\\000\000\003<\000\000\000\163\001D\003A\000\000\003N\001\232\001\216\000\000\003!\000\000\001\202\002a\000\000\005s\001\203\002b\000\163\001D\003(\000\000\001\217\005\130\003|\000\163\001D\001\233\005\178\001\200\001\223\003)\001\234\000\163\000\164\002d\001\235\000\000\001T\000\000\000\000\001\236\000\000\000>\005~\000\000\005\127\005d\005v\003 \000>\005w\002f\000\173\000\000\000\000\003W\004\182\003v\000\163\001D\000\000\000\000\003<\000\000\000\000\001_\003A\001j\003N\001\232\001\\\001T\003!\001]\001\202\000\173\000\000\000\000\001\203\000\000\000\000\001(\000\000\000\173\000\000\000\000\000\000\004\188\000>\001\233\005\164\000\210\000\000\000\231\001\234\001\200\001\201\004\225\001\235\001_\002\\\001`\001Y\001\236\001\\\000\000\000\000\001]\002\143\000\173\001\216\002\147\000\000\000\000\004\226\002a\001S\004\229\004t\002b\000\163\001D\003(\005\165\001\217\000\000\000\000\000\000\000\000\000\000\000>\000\000\005j\005\132\005>\000j\000\000\005\168\000\212\000j\000\000\001\202\000\213\000\000\000\000\001\203\000\000\000\000\000\000\000h\000\000\000>\002[\000\193\002f\000\000\002\148\000\000\0037\005\170\002\149\001\200\001\223\002\\\002\143\003<\000h\002\168\000\226\003A\000\190\003N\001\232\001\216\000\000\000>\004u\000\000\002a\005d\000\000\003 \002b\000\163\001D\003(\005\165\001\217\000\000\000\000\000\163\001D\001\233\000j\000\000\005j\005\132\001\234\000k\000\000\005\168\001\235\000l\001T\001R\003!\001\236\001\202\000j\000\000\000j\001\203\002\148\000\000\000\000\000k\002\149\002f\001S\000l\000\000\0037\005\170\005\167\001\200\001\223\000u\000\000\003<\000\163\000\164\001_\003A\001e\003N\001\232\001\\\002\187\000>\001]\001\216\000\173\002m\000u\003 \001\200\001\201\000\000\000\000\000\000\000\227\000\000\000\000\002\162\001\217\001\233\002\230\000>\000\000\000\000\001\234\002m\002\190\000\000\001\235\000\000\000\000\002\163\003!\001\236\001\202\000\163\005?\000\000\001\203\000\000\000\000\000\000\001\128\000\000\000\173\000\000\000\000\005J\005B\004\242\000h\004B\002\232\000j\000\189\001\202\000\163\001D\002\193\001\203\002\\\000\000\000\000\000\000\004 \000\000\002\004\000\000\003\156\001T\001\216\000\000\000v\002\162\000\000\002a\000\000\000\000\000\000\002b\000\163\001D\003(\005\165\001\217\000\000\001\233\002\163\000\000\000v\001\200\001\223\005j\005\132\000j\002\238\000w\005\168\0039\000k\001\236\002\195\001\\\000l\000>\001]\000\000\000\173\002m\003:\003V\000\000\000\000\000w\002f\002\196\000\000\000\000\0037\005\170\000\000\001\200\001\223\002\\\000\000\003<\000\000\000u\000\000\003A\000\000\003N\001\232\001\216\003!\000>\001\202\000\000\002a\002m\001\203\003 \002b\000\163\001D\003(\000\000\001\217\000\000\000\000\000\000\000\000\001\233\000\000\001\216\000\000\003)\001\234\000\000\004\160\003\145\001\235\000\163\001D\003(\003!\001\236\001\202\001\217\000\000\000\000\001\203\000\000\001\200\001\221\003)\004\161\002f\004\164\004t\000\000\0037\003\147\002u\001\200\001\223\000\000\000\000\003<\000\000\000\000\002k\003A\000\000\003N\001\232\003\007\003\154\000>\000\000\004E\003\156\002m\003\027\003 \000\000\000\000\003<\000\000\000v\000\000\003A\000\000\003N\002u\001\233\000\000\000j\000>\001\202\001\234\000\000\002m\001\203\001\235\002\\\000\000\003\007\003!\001\236\001\202\000\000\000\000\000w\001\203\001\216\001\233\004u\000>\001o\002a\000C\001\200\001\220\002b\000\163\001D\003(\004B\001\217\001\242\000\000\000\000\000\000\000\000\000\000\002\\\000\000\003)\000h\000\000\000\000\002d\000s\000\000\000\000\001\216\000\000\000E\000\000\001+\002a\000\000\000\000\000\000\002b\000\163\001D\003(\002f\001\217\000\000\000>\003W\000\000\003X\000j\000\000\001\202\003)\003<\000\000\001\203\003\145\003A\000\000\003N\001\232\000\000\000\000\000\000\000\000\000\000\000j\001-\000\000\000F\000\000\000k\000\000\002f\003C\000l\000\000\0037\003\147\000\000\001\233\001\216\002\\\000\000\003<\001\234\000\000\000\000\003A\001\235\003N\001\232\001\216\000\000\001\236\001\217\000\000\002a\001Y\000u\000F\002b\000\163\001D\003(\003C\001\217\000\000\000>\000\000\004\191\001\233\001S\001\200\001\223\003)\001\234\003H\000\000\003[\001\235\003Y\000\163\001D\003(\001\236\000\000\000>\000\000\000\000\000\000\002m\003:\003V\003L\003)\002f\000\000\000\000\000\000\0037\003]\000\163\001D\000\000\000\000\000>\003<\003H\000\000\001\216\003_\000\000\003N\001\232\001F\000\210\003!\000\233\001\202\004G\001Y\000\000\001\203\001\217\003L\001m\003<\000\000\001\200\001\201\003A\000\000\003N\001\233\001S\001\200\001\223\000\000\001\234\000\000\000v\000\000\001\235\003^\000\000\000\163\001D\001\236\000\000\000>\001p\000\000\001s\002m\003:\003V\000\000\000h\001T\000j\000\000\000s\000\212\000\000\000w\000\000\000\213\000\000\000>\000\000\000\000\001|\000j\000\000\001\202\000\000\000\000\000\000\001\203\003!\000\000\001\202\004|\000\000\000\000\001\203\001_\000\000\001\141\000\238\000x\001\\\000\226\000\000\001]\000\000\000\173\000\000\000E\004}\004t\000j\000\000\000\000\000\000\000\000\000k\002\\\000\163\001D\000l\000y\000\000\000\000\000\000\000\000\000\159\001\216\001\200\001\223\000\000\001T\002a\000\000\000\000\000{\002b\000\163\001D\003(\000\000\001\217\000>\000\000\000u\000\000\002m\003n\003V\000\000\003)\000\000\000\000\000\000\002d\000\000\000\163\000\164\000\000\001_\000\000\002q\000>\000\000\001\\\000\000\005>\001]\004u\000\173\000\000\002f\003!\000\000\001\202\003W\000\000\003X\001\203\000\000\002\\\000\000\003<\001\216\000\227\000\000\003A\000\000\003N\001\232\001\216\002\143\002t\000\000\002\167\002a\000\239\001\217\000\000\002b\000\163\001D\003(\000\000\001\217\001*\000\000\000\173\000\000\001\233\000\241\001\200\001\223\003)\001\234\000\000\000\000\002d\001\235\000\163\001D\000\000\000\000\001\236\000\000\000>\000v\000\000\000\000\002m\003n\003V\001F\000\251\002f\000j\000\000\000\000\003W\002\148\003X\000\000\000\000\002\149\000\000\003<\000\000\000\000\000\000\003A\000w\003N\001\232\000\252\000\210\003!\000\211\001\202\000\253\000\000\000\000\001\203\000\254\002\\\000\000\001\233\000\000\000\255\001p\000\000\001s\000\000\001\233\001\216\001\200\001\223\000x\001\234\002a\001\244\004\148\001\235\002b\000\163\001D\003(\001\236\001\217\000>\003u\000\000\000\000\002m\003n\003V\000>\003)\000y\000j\005>\002d\000\212\000\162\000\163\001D\000\213\000\000\000\000\000\000\000h\004\160\000{\000\000\000q\000\000\005A\005e\002f\003!\000\000\001\202\003W\000\000\003v\001\203\000\000\004|\004\161\003<\004\164\004t\000\226\003A\000\000\003N\001\232\002\162\000\000\000\000\000\000\000\000\001\200\001\201\004}\004t\002\143\002\\\000\000\002\166\000\000\002\163\000\000\003\005\000j\003\019\001\233\001\216\000\000\000k\000\000\001\234\002a\000l\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\003w\000\000\000\000\000\000\001\200\001\223\000\000\003)\000\000\000\000\000\000\002d\000\000\000j\000u\001\202\004u\000j\000>\001\203\000\000\002\148\002m\003\148\003V\002\149\000\000\000\000\002f\000\000\004u\000\000\003W\000\000\003v\0011\000\000\002\\\000\000\003<\000\000\000\227\000\000\003A\000\000\003N\001\232\001\216\003!\000\000\001\202\000\000\002a\000\000\001\203\000\000\002b\000\163\001D\003(\000\000\001\217\000\000\003\137\000\163\005?\001\233\001\200\001\223\000\000\003)\001\234\000\000\004\225\002d\001\235\005A\005B\000\000\000\000\001\236\000>\003\150\000\000\000\000\002m\003\148\003V\000\000\002\143\004\226\002f\002\147\004\229\004t\003W\000v\003v\000\000\000\000\000\000\000>\003<\000\000\000\000\000\000\003A\000\000\003N\001\232\000\252\003!\000\000\001\202\001\216\001\"\000\000\001\203\002\162\000\000\000w\000\000\000\000\000\000\001\003\000\000\004\248\004\225\001\217\001\233\000\000\000\000\002\163\000j\001\234\000\000\000\000\002\148\001\235\002\\\000\000\002\149\004\146\001\236\004\226\003\152\000\149\004\229\004t\001\216\000\000\000\000\004u\000\000\002a\005{\000\000\000\000\002b\000\163\001D\003(\000\000\001\217\000\000\000\000\000\000\000y\000\000\001\200\001\223\000\150\003)\000\000\000\000\000\151\002d\003\170\000\000\000\000\000\000\000{\000\000\000>\000\000\000\000\000\000\002m\003:\003V\000\000\000\000\000>\002f\000\000\000\000\001\218\003W\000\000\003\151\001\200\001\223\002\\\000\000\003<\000\000\004u\000\000\003A\000\000\003N\001\232\001\216\003!\000>\001\202\000\000\002a\002m\001\203\003 \002b\000\163\001D\003(\000\000\001\217\000\000\000\210\000\000\000\230\001\233\000\000\000\000\002\162\003)\001\234\004\225\000\000\002d\001\235\000\000\000\163\001D\003!\001\236\001\202\000\000\002\163\000\000\001\203\000\000\001\200\001\219\004\226\005s\002f\004\229\004t\000\000\003W\004\255\003\151\001\200\001\223\000\000\000\000\003<\000\000\000\000\000\000\003A\000j\003N\001\232\000\212\004\020\000>\000\000\000\213\003\156\002m\000\000\003 \005}\000\000\000\000\000\000\005v\000\000\000\000\005w\002\143\000\173\001\233\002\147\000j\000\000\001\202\001\234\004\225\000\000\001\203\001\235\002\\\000\226\000\000\003!\001\236\001\202\000\000\000\000\004|\001\203\001\216\005\007\004u\004\226\002\195\002a\004\229\004t\000\000\002b\000\163\001D\003(\000\000\001\217\004}\004t\000\000\002\202\000\163\000\164\002\\\002[\003)\000\000\004\"\002\148\002d\000\000\003\156\002\149\001\216\000\000\000\000\000\000\000\000\002a\000\000\000\000\000\000\002b\000\163\001D\003(\002f\001\217\000\000\000>\003W\000\000\003X\000\210\000\000\000\211\003)\003<\000\000\000\000\003\145\003A\004|\003N\001\232\000>\000\000\004u\000\000\000\000\001\130\000\000\000\173\000\000\000\000\000\227\004u\002f\000\000\004}\004t\0037\003\147\000\000\001\233\001\216\002\\\000\000\003<\001\234\000\000\000\000\003A\001\235\003N\001\232\001\216\000j\001\236\001\217\000\212\002a\001Y\000\000\000\213\002b\000\163\001D\003(\002\187\001\217\000\000\000\000\005\n\000\000\001\233\001S\001\200\001\223\003)\001\234\000\000\000\000\003\145\001\235\002\162\002\223\002\224\002\226\001\236\000\226\000>\004|\000\000\002\190\002m\000\000\003 \004u\002\163\002f\000\000\000\000\000\000\0037\003\147\000\000\000\000\000\000\004}\004t\003<\004|\000\000\000\000\003A\000\000\003N\001\232\000\000\002\229\003!\000\000\001\202\000\000\000\000\002\193\001\203\004|\004}\004t\000\000\000\000\000\000\000\000\000\000\005\017\000\000\001\233\000\000\001\200\001\223\000\000\001\234\000\000\004}\004t\001\235\004\144\000\000\000\163\001D\001\236\004$\000>\000\000\000\000\003\156\002m\000\000\003 \000\000\000\210\001T\000\211\000\000\000\163\000\164\004u\002\195\000\000\000\000\000\227\000\000\000\000\000\000\000\000\000h\000\000\001\200\001\201\000q\000\000\002\196\003!\000\000\001\202\000\000\004u\000\000\001\203\001_\000\000\002\255\000\000\000\000\001\\\000\000\000\000\001]\000\000\000\173\000\000\000\000\004u\000\000\000j\000\000\000\000\000\212\004\180\000\000\002\\\000\213\000\000\001\132\005N\000\173\000\000\000\000\003\156\000j\001\216\000j\000\000\001\202\000k\002a\000\000\001\203\000l\002b\000\163\001D\003(\000\000\001\217\000\000\000\000\000\226\001=\000\252\001\200\001\223\000\000\003)\004|\000\000\000\000\003\145\005V\004|\000\000\000\000\000u\001\005\000>\000\000\000\000\000\000\002m\003:\003V\004}\004t\000\000\002f\000\000\004}\004t\0037\003\147\000\000\001\200\001\223\002\\\000\000\003<\000\000\000\000\004\185\003A\000\000\003N\001\232\001\216\003!\000>\001\202\000\000\002a\002m\001\203\003 \002b\000\163\001D\003(\000\000\001\217\004\195\000\210\000\000\000\211\001\233\000\000\000\000\000\000\003)\001\234\000\000\000\000\003\145\001\235\000\000\000\000\004\204\003!\001\236\001\202\000\000\000\227\004u\001\203\001\216\000\000\000\000\004u\000\000\002f\000\000\000\000\000\000\0037\003\147\000\000\000v\000\000\001\217\000\000\003<\000\000\000\000\000\000\003A\000j\003N\001\232\000\212\005\\\000\000\000\000\000\213\003\156\000\000\000\148\000\000\000\000\000\000\000\000\000w\000\000\000\000\000\000\000\000\002\143\000>\001\233\002\147\000\000\000\000\000\000\001\234\000\000\000\000\000\000\001\235\002\\\000\226\000\000\000\000\001\236\000\000\000\000\000\000\000\000\000\149\001\216\000\000\000\000\000\252\000\000\002a\000\000\000\000\000\000\002b\000\163\001D\003(\000\000\001\217\000\000\000\000\001\007\000\000\001\233\000y\002\\\002[\003)\000\150\000\000\002\148\002d\000\151\000\000\002\149\001\216\001Y\001\246\000{\000\000\002a\000\000\000\000\000\000\002b\000\163\001D\003(\002f\001\217\001S\004\202\003W\000\000\003X\000\000\004\246\000\000\003)\003<\000\000\000\000\003\145\003A\000\000\003N\001\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\227\000\000\002f\000\000\000\000\000\000\0037\003\147\000\000\001\233\000\000\000\000\000\000\003<\001\234\000\000\000\000\003A\001\235\003N\001\232\000\000\000\000\001\236\001\200\001\223\000\000\000\000\000\210\000\000\000\229\000\000\005\136\000\000\002\187\000\000\000\000\000\000\000>\000\000\001\233\000\000\002m\003:\003V\001\234\000\000\000\163\001D\001\235\002\162\002\223\005X\002\226\001\236\000\210\000\000\000\211\000\000\002\190\001T\000\000\000\000\000\000\002\163\003\165\001\200\001\223\003!\000\252\001\202\000\000\000j\000\000\001\203\000\212\000\000\000\000\000\000\000\213\000>\000\000\000\000\001\t\002m\002\229\003V\000\000\001_\000\000\003\n\002\193\000\000\001\\\000\000\000\210\001]\000\233\000\173\000j\000\000\000\000\000\212\000\000\000\000\000\226\000\213\000\000\000\000\000\000\003!\000\000\001\202\000\000\000\000\000\000\001\203\000\000\000\000\000\000\000\000\000\000\000\000\002\143\000\000\005-\002\147\000\000\000\000\000\000\000\000\000\000\000\226\000\000\002\195\000\000\000\000\000\000\000\000\000j\001\200\001\223\000\212\000\000\000\000\000\000\000\213\000\000\002\196\000\000\000\000\003Z\000\000\000\000\000>\000\000\000\000\000\000\002m\002\\\003 \000\000\000\000\000\000\000\000\000\000\000\000\000j\000\000\001\216\000\000\002\148\000\226\000\000\002a\002\149\000\000\000\000\002b\000\163\001D\003(\000\000\001\217\003!\000\000\001\202\000\227\000\000\000\000\001\203\000\000\003)\000\000\000\000\000\000\002d\002\143\000\000\000\000\002\147\002\\\000\000\000\000\000h\000\000\000\000\000\000\000q\000\000\000\000\001\216\000\000\002f\000\227\000\000\002a\003W\000>\003X\002b\000\163\001D\003(\003<\001\217\000\000\000\000\003A\000\000\003N\001\232\000\000\000\000\003)\000\000\000\000\000\000\003\167\000\000\000\000\002[\000\000\000\000\000\000\002\148\000\000\000\000\000j\002\149\000\000\001\233\000\000\000k\000\227\002f\001\234\000l\000\000\003W\001\235\003\169\000\000\000>\000\000\001\236\003<\000\000\002\162\000\000\003A\000\000\003N\001\232\000\000\002\\\000\000\000\000\000\000\000\000\005+\000u\002\163\000\228\000\000\001\216\000\000\000\000\000\000\000\000\002a\000\000\000\000\001\233\002b\000\163\001D\003(\001\234\001\217\000\000\000\000\001\235\000\251\001\200\001\223\000\000\001\236\003)\000\000\000\000\000\000\0035\000\000\000\000\003\031\001Y\000\000\000>\000\000\000\000\000\000\002m\000\252\003 \000\000\002\187\000\000\000\253\002f\001S\000\000\000\254\0037\0038\000\000\002\143\000\255\000\000\002\147\003<\000\000\002\162\000\000\003A\002\230\003N\001\232\003!\000\000\001\202\002\190\002\195\000\000\001\203\000\000\002\163\000\000\000\000\000\163\000\164\000\000\000\000\000v\000\000\000>\002\204\001\233\000\000\000\000\000\000\000\000\001\234\000\000\000\000\000\000\001\235\002\232\001\200\001\223\002[\001\236\000\191\002\193\002\148\000\000\000\000\000w\002\149\003;\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \000\000\000\000\000\000\000\000\000\000\000\163\001D\000\000\000\000\001.\000\000\000\173\000\000\000\000\000\149\000\000\000\000\000\000\001T\001Y\000\000\002\237\000\000\003!\000\000\001\202\000\000\002\195\000\000\001\203\000\000\000\000\000\000\001S\000\000\000y\000\000\000\000\000\000\000\150\002\\\002\196\000\000\000\151\000\000\000\000\001_\000\000\003/\000{\001\216\001\\\000\000\000\000\001]\002a\000\173\000\000\000\000\002b\000\163\001D\003(\000\000\001\217\000\000\002\187\000\000\000\000\001\200\001\223\000\000\000\000\003)\000\000\000\000\000\000\0035\000\000\000\000\000\000\000\000\002\162\000>\000\000\002\230\000\000\002m\000\000\003 \000\000\002\190\000\000\000\000\002f\000\000\002\163\000\000\0037\0038\000\000\000\000\000\000\000\000\000\000\003<\000\000\000\163\001D\003A\000\000\003N\001\232\003!\002\\\001\202\000\000\002\232\000\000\001\203\001T\000\000\000\000\002\193\001\216\001\200\001\201\000\000\000\000\002a\000\000\000\000\001\233\002b\000\163\001D\003(\001\234\001\217\000\000\000\000\001\235\000\000\001\200\001\223\000\000\001\236\003)\001_\000\000\003E\0035\000\000\001\\\000\000\000\000\001]\000>\000\173\000\000\002\235\002m\000\000\003 \000\000\000\000\002\195\000\000\002f\000j\000\000\001\202\0037\0038\000\000\001\203\000\000\000\000\000\000\003<\002\196\000\000\000\000\003A\000\000\003N\001\232\003!\000\000\001\202\000\000\000\000\000\000\001\203\000\000\000\000\000\000\000\000\000\000\001\200\001\223\000\000\000\000\000h\002\\\000\000\001\233\000s\000\000\000\000\000\000\001\234\000\000\000>\001\216\001\235\000\000\003\183\000\000\002a\001\236\000\000\000\000\002b\000\163\001D\003(\000\000\001\217\000\000\000\000\000\000\000\000\000\000\003y\000\000\004\n\003)\000\000\000\000\000\000\003r\000h\003\218\000\000\001\202\000i\000j\000\000\001\203\000\000\000\000\000k\000\000\000\000\000\000\000l\000\000\002f\000\000\000\000\000\000\0037\003t\000\000\003\224\000\000\000\000\000\000\003<\001\216\000\000\000\000\003A\000\000\003N\001\232\000\000\002\\\000\000\000u\000\000\000\000\000\000\001\217\000\000\000j\000\000\001\216\001\200\001\223\000k\000\000\002a\000\000\000l\001\233\002b\000\163\001D\003(\001\234\001\217\000>\000\000\001\235\000\000\002m\003q\003 \001\236\003)\000\000\000\000\000\000\003r\000h\000\000\000\000\000u\000i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002f\003!\000\000\001\202\0037\003t\000\000\001\203\000\000\000\000\000\000\003<\001\216\000\000\000\000\003A\000\000\003N\001\232\000\000\001\233\000\000\000\163\001D\003\225\000\000\001\217\000\000\000j\000\000\000v\001\200\001\223\000k\001\248\003\226\000\000\000l\001\233\003\238\000\000\000\000\000\000\001\234\000\000\000>\000\000\001\235\000\000\002m\000\000\003 \001\236\000\000\000w\000\000\000h\000\000\000\000\000\000\000q\000u\000\000\000\000\000>\000\000\000\000\003\240\000\000\000v\000\000\003\245\000\000\003\252\001\232\003!\000\000\001\202\000\000\000\000\000x\001\203\000\000\000\000\000\000\000\000\000\000\000\000\000\210\000\000\000\233\000\000\002\\\000w\001\233\000\000\000\000\000\000\000\000\001\234\000j\000y\001\216\001\235\000\000\000k\000\235\002a\001\236\000l\000\000\002b\000\163\001D\003(\000{\001\217\001Y\000\000\000\145\000\000\003\133\000\000\000\000\000\000\003)\000\000\000\000\000\000\003\134\000h\001S\000j\000u\000q\000\212\000\000\000\000\000\000\000\213\000y\000\000\000\000\000v\000\000\000\000\002f\000\000\000\000\000\000\0037\003\136\000\000\000\000\000\127\000\000\000\000\003<\000\000\000\000\000\000\003A\000\000\003N\001\232\000\226\002\\\000w\000\000\000\000\000\000\000\000\000\000\000\000\000j\000\000\001\216\001\200\001\223\000k\000\000\002a\000\000\000l\001\233\002b\000\163\001D\003(\001\234\001\217\000>\000\000\001\235\000\000\002m\003\131\003 \001\236\003)\000\000\000\000\000\000\003r\000\000\000\163\001D\000u\000\000\000\000\000\000\000\000\000\000\000\000\000y\000v\000\000\000\000\001T\000\000\002f\003!\000\000\001\202\0037\003t\000\000\001\203\000\129\000\000\000\000\003<\000\000\000\000\000\148\003A\000\000\003N\001\232\000w\000\000\000\000\000\000\000\000\000\000\000\000\001_\000\227\003\196\000\000\000\000\001\\\000\000\000\000\001]\000\000\000\173\003\144\001\233\000\000\001\200\001\223\000\000\001\234\000\000\000\149\000\000\001\235\000\000\000\000\000\000\000\000\001\236\000\249\000>\000\000\000\000\000\000\002m\002\242\003 \000\000\000\000\000\000\000\000\000\000\000y\000\000\000\000\000v\000\150\001\200\001\223\000\000\000\151\000\000\000\251\000\000\000h\000\000\000{\005R\000i\000\000\003!\000>\001\202\000\000\002\183\002m\001\203\003 \002\\\000w\000\000\000\000\000\252\000\000\000\000\000\000\000\000\000\253\001\216\000\000\000\000\000\254\000\000\002a\000\000\000\000\000\255\002b\000\163\001D\003(\003!\001\217\001\202\000\000\000\149\003\149\001\203\000j\000\000\000\000\003)\000\000\000k\000\000\003\145\000\000\000l\000\000\000\000\000\000\000\000\000\210\000\000\000\233\000\000\000y\000\000\000\000\000\000\000\150\000\000\002f\000\000\000\151\000\000\0037\003\147\000\000\000\000\000{\000u\000\000\003<\000\000\001\200\001\223\003A\000\000\003N\001\232\000\000\000\000\000\000\000\000\005^\000\000\000\000\000\000\000>\000\000\002\\\000\000\002m\000\000\003 \000j\000\000\000\000\000\212\001\233\001\216\000\000\000\213\000\000\001\234\002a\000\000\000>\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000\000\003!\000\000\001\202\002\\\000\000\003)\001\203\000\000\000\000\003\145\000\226\000\000\000\000\001\216\000\000\000\000\000\000\000\000\002a\000\000\000\000\000\000\002b\000\163\001D\003(\002f\001\217\000\000\000\000\0037\003\147\000\000\000\000\000v\000\000\003)\003<\000\000\000\000\005S\003A\001Y\003N\001\232\000\000\000\000\000\000\000\000\000h\000\000\000\000\000\000\000s\000\000\000\000\001S\002f\000w\000\000\000\000\0037\005U\000\000\001\233\000\000\000\000\000\000\003<\001\234\001\200\001\223\003A\001\235\003N\001\232\000\000\000\000\001\236\000\000\005a\000\000\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \002\\\000\227\000j\000\000\001\233\001\200\001\201\000k\000\000\001\234\001\216\000l\000\000\001\235\000y\002a\000\000\000\000\001\236\002b\000\163\001D\003(\003!\001\217\001\202\000\000\004*\000\131\001\203\000\000\000\000\000\000\003)\000\000\000u\000\000\005S\000\000\000\163\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000j\000\251\001\202\001T\000\000\002f\001\203\000\000\000\000\0037\005U\000\000\000\000\000\000\000\000\000\000\003<\000\000\000\000\000\000\003A\000\252\003N\001\232\000\000\000\000\000\253\000\000\000\000\000\000\000\254\001_\000\000\003\232\000\000\000\255\001\\\000\000\000\000\001]\000\000\000\173\000\000\001\233\001\200\001\223\000\000\000\000\001\234\000\000\000\000\000h\001\235\000\000\000\000\000s\000\000\001\236\000>\000\000\000\000\000\000\003\183\000h\000\000\002\\\000\000\000q\000v\000\000\000\000\000\000\000\000\000\000\000\000\001\216\000\000\000>\000\000\000\000\002a\003\215\000\000\000\000\002b\000\163\001D\003(\003\218\001\217\001\202\000\000\000w\000\000\001\203\000j\000\000\000\000\003)\000\000\000k\001\216\005S\000\000\000l\000\000\000\000\000j\000\000\000\000\003\224\000\000\000k\000\000\000\000\001\217\000l\000\000\000x\002f\000\000\000\000\000\000\0037\005U\000\000\000\000\000\000\000u\000\000\003<\000h\001\200\001\223\003A\000i\003N\001\232\004\006\000y\000u\001\228\000\000\001 \000\237\000\000\000>\000\000\000\000\000\000\003\183\000\000\000\000\000{\000\000\000\000\000\000\001\233\000\000\000\000\000\000\000>\001\234\000\000\000\000\000\000\001\235\000\000\000\000\003\217\000\000\001\236\000\000\000\000\000\000\000j\003\218\000\000\001\202\000\000\000k\000\000\001\203\001\233\000l\000\000\000\210\000\000\000\211\001\216\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\003\224\000\163\001D\003\225\000\000\001\217\000\000\000\000\000\000\000\000\000u\000\000\000v\000\000\003\226\000\000\001Y\000\210\004\008\000\211\000\163\000\164\000\000\000h\000v\000\000\000\000\000q\000\000\000\000\001S\000\000\000j\000\000\000\000\000\212\000w\000>\000\000\000\213\000\167\000\168\000\170\000\171\000\000\000\000\003\240\000\000\000w\000\000\004\t\000\000\003\252\001\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000j\000x\000\000\000\212\000\226\000h\000j\000\213\000\172\000q\000\173\000k\001\233\000\149\000\000\000l\000\000\001\234\001\216\000>\000\000\001\235\000y\000\000\000\000\000\000\001\236\001\225\000\163\001D\003\225\000v\001\217\000\226\000y\000\000\000{\000\000\000\150\000u\000\000\003\226\000\151\000\163\001D\003\238\000\000\000\000\000{\000j\000\178\000\000\000\000\000\000\000k\000w\001T\000\000\000l\000h\000\000\000\000\000\000\000s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\240\000\000\000\000\000\000\003\245\000\000\003\252\001\232\000h\000u\000\000\001[\000q\000\227\000\000\000\000\001\\\000\000\000\000\001]\000\000\000\173\000>\000\000\000\000\000\000\000\000\001\233\000\000\000y\000j\000\000\001\234\000\000\000\000\000k\001\235\000\000\000\000\000l\000\000\001\236\000\227\000\133\000\163\000\164\000\000\000\000\000v\000\000\000\000\000\000\000j\000\000\000\000\000\000\000\000\000k\000\000\000\000\000\000\000l\000\000\000u\000\167\000\217\000\170\000\171\000\000\000\000\000\000\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\252\000\000\000\000\000u\000\000\000\163\000\164\000\000\000\000\000v\000\000\000\172\000\000\000\173\001\011\000\000\000\149\000\000\000h\000\000\001\200\001\201\000q\000\000\000\000\000\167\001\207\000\170\000\171\000\252\000h\000\000\000>\000w\000i\000\000\000\000\000y\000\000\000\000\000\000\000\150\000\000\001\013\000\000\000\151\000\000\000\000\000\000\000\000\000\000\000{\000\000\000\178\000\172\000\000\000\173\000\000\000\000\000\149\000\000\000h\000j\000v\000j\000q\001\202\000k\000\000\000\000\001\203\000l\000\000\000\000\000j\000>\001\200\001\201\000\000\000k\000y\000\163\000\164\000l\000\150\000v\000\000\000w\000\151\000\000\000\000\000\000\000\000\000\000\000{\000u\000\178\000\000\000\210\000\000\000\211\000\167\002^\000\170\000\171\000j\000\000\000u\000\000\000w\000k\000\000\000\000\000x\000l\000\000\000\000\000\000\000\000\000\000\000j\000\000\001\202\000\000\000\000\000\000\001\203\000\000\000\000\000\000\000\172\000\000\000\173\000\000\000y\000\149\000\000\000h\000u\001\227\000\000\000q\000j\000\000\000\000\000\212\000\000\000\000\000{\000\213\000\000\000>\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\150\000\000\000\000\000\000\000\151\001\216\000\000\000\000\000\000\000\000\000{\000\000\000\178\000\163\000\164\000\226\000\000\000v\000\000\001\217\000\000\000j\000\000\000\000\000\000\000\000\000k\000\000\000\000\000v\000l\000\000\000\000\000\167\002\153\000\170\000\171\000\000\000\000\000\000\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000w\000u\000\000\000\163\000\164\000\000\000\000\000v\001\216\000\172\000\000\000\173\000\000\000\000\000\149\000\000\000h\000\000\000\000\000\000\000q\000\000\001\217\000\167\003>\000\170\000\171\000\000\000h\000\000\000>\000w\000q\000\000\001\233\000y\000\000\000\000\000\000\000\150\000\000\000\000\000>\000\151\000\227\000\000\000\000\000y\001\252\000{\000\000\000\178\000\172\000\000\000\173\000\000\000\000\000\149\000\000\000\000\000j\000\135\000h\000\000\000\000\000k\000q\000\000\000\000\000l\000\000\000\000\000j\000\000\000\000\000\000\000\000\000k\000y\000\163\000\164\000l\000\150\000v\000\000\000\000\000\151\000\000\000\000\000\000\001\233\000\000\000{\000u\000\178\000\000\001\200\001\201\000\000\000\167\003\242\000\170\000\171\000\000\001\254\000u\000j\000w\000h\000\000\000\000\000k\000q\000\252\000\000\000l\000\000\000\000\000\000\000\000\000h\000\000\000>\000\000\000q\001\021\000\000\001\015\000\172\000\000\000\173\000\000\000\000\000\149\000>\000\000\000\000\000\000\000\000\000u\000j\000\000\001\202\000\000\000\000\000\000\001\203\000\000\000\000\000h\000\000\000\000\000j\000i\000y\000\000\000\000\000k\000\150\001\200\001\223\000l\000\151\000\000\000j\000\000\000\000\000\000\000{\000k\000\178\000\163\000\164\000l\000\000\000v\000\000\000\000\000\000\002T\003k\000\000\000\000\000\163\000\164\000u\000\000\000v\000\000\000\000\000\000\000\000\000\000\000j\000\194\000\000\000\000\000u\000k\000w\000h\000\000\000l\002[\000q\001\202\000\194\000\000\000\000\001\203\000\000\000w\000\000\000\000\000>\000\000\000\000\000\000\000\000\000\000\000\196\000v\000\173\000\000\000\000\000\149\000u\000\000\000\000\000\000\000\000\000\000\0014\000\000\000\173\000\000\000\000\000\149\000\000\000\000\000\148\001\216\000\000\000\000\000j\000w\000y\000\000\000\000\000k\000\150\000\000\000\000\000l\000\151\001\217\000\000\000\000\000y\000\000\000{\000\000\000\150\000\163\000\164\000\000\000\151\000v\000\000\000\000\000\000\000\149\000{\000\000\000\000\000\163\000\164\000u\000\000\000v\000\000\000\000\000\000\000\000\000\000\000\000\000\191\000\000\000\000\000\000\000\000\000w\000y\000\000\002\\\000\000\000\150\000\000\001\183\000\000\000\151\001\200\001\223\000w\001\216\000\000\000{\000\000\000v\002a\000\000\000\000\001:\002b\000\173\000\000\000\000\000\149\001\217\000\000\000\000\002T\003a\001\233\001\185\000\210\000\173\000\211\000\000\000\149\000\000\002d\000w\000\000\000\000\000\000\000\000\002\000\000y\000\000\000\000\000\000\000\150\000\000\000\000\002[\000\151\001\202\002f\000\000\000y\001\203\000{\000\000\000\150\000\163\000\164\000\000\000\151\000v\000\000\000\000\000\000\000\000\000{\000\000\001\232\001\200\001\223\000j\000\000\000\000\000\212\000\000\000\000\000\000\000\213\000\000\001\183\000y\000\000\000\000\000\000\000w\000\000\000\000\001\233\002T\002U\000\000\000\000\001\234\000\000\000\137\000\000\001\235\000\000\000\000\000\000\000\000\001\236\000\000\000\226\000\000\002\012\000\000\000\173\000\000\000\000\000\149\000h\002[\000h\001\202\000q\000\000\000i\001\203\000\000\000\000\000\000\000\000\000\000\000\000\000>\000\000\000\000\000\000\001\200\001\223\000y\000\000\000\000\000\000\000\150\000\000\002\\\000\000\000\151\000\000\000\000\000\000\000\000\000\000\000{\000\000\001\216\000\000\002T\002`\000\000\002a\000\000\000\000\000j\002b\000j\000\000\000\000\000k\001\217\000k\000\000\000l\000\000\000l\000h\000h\000\000\000\000\000i\000q\002[\002d\001\202\000\000\000\000\000\000\001\203\000\000\000\000\000>\000\000\000\000\000\227\000\000\000\000\000u\000\000\000u\002f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\\\000\210\000\000\000\211\000\000\000\000\001\232\000\000\000j\000j\001\216\000\000\000\000\000k\000k\002a\000\000\000l\000l\002b\000\000\000\000\000\000\000\000\001\217\000\000\001\233\000\000\000\000\000\000\000\210\001\234\000\233\000\000\000\000\001\235\000\000\002d\001\200\001\223\001\236\000u\000u\000\000\000\000\000j\000\000\000\000\000\212\000\000\000\000\000\252\000\213\000\000\002f\000\000\000\000\000\000\002T\003m\000\000\002\\\000\000\000\163\000\164\001\017\000\000\000v\000\000\000v\000\000\001\216\001\232\000\000\000j\000\000\002a\000\212\000\226\000\000\002b\000\213\002[\000\000\001\202\001\217\002\127\000\000\001\203\000\000\000\000\000w\001\233\000w\000\000\000\000\000\000\001\234\002d\000\000\000\000\001\235\000\000\000\000\000\000\000\000\001\236\000\226\000\000\000\000\000\000\000\000\002\129\000\000\000\173\002f\000\000\000\149\000\000\000\000\000\163\000\164\000\000\000v\000v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\232\000\000\000\000\001\200\001\223\000y\000\000\000y\000\000\000\150\002\127\000\000\000\000\000\151\000w\000w\000\000\000\000\000\000\000{\001\233\000\139\000\000\002T\0044\001\234\000\000\000\227\000\000\001\235\000\000\000\000\000\000\000\000\001\236\000\000\002\145\000\000\000\173\000\000\002\\\000\149\001\200\001\201\000\000\001\200\001\223\002[\000\000\001\202\001\216\000\000\000\000\001\203\000\000\002a\000\227\000\000\000\000\002b\000\000\000y\000y\000\000\001\217\003d\000\150\000\000\000\000\000\000\000\151\000\000\000\000\000\000\000\000\000\141\000{\002d\001\200\001\223\000\000\000\000\004,\000\000\000\000\000\000\000j\000\000\001\202\002[\000\000\001\202\001\203\000\000\002f\001\203\000\252\000\000\002T\0046\000\000\000\000\000\000\000\000\000\000\000\251\001\200\001\223\000\000\000\000\001\019\000h\001\232\000\000\000h\000q\000\000\000\000\000q\000\000\000\000\000\000\002[\000\000\001\202\000\252\002T\0048\001\203\000\000\000\253\000\000\001\233\000\000\000\254\000\000\000\000\001\234\002\\\000\255\000\000\001\235\000\000\000\000\000\000\000\000\001\236\000\000\001\216\000\000\002[\000\000\001\202\002a\000\000\000j\001\203\002b\000j\000\000\000k\000\000\001\217\000k\000l\000\000\000\000\000l\000\210\000\000\000\211\000\000\000\000\000\000\002\002\002d\000\000\0029\000h\000\000\002\\\000\000\000q\000\000\000\000\000\000\000\000\001\216\000u\000\000\001\216\000u\002f\000\000\000h\002a\000\000\000\000\000q\002b\000\000\001\217\000\000\000\000\001\217\000h\000\000\000\000\000\000\000q\001\232\000\000\000j\002\\\000\000\000\212\000\000\002d\000\000\000\213\000\000\000\000\000j\001\216\000\000\000\000\000\000\000k\002a\000\000\001\233\000l\002b\000\000\002f\001\234\000\000\001\217\000j\001\235\000\210\002\\\000\233\000k\001\236\000\226\000\000\000l\000\000\000j\002d\001\216\001\232\000\000\000k\000u\002a\002;\000l\000\000\002b\000\000\000h\000\000\000\000\001\217\000q\002f\002=\001\233\000v\000u\001\233\000v\000\000\000\000\002|\001\234\002d\000\000\000\000\001\235\000u\002\006\000j\001\232\001\236\000\212\000\000\000\148\000\000\000\213\000\148\000\000\000w\002f\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\233\000j\000\000\000\000\000\000\001\234\000k\000\000\001\232\001\235\000l\000\210\000\226\000\233\001\236\000\149\000h\000\000\000\149\000\000\000q\000\000\000\227\000\000\000\000\000\000\000\000\000h\001\233\000\000\000\000\000q\000v\001\234\000u\000\000\000y\001\235\000\000\000y\000\150\000\000\001\236\000\150\000\151\000\000\000\000\000\151\000v\000\000\000{\001\"\000\000\000{\000\000\000j\000w\000\000\000\212\000v\000j\000\000\000\213\000\000\000\000\000k\000\000\000\148\000\000\000l\002\143\000j\000w\002\147\000\000\000\000\000k\000\000\000\148\000\000\000l\000\000\000\149\000w\000\000\000\000\000\000\000\000\000\226\000\000\000\000\000\252\000h\000u\000\227\000\000\000q\000\000\000\149\000\000\000\000\000\000\000\000\000y\000u\001\025\002\181\000\150\000\000\000\149\000\000\000\151\000\000\000\000\000j\000\000\000v\000{\002\148\000y\004.\000\000\002\149\000\150\000\000\000\000\000\000\000\151\000\000\000\000\000y\000\000\000\000\000{\000\150\002\183\000j\000\000\000\151\000\000\000w\000k\000\000\000\251\000{\000l\000\000\000\000\000\000\000h\000\000\000\000\000\000\000q\000\000\000\000\000\000\000\000\000\000\000\000\000h\000\000\000\000\000\252\000q\003\003\000\149\000\000\000\253\000u\000\227\000\000\000\254\000\000\000\000\000v\003\015\000\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000v\000y\000\000\000\000\000\000\000\150\000\000\000j\002\183\000\151\004>\000\000\000k\000w\000\000\000{\000l\000h\000j\002\183\000\000\000q\000\000\000k\000w\000\000\000\000\000l\000h\002\162\000\000\000\000\000q\000\251\000\000\000\000\000\000\000\000\000\000\000\149\000u\000\000\000\000\002\163\000h\000\000\000\000\000\000\000i\000\000\000\149\000u\000\000\000\252\000\000\003\023\000\000\000\000\000\253\000\000\000y\000j\000\254\000\000\000\150\000v\000k\000\255\000\151\000\000\000l\000y\000j\000\000\000{\000\150\000h\000k\000\000\000\151\000q\000l\000\000\000\000\002\183\000{\000\000\000\000\000j\000w\000\000\000\000\000\000\000k\000u\000\000\000\000\000l\000h\000\000\000\000\000\000\000q\000\000\000\000\000u\000\000\000\000\000\000\000\000\000\000\005%\003$\002\195\000h\000\149\000\000\000\000\000q\000\000\000j\000u\000v\0033\000\000\000k\000\000\002\206\000\000\000l\000\000\000\000\000\000\000v\000\000\000\000\000y\000\210\000\000\000\211\000\150\002\183\000j\000\000\000\151\000\000\000w\000k\000\000\000\000\000{\000l\002\183\000u\000\000\000\000\000\000\000w\000j\000\000\000\000\000\000\000\000\000k\000\000\000\000\003J\000l\000\000\000\000\000\000\002\143\000\149\000\000\002\147\000u\000v\003R\000\000\000\000\000\000\000j\000\000\000\149\000\212\000\000\000\000\000v\000\213\000\000\000h\000u\000h\000y\000q\002\183\000q\000\150\000\000\000\000\000w\000\151\000\000\000v\000y\000\000\002\183\000{\000\150\000\000\000\000\000w\000\151\000\000\000\226\000j\000\000\000\000\000{\002\148\000\000\000\000\000\000\002\149\000\000\003\188\000\149\000w\000\000\000\000\000\000\000\000\000\000\000\000\000j\000v\000j\000\149\000h\000k\000\000\000k\000q\000l\000\000\000l\000\000\000y\000\000\000h\000\000\000\150\000\000\000q\002\183\000\151\000\000\000v\000y\000w\000h\000{\000\150\003\200\000q\000\000\000\151\000u\000\000\000u\000\000\000\000\000{\000v\000y\000\000\0052\000\000\000\000\000\000\000\000\000w\000j\000\000\000\000\000\149\000\000\000k\000\143\000\000\000\000\000l\002\183\000j\000\000\000\000\000\227\000w\000k\000\000\000\000\000\000\000l\000\210\000j\000\211\000y\000\149\000\000\000k\000\150\000\000\000\000\000l\000\151\000u\002\162\000\000\000h\000\000\000{\000\000\000q\000\149\000\000\000h\000u\000\000\000y\000q\002\163\000\000\000\150\000\000\000\000\000\000\000\151\000u\005\151\003\206\000\000\003\213\000{\000\000\000y\000\000\000\000\000j\000\150\000v\000\212\000v\000\151\000\000\000\213\000\000\000\000\000\000\000{\000\000\000\000\000\000\000j\000\000\000\000\000\252\000\000\000k\002\183\000j\002\183\000l\000\000\000w\000k\000w\000\000\000\000\000l\001\027\000\226\002\143\000\000\000\000\002\147\000\000\000\000\003\222\000\000\000\000\000\000\001\200\001\201\000\000\000\000\000u\000\000\000v\003\236\000\149\002\195\000\149\000u\000\000\000\000\000\000\001\200\001\201\000v\003\250\000\000\000h\000\000\000\000\002\208\000q\002\183\000\000\000\000\000v\000y\000w\000y\000\000\000\150\000j\000\150\002\183\000\151\002\148\000\151\000\000\000w\002\149\000{\000j\000{\001\202\002\183\000\000\000\000\001\203\000\000\000w\000\000\000\000\000\000\000\149\000\000\000\000\000j\000\000\001\202\000h\000\000\000j\001\203\000q\000\149\000\000\000k\000\000\000\227\000\000\000l\000\000\000\000\004\001\000y\000\149\000h\000\000\000\150\000\000\000q\000\000\000\151\000v\000\000\000y\000\000\000\000\000{\000\150\000v\000\000\000\000\000\151\000u\000\000\000y\000\000\000\000\000{\000\150\000\000\002\183\000j\000\151\000\000\000\000\000w\000k\0052\000{\000\000\000l\000\000\000w\000\000\000\000\000\000\000\000\000\210\000j\000\233\000\000\000\000\000\000\000k\000\000\000\000\000\000\000l\000\000\000\000\002\162\000\149\000\000\000h\000u\000\252\000\000\000q\000\149\002\143\001\216\000\000\002\147\000\000\002\163\000\000\000h\000\000\000\000\001\029\000q\000u\000y\000\000\001\217\001\216\000\150\000\000\000\000\000y\000\151\000j\000\000\000\150\000\212\000\000\000{\000\151\000\213\001\217\000\000\000\000\000\000\000{\000v\000\000\000\000\000j\000\000\000\000\000\000\000\000\000k\000j\000\000\000\000\000l\002\148\000\000\000\000\000j\002\149\000\000\000\182\000\226\000k\000\000\000\000\000w\000l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\000h\000\000\000\000\002\195\000q\000v\000\000\000\000\000\000\000\000\000\000\001\233\000u\000\149\000\000\000h\000\000\002\210\000\000\000q\000\000\000\000\000v\000\000\000\220\002\008\001\233\000\000\000\000\000w\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\150\000\000\002\n\000\245\000\151\000\000\000j\000\000\000w\000\000\000{\000k\000\000\000\000\000\000\000l\000\000\000\149\000\000\000\000\000\000\000j\000\000\000\000\000\000\000\000\000k\000\227\000\000\000\000\000l\000\000\000\000\000\000\000\149\002\162\000\000\000\000\000y\000u\000\000\000\000\000\150\000v\000\000\000\000\000\151\000\000\000\000\002\163\000\000\000\000\000{\004M\000u\000y\000v\000\000\000\000\000\150\000h\000\000\001$\000\151\000q\000\000\000\000\000w\002\143\000{\000\000\002\147\000\000\000\000\000\000\001\170\000\251\000\000\000\000\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000h\000\000\000\000\000\149\000q\000\000\000\252\000\000\000\000\000\000\000\000\000\253\000\000\000h\000j\000\254\000\149\000q\000\000\000k\000\255\000\000\000j\000l\000y\000\000\002\148\000\000\000\150\002\195\002\149\000v\000\151\000\000\000\000\000\000\002\143\000y\000{\002\147\000\000\000\150\000\000\002\212\000j\000\151\000v\000u\000\000\000k\001\174\000{\000\000\000l\000\000\000w\000\000\000j\000\000\000h\000\000\000\000\000k\000q\000\000\001\210\000l\000\000\000\000\000h\000w\000\000\000\000\000i\000\000\000\000\000\000\000u\000\000\000\000\000j\000\149\000\000\000\000\002\148\000\000\000\000\000\000\002\149\000h\000u\000h\000\000\000q\000\000\000q\000\149\000\000\000\000\000\000\000\000\000\000\000y\000j\000\000\000\000\000\150\000h\000k\000\000\000\151\000q\000l\000j\000\000\000\000\000{\000y\000k\000\000\000\000\000\150\000l\002\162\000\000\000\151\000\000\000\000\000\000\000v\000\000\000{\000\000\000j\000\000\000j\000u\002\163\000k\000\000\000k\000\000\000l\000\000\000l\000\000\000u\000\000\002\017\002\143\000\000\000j\002\147\000w\000\000\000\000\000k\000\000\000\000\000v\000l\000\000\000\000\000\000\000\000\000\000\000u\000\000\000u\000\000\000\000\000\000\000v\000\000\000\000\000\000\000\000\000\000\002\022\000\149\000\000\002\162\000\000\000w\000u\000\000\000\000\000\000\000\000\000\000\000\000\002\026\000\000\000j\000\000\002\163\000w\002\148\000\000\000\000\000y\002\149\000\000\000\000\000\150\000\000\000\000\002\195\000\151\000\149\002\143\000h\000\000\002\147\000{\000q\000\000\000\000\000v\000\000\000\000\002\214\000\149\000\000\000\000\000\000\000\000\000h\000v\000h\000y\000q\000\000\000q\000\150\000\000\000\000\0021\000\151\000\000\000\000\000\000\000w\000y\000{\000\000\000\000\000\150\000v\000\000\000v\000\151\000w\000\000\000j\000j\000\000\000{\002\148\000\000\000k\000\000\002\149\000\000\000l\002\195\000v\002X\000\149\002\156\000\000\000j\000w\000j\000w\000\000\000k\000\000\000k\002\216\000l\000\000\000l\000\000\000\000\002\171\000\000\000h\000u\000y\000w\000i\000\000\000\150\002\162\000\000\000\000\000\151\000\149\000y\000\149\000\000\000\000\000{\000u\000h\000u\000\000\002\163\000i\000\000\000\000\000\000\000\153\000\000\002\143\000\149\000\000\002\147\000y\000\000\000y\000\000\000\150\000\000\000\150\000\000\000\151\000\000\000\151\000\000\000j\000\000\000{\000\000\000{\000k\000y\000\000\000\000\000l\000\150\000\000\000\000\000\000\000\151\000\000\000\000\000\000\000j\000\000\000{\000\000\000\000\000k\002\162\000\000\000\000\000l\000j\000\000\000\000\000\000\002\148\000u\000\000\000\000\002\149\000\000\002\163\000v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\000\000\000\000\000u\000\000\000\000\000\000\000v\000\000\000v\002\173\000\000\000\000\002\218\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\176\000\000\004\024\000\000\000\000\000w\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\149\000\000\000\149\002\195\000\000\000y\000\000\000\000\000\000\000\150\000v\000\000\000\000\000\151\000\000\000\000\000\000\002\220\000\000\000{\000\000\000y\000\000\000y\002\162\000\150\000\000\000\150\000v\000\151\000\000\000\151\000\000\000\000\000w\000{\000\000\000{\002\163\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\155\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\000\000\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\222"))
+    ((16, "\001.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\000\000\159\002\206\000\000\000\179\000u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000[\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\000\000\011\000\179\000u\000\000\000\000\000\000\000\000\000\000\012\226\000\128\006\208\000\000\000\000\000\000\004\232\000\000\0004\001!\0024\000\000\000\000\015\168\000\000\003\244\000\000\000B\013\"\018('x&\138\005\028'\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\012'x\000\000\000\0000$\000\0004\200\000\000\t\216\000\000\000\000\000\000\000\000\001r\000\000\"\014\000\000\000\000\000\236\000\000\n\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018T\000\000\020L\000\000\020\244\000\000\021\178\000\000\024R\000\000\026J\000\000\028B\000\000\028\212\000\000\030\204\000\000\",\000\000\007\178\000\000\011\166\000\000\000\000\000\000\000\000\000\0009\170\000\0009\176\000\000:\128\000\000\"z\000\000\000\000\"\162\000\000\000\000\000#\000u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004F\000Z\000\000\000\230\000\000\000\000%\176\000\0004N\000\000\000\000\000\000\001\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0006\000\000\000\000\000\000\000\000\000\000\000\000\003\254'\156\000\000\n\186\000\000\018\160\005n\000\000\000\000\000\000\002\026\000\000\"\160\000\000\000\0004n\000\000\000\000\000\000\002.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\012\000\0008 \000\000\000\000\000\000\000\000\0006\000\000\000\0004\198\000\000\000\000\000\000\tz\000\248\000\000\000\000\000\000\000\000\000\000\000\000\016&\000\000\021\232\000\000\022\188\000\000\023\224\000\000\026\128\000\000\027T\000\000\027\208\000\000\029 \000\000\029L\000\000\031\024\000\000\023h\000\000\005V\000\000\031D\000\000%\250\000\000(b\000\000\000\000\000\000\000\000\000\000\000\1314\240\000\000\000\006\000\000\000\000\000C\003@\000\000\002@\000\000\000\000\000\000\013N\000\000\000\000\000\000'\236\000\000\000\000\000\000\000\000\000\000(`\000\000\000\000\000\000\000\000\000\000\000\000\000F\000\000\000\000\000\000\0014\000\000\000\000\000\000\000\168\000\000\000\000\0004\000\179\000\000\000\000\001\023\008\208\000\000\000\000\000\000\000\000\000\000\002\164\000\000\007j\000\000\0064\000\000\000\000\003x\000\000\000\000\000\000\000\000\000\000\000\000)\\\000\000\000\000\000\000\0008\000\000\000\000\000\000\000\000\008\244\012\212\000\000\002P\000\000\000\000\004\212\003\006\000\000\000\000\000\000\000\000\014\190\000\000\000\000\000\000\000\000\000\000\000\000\001\132\003\134\000\000\005D\000\000\000\000\000\000\002*\000\000\011\152\000-\000\000.\016\000\000\000\000\000\000\000\182\002$\000\000\000\000\000\000\001\210\000\000\000\000\002\030\000\000\002j\000\000\000\000\000\000\000\000\000\"\002\170\000\000\003\"\000\000\000\000\000\000\000\000\000\000\000\0005\016\000\000)\008\000\0005:\000\000\000\000\002\194\000\000\006\172\000\000\007\252\018\204)N\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\130)N\000\000\020\028\000\000\023:\nL\000\000\000\000\000\000\003\218\000\000#\\\000\000\000\0005>\000\000\000\000\000\000\004\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008,\000\0008\180\000\000\000\000\000\000\002\164\000\000\000\000\000\000\000\000\000\000\000\000\012\180\000\000\019t\000\000\022\146\000\000\022\234\000\000\029\202\000\000 \136\000\000#\030\000\000$l\000\000(\154\000\000+\n\000\000\025`\000\000\000f\000\000+\164\000\000/\016\000\0001\206\000\000)\158\000\000\000\000\000\0005\232\000\000\000\000\000\000\000\017\000\0006\030\000\000\000\000\000\0006\"\000\000\000\000\000]\000\000\0244\000!\000\007\000\000\003\150\000\000\012\166\001\234\007B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0006h\000\000)\246&\252\004<\000\000\000\000\000\000 \030\000\000.L\000\000.z\000\000*F*\154\000V\002\176\004~\000\000\000\000\000\000\004\168\000\000\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0006\212\000\000\000\000\000\000\000\000\000\000#\238\000\000+2\000\000\000\000\000\000\000\000\000\000\000\000\013f\000\000\005\148\000\000\000\000\000\000\000\000\004\140\000\025\000\0006B\000\000\000\000\000\000\006\138\000\000\000\000\001v\003z\000\000\014X.\242\000\000\000\000+B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \208+B\000\000$\254\000\000)4\008\168+`\000\000\027\022\000\000\000\000\000\000\004\186\000\000$\128\000\000\000\0006\252\000\000\000\000\000\000\005N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0007\002\000\0007\026\000\000\000\000\000\000.\026\000\000\000\000\016D\000\000\000\000\000\000\000\000\005\160\000\000\000\000\000\000&X\000\000\000\0007\236\000\000\003l\000\000\000\000\000\000\002x\000\000\024\154\000\000\025\216\000\000\025\234\000\000 b\000\000\"\234\000\000%\144\000\000&\222\000\000-F\000\0000\018\000\0008\218\000\0009\166\000\000:^\000\000\000\000\000\000\000\000\000\000/n\000\000\013\160\000\000/|%\n\000\000/\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\012\000\000\000\000\000\000\000\000\000\000\000\000\003\160\000\000\000\0008\176\000\000\000\000\000\000.\202\000\000\000\000\003\002\000\000\000\000\000\0008\238\000\000\000\000\000\000\000\000/\220\000\000\000\000\000\000\000\000\0050\nZ\000\0000j\000\000\000\000\000\000\000\000\024\220\000&\000\000\025\132\000\000\000\000\0128\000\0000\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\226\000\000\000\0009\024\000\000\000\000\000\0000\192\000\000\000\000\004\220\000\000\000\000\013\238\000\000\026,\000\000\000\000%<\000\000\000\000\000\000\000C\000\000\000\00098\000\000\000\000\000\000\000\0000\234\000\000\000\000\000\000\000\000\t\190\0146\000\0001x\000\000\000\000\000\000\000\000\000\000\000\000\014\174\000\000\000\000\006\000\000\000\0156\000\000\000C\000\000\000\000\005^-\174\000\000\005\134\000\000\000\000\000\000\000\000\002\164\000\000,*\000\000\026\212\002D\027|\000\000\004&\000\000\015\180\000\000\016<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006d\028$\002\164\028\204\000\000\000\000\000\000\003\020\000\000\016\252\000\000\006\178\000\000\000\000\000C\005\"\029t\000\000\005\150\000\000\017\164\030\028\000\000\000\000\018L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\184\007\246\000\000\006\216\000\000\000\000\000\000\000\000\006\208\000\000\018\244\000\000\000\000\000\000!\"7\182\000\000\000\000\000\000 \252\000\000\000\000\000\000\000\000\014\004\004\248\000\000\000\0001\154\000\000\000\000\000\000\000\000\005\006\000\000\000\0009\164\000\000\000\000\000\0001\160\000\000\000\000\000m\000\000\000\0002x\000\000\000\000\011b\006\246\000\000\000\0002~\000\000\000\000\0078!\184\000\000\0072\000\000\000\0002\150\000\000\000\000\000\000\000\000\000\000\000\000\007j\000\000\000\0009\186\000\000\000\000\000\0002\190\000\000\000\000\000\000\000\000\000\000%\206\000\000\000\000\000\000\001f\000\000\000\000\000\0003<\000\000\000\000\013\188\t\004\000\000\000\0003n\000\000\000\000\007B\000\000\000\000\000\000\000\000\002\164\001f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d\000\000\019\156\000\000\000\000\000\0008\002\000\000\008t\000\000\000\000\000\000\0040\000\000\000\000\005:\020D\000\000\020\236\000\000\000\000\000\000\005\226\000\000!\232\006^\"\204\000\000#\204\000\000\000\000\000\000\006\220\000\000,\194\007\014-\022\000\000-6\000\000\000\000\000\000\007L\000\000'\234\007\164\000\000\000\000\005\008\0128\007\174\012\030\000\000 :\000\000\000\000\000\000\007\178\000\000,\002\007\222\000\000\000\000\000\000\003\200\000\000\000\000\000\000\004Z\000\000\000\000\000\000\004n\000\000\000\000\000\000\000\000\000\000\000^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\014\000\000\000\000\005J\000\000\002\168\000\000\000\000\007\\\000\000\006\192\005:\003J\000\000\000\000\004J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\224\000Q\000\000\000\000\002\172\000\000\000\000\000\000\008\\\000\000\000\000\t\148\n\166\000\000\000\000\000\000\000\000\011v\012\248\002\156\000\000\015,\000\000\000\000\000\000\000\000\000\000\000\000\015\236\000\000\000\000\0150\000\000\000\000\005*\000\000\000\000\007\226\000\000\000\000\tj\000\000\007\208\006\012\003\004\000\000\000\000\008\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\022\015\134\000\000\000\000\000\000\000\000\015\190\000\000\000\000\017\004\000\000\000\000\019\n\000\000\000\000\000\000\0188\004\216\000\000\020\188\000\000\000\000\000\000\000\000\000\000\000\000\000=\000\000\008d\006\008\003\248\000\000\000\000\000\000\000\000\002d\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000\000\000\003\150\000\000\t$\006:\007\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\000\000\000\000\021\170\020\216\000\000\000\000\000\000\000\000\0202\000\000\004n\000\000\002\196\000\000\000\000\000\000\000\000\000\000\000\000\019\138\008\140\000\000\000\000\011 \000\000\000\000\000\000\000\000\000\222\000\000\014\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\191\000\000\000\000\002z\000\000\000\000\000\000\000\000\000\000\000\000\000\0003\150\004\008\000\000\000\000\000\000\008\234\000\000\000\000\017F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\000\000\000\000\000\000`\012\012\000\179\012J\021\164\005\150\000\000\000\000\005R\007\n\007\136\008\030\000\000\000\000\000\000\000\000\000\000\000\000\006t\021\148\000\000\030\196\007\138\000\000\000\000\007\142\000\000\022<\000\000.\156\000\000\000\000\007x\022\228\000\000\031l\000\000\008\008 \020\000\000\000\000\000\000\006>\005R\000\000\004<\000\000\000\000\000\000\001\158\000\000\016Z\000\000\005\184\013\022\000\000\000\000\000\000\000\000\002\164\000\000\003x\000\000\005\222\000\000\000\000\005\138\000\000\000\000\000\000\000\000\tB\000\000\000\000\005R\008\236\000\000\023\140\000\000\000C\006h\000\000\000\000\000\000\000\000\000\000\001\226\000\000\000\000\000\000\000\000\000\0004 \008\130\000\000\005\016\000\000\000\000\000\000\000\000\000\000\000\230\000\000\n\002\008\160\n\138\000\000\002p\011\016\000\000\t\016\000\000\002\238\000\000\003\188\000\000\004\172\000\000\000\000\000\000\000\000\000\000\008\150\000\000\005z\000\000\t(\000\000\005\248\000\000\000C\006\194\000\000\003n\000\000\006\198\006B\000\000\004\024\000\000\008\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\136\000\000\t\144\000\000\000\000\000\000\000\000\000\000\000\000\007p\000\000\000\000\006\190\000\000\000\000\007\018\008\216\008n\000\000\008t\000\000\000\000\008\014\t\218\000\000\007\248\000\000\000\000\000\000\000\000\008\174\000\000\000\000\000\000\000\000\000\000\000\000\t\140\000\000\000\000\000\000\008\174\008\162\t\006\t<\008\196\t\004\000\000\000\000\008\184\t\014\t^\008\230\t,\000\000\000\000\t`\000\000\000\000\000\000\000\000\t\250\000\000\000\000"), (16, "\001\200\001\223\000\017\004\135\004\013\002!\002\"\001?\003\007\001g\002!\002\"\004\216\005<\000>\002u\005=\000*\002m\003n\003V\004\136\004d\005!\005\"\000>\000@\001~\000C\003\007\004\214\004\217\004d\000\016\005A\001\200\001\201\004\232\000*\001%\000j\000\n\004\213\000\210\003\029\000\211\003!\000>\001\202\000\210\000j\0016\001\203\004\232\003\030\004\233\000>\000E\004\236\004d\004\214\004\217\004d\0009\001\200\001\223\000\t\001\200\001\201\000\017\005i\004\233\001+\001'\004\236\004d\005j\004P\000>\000\017\004e\000j\005k\001\202\003 \004`\005\029\001\203\000*\000j\004e\004\231\000\212\005:\0008\000j\000\213\003\157\000\212\001\228\004\018\001 \000\213\004^\001h\000*\001-\001%\004a\004d\003!\001Y\001\202\000j\001@\001\202\001\203\004e\000F\001\203\004e\000>\000\226\003\008\004\019\001S\000*\000+\000\226\002$\0009\001\200\001\223\004e\000h\000\166\000\175\002\\\000s\000F\0009\001&\000>\005\167\003C\000>\000*\001\216\002H\005k\005\168\003 \002a\004\213\005m\001\139\002b\000\163\001D\003(\000\247\001\217\003\159\003|\004k\002o\003\203\004e\000\163\001D\003)\004\214\004\217\004d\003j\005n\001i\003!\005\031\001\202\000j\001F\001\216\001\203\002J\000k\001A\003H\005\186\000l\001\162\002f\001m\004\139\004\014\003W\001\217\003v\000F\000\163\001D\002\\\003<\000h\000\227\003L\003\141\000q\003N\001\232\000\227\001\216\001T\000u\001\216\002H\002a\001p\004\016\001s\002b\000\163\001D\003(\005p\001\217\000\248\004\244\001\217\001 \001\233\004e\004\246\005q\005\139\001\234\001x\005\187\005\140\001\235\001_\003\007\001j\004\249\001\236\001\\\001B\000*\001]\000j\000\173\002K\002L\002N\000k\002f\000F\000\250\000l\0037\005\142\001\200\001\223\000>\001\152\001\222\003<\000\177\002\\\000j\005\144\001h\003N\001\232\000\232\000>\002\004\000*\001\216\002m\003n\003V\000u\002a\001+\000\163\000\164\002b\000\163\001D\003(\005\189\001\217\001@\001\233\000v\000\005\001\233\000h\001\234\005q\005\139\000q\001\235\001I\005\191\001E\003!\001\236\001\202\002\245\001\236\001\154\001\203\004\016\001\159\005\152\005\153\001-\000w\000\008\000\t\002f\000\248\000*\003p\0037\005\193\001\200\001\223\001\156\000*\002\143\003<\001(\002\147\000\173\005\195\001\133\003N\001\232\000*\000>\005\026\000j\000x\005k\005\173\003V\000k\001\150\000F\004\225\000l\002\242\001\135\003C\000n\000*\003}\001\228\001\233\001 \001=\000v\001\146\001\234\000y\004\222\005\157\001\235\001\158\000\160\003\130\003!\001\236\001\202\000u\000j\004q\001\203\000{\002\148\002\183\005s\004\138\002\149\000\186\000w\000>\005\183\001\200\001\223\001+\004\232\004\153\004d\004r\002\\\003\247\000*\004u\004d\004\136\004d\000>\000\163\000\164\001\216\005k\005\173\003V\004\233\002a\000\149\004\236\004d\002b\000\163\001D\003(\001\136\001\217\001\153\003\127\005&\005'\001,\005:\003\130\004\178\003)\001\161\002u\000F\003j\000y\003!\001\135\001\202\000\150\000\215\001%\001\203\000\151\005+\000>\003\007\004\179\000*\000{\000\224\002f\005\178\004e\001(\003W\000\173\003v\000v\004e\002\143\004e\003<\002\147\002\\\004x\003\141\000F\003N\001\232\003x\002!\002\"\004e\001\216\001\231\004\223\000\148\002\162\002a\000>\002\246\000w\002b\000\163\001D\003(\005\179\001\217\002E\001\233\005\254\002\163\001\200\001\223\001\234\005q\005\139\004\235\001\235\005\255\002d\004\027\005:\001\236\000*\002[\000>\000\149\001b\002\148\005k\005\173\003V\002\149\001q\004\233\003\132\002f\004\236\004d\000\210\003W\000\233\005\181\000*\000\210\002\\\000\231\003<\000y\000\163\000\164\003A\000\150\003N\001\232\001\216\000\151\003!\004y\001\202\002a\002F\000{\001\203\002b\000\163\001D\003(\005\179\001\217\001\163\004\221\000*\005\180\000F\001\233\000F\005q\005\139\003\008\001\234\002\195\002d\003p\001\235\000j\004\129\004\222\000\212\001\236\000j\003\135\000\213\000\212\000>\002\198\004e\000\213\001\128\002f\000\173\005\006\002\194\003W\000*\005\181\000\163\000\164\002#\002\187\003<\004{\004]\005\212\003A\000\238\003N\001\232\000\226\004i\004\029\000*\003\013\000\226\001u\002\162\002\223\002\240\002\226\000>\004^\001\200\001\223\001^\002\190\004a\004d\004\182\001\233\002\163\003\017\000\163\000\164\001\234\006\007\000>\004Z\001\235\002\\\005k\005\173\003V\001\236\000F\000*\001*\004j\000\173\001\216\002\193\002\229\002t\0057\002a\0036\000>\002\193\002b\000\163\001D\003(\005\179\001\217\004|\003\030\000>\000D\003!\000C\001\202\005q\005\139\001\205\001\203\000*\002d\004y\000\210\005o\000\233\001\130\000>\000\173\005\182\004e\002m\004\223\001t\004\207\004d\000\227\002\252\002f\004\030\000*\000\227\003W\000E\005\181\003\143\002\195\000>\0017\003<\001\214\000*\000\210\003A\000\211\003N\001\232\000>\000*\004B\002\196\0058\000\241\004\133\000\210\003s\000\211\0025\005L\000j\001\200\001\223\000\212\000\163\000\176\005\161\000\213\001\233\005\162\003\020\002!\002\"\001\234\005\219\000>\000\251\001\235\0058\005k\005\173\003V\001\236\000>\004e\000*\002G\004k\004\226\000j\000\238\002D\000\212\000\226\003\143\002\\\000\213\000\252\003\153\000\163\001D\000j\000\253\004p\000\212\001\216\000\254\003!\000\213\001\202\002a\000\255\002\249\001\203\002b\000\163\001D\003(\005\179\001\217\005\166\002\151\000\226\005\190\001\200\001\223\000*\005q\005\139\004f\004\029\003e\002d\004~\000\226\000\163\000\176\003\\\000>\005\130\002F\000F\005k\005\173\003V\000\163\001D\003\030\003\005\002f\003\019\003e\000F\003W\004%\005\181\003\146\004\168\001F\000F\003<\000\163\001D\003(\003A\003g\003N\001\232\000>\001m\003!\004'\001\202\000>\003)\000\227\001\203\005E\004\222\005:\004\184\000\163\000\176\002!\002\"\003f\005\194\000\239\001\233\003,\002i\000\163\000\164\001\234\001p\002\160\001s\001\235\002\\\004C\003\185\000\241\001\236\004\241\000\227\002t\003<\003\193\001\216\005P\003A\005G\003N\002a\001\200\001\223\000\227\002b\000\163\001D\003(\005\179\001\217\001Y\000\251\005\127\000\163\001D\000>\002u\005q\005\139\002m\003n\003V\002d\002\185\001S\004(\005z\001\132\003\168\000\173\000*\005\129\000\252\000>\000@\000A\000C\000\253\003\030\002f\001\023\000\254\004'\003W\005\150\005\181\000\255\003!\002\\\001\202\003<\005\197\003\138\001\203\003A\005\132\003N\001\232\001\216\005}\005\201\000\252\005~\002a\000\173\000E\005L\002b\000\163\001D\003(\005\179\001\217\000\228\004\228\000\255\001\200\001\223\001\233\004\178\005q\005\139\004\127\001\234\000*\002d\003\140\001\235\004/\005T\000>\003\138\001\236\003\162\002m\003n\003V\004\179\000\163\001D\002!\002\"\002f\000\163\001D\0041\003W\005\128\005\181\003\162\000>\001T\004t\003<\000*\005H\005l\003A\004\128\003N\001\232\005X\003!\005[\001\202\003\139\005\128\003\164\001\203\005L\004r\003\030\000h\003\030\004u\004d\000q\005\220\002\\\001[\000F\001\233\000*\003\163\001\\\005\224\001\234\001]\001\216\000\173\001\235\0042\003\005\002a\003\019\001\236\004\003\002b\000\163\001D\003(\004\003\001\217\004\022\003|\001Y\001\200\001\223\0041\001\200\002\014\003)\002!\002\"\0049\002d\000\163\001D\000j\001S\000>\004\171\005\229\000k\002m\003n\003V\000l\002v\001F\004\005\004;\002f\004e\000F\004\004\003W\000\145\003v\004\172\001m\004\175\004d\003<\005L\004<\002\247\003A\004\181\003N\001\232\000u\003!\002\\\001\202\000j\005O\001\202\001\203\005b\004\185\001\203\004;\001\216\000F\001p\004\179\001s\002a\001\200\001\223\001\233\002b\000\163\001D\003(\001\234\001\217\003z\003|\001\235\005\230\003\210\000>\004\135\001\236\003)\002m\003n\003V\002d\004?\000F\000\163\001D\002\143\004\186\004H\002\147\004K\004e\005\235\004\136\004d\005\234\004\232\001T\002f\0041\004\239\005\170\003W\003\219\003v\004J\003!\004J\001\202\003<\005N\004N\001\203\003A\004\233\003N\001\232\004\236\004d\000\210\000>\000\233\005g\005\239\000v\001_\004\229\001`\0041\005\141\001\\\003\229\000j\001]\002\\\000\173\002\148\001\233\000>\003\030\002\149\001n\001\234\000\148\001\216\005\184\001\235\001\216\000w\002a\0051\001\236\004e\002b\000\163\001D\003(\005\170\001\217\003\161\003|\001\217\004\230\001\200\001\223\000j\004\171\003)\000\212\005\170\000E\002d\000\213\005\244\000\149\001R\004e\000>\000*\005\212\005\159\002m\003n\003V\004\172\005M\004\175\004d\002f\001S\005\188\000\210\003W\000\233\003v\005\248\000y\002\\\000\226\003<\000\150\005\176\004\187\003A\000\151\003N\001\232\001\216\004\174\003!\000{\001\202\002a\005\192\006\015\001\203\002b\000\163\001D\003(\004\242\001\217\004\026\003|\006\016\005\236\004\172\001\233\004\175\004d\003)\004\135\001\234\002\162\002d\005\246\001\235\000j\000h\000>\000\212\001\236\000i\0058\000\213\004e\005\252\002\163\006\002\004\136\004d\002f\006\t\0058\005\212\003W\004\243\003v\005\212\001\200\001\223\006\000\003<\000\163\001D\004\142\003A\005\238\003N\001\232\000\226\003O\006\001\000>\006\003\006\004\001T\005k\006\005\003 \000\227\000\163\001D\006\008\000j\004\179\005\014\004e\000F\000k\001\233\006\n\006\011\000l\001F\001\234\001\200\001\201\006\012\001\235\002\\\006\020\000\000\000\000\001\236\003!\0052\001\202\004e\001\\\001\216\001\203\001]\005\213\000\173\002a\000\000\000u\002\165\002b\000\163\001D\003(\005\185\001\217\005\137\003|\001\200\001\223\000\251\001p\001w\001s\003)\000h\002u\003\254\002d\000s\005\249\0055\000>\000j\000\000\001\202\005k\005\248\003 \001\203\000*\000\252\000\210\000\227\000\230\002f\000\253\004\193\000\000\003W\000\254\003v\000\000\005\249\005\248\000\255\003<\005\249\000\000\004\135\003A\000\000\003N\001\232\003!\000\000\001\202\000\000\000\000\000\249\001\203\000j\000\000\000\163\000\176\000>\000k\004\136\004d\005\215\000l\000\000\005\171\005\217\001\233\001\200\001\223\002\\\000j\001\234\000v\000\212\000\251\001\235\000\000\000\213\000\000\001\216\001\236\000>\000\000\000\000\002a\005k\000u\003 \002b\000\163\001D\003(\005\172\001\217\004\148\000\252\000w\000\000\000\000\004\232\000\253\005q\005\139\000\226\000\254\000\000\005\175\000\000\000\000\000\255\005\011\000\000\000\000\003!\000\000\001\202\001\216\004\233\004e\001\203\004\236\004d\000>\002f\000\000\000\000\000\000\0037\005\177\000\000\001\217\005\174\000F\000\000\003<\001\200\001\223\002\\\003A\000\000\003N\001\232\000h\000\000\000\188\004\135\000i\001\216\005\021\000>\000\000\000\000\002a\002m\003\209\003 \002b\000\163\001D\003(\005\172\001\217\001\233\004\136\004d\000\000\000\000\001\234\000v\005q\005\139\001\235\000\000\000\000\005\175\000\000\001\236\000\000\000\000\004e\003\021\003!\000\000\001\202\000\000\000\227\000\000\001\203\000j\000\000\000\000\002f\000w\000k\000\000\0037\005\177\000l\003\025\001\218\000\163\000\164\003<\000\000\002\\\000\000\003A\000>\003N\001\232\000\000\005E\000\000\004 \001\216\000\000\000>\003\156\000x\002a\002m\000u\004e\002b\000\163\001D\003(\005\172\001\217\000\000\001\233\004\146\000\000\000\000\000\000\001\234\005q\005\139\000>\001\235\000y\005\175\005E\000\000\001\236\000z\000\000\002u\004B\005\008\000\000\000\173\001\200\001\221\000{\000\000\000\000\000\000\002f\000\000\000\000\000*\0037\005\177\000\000\000\163\000\176\000\000\000\000\003<\001\200\001\223\002\\\003A\000\000\003N\001\232\001\200\001\201\000\000\000\000\000\000\001\216\000\000\000>\000\000\000\000\002a\002m\005\017\003 \002b\000\163\001D\003(\000\000\001\217\001\233\000j\000\000\001\202\000\000\001\234\000v\001\203\003)\001\235\000>\001o\003\145\000C\001\236\000\000\000\000\000>\000\000\003!\001|\001\202\000\000\000\000\000\000\001\203\000j\000\000\001\202\002f\000w\000\000\001\203\0037\003\147\000h\000\000\000\000\004\159\000q\003<\004\135\000E\000>\003A\000\000\003N\001\232\000\000\000E\000\000\003\154\000\000\000\163\005F\003\156\000\147\000h\000\000\004\136\004d\000i\000\163\001D\003(\005R\005I\000\000\001\233\001\200\001\223\000\000\000\000\001\234\000F\003)\002k\001\235\000y\000\000\000\000\000j\001\236\000>\000\163\005F\000k\002m\003\027\003 \000l\000\000\000{\000\000\000\000\000\000\005Q\005I\002\143\005y\004E\002\147\001\216\000j\000\000\000\000\000\000\003<\000k\000\000\002\\\003A\000l\003N\000u\003!\001\217\001\202\004e\000\000\001\216\001\203\003\"\000\000\000\000\002a\000>\001\216\000\000\002b\000\163\001D\003(\000\000\001\217\0011\000u\001\200\001\223\000\000\003&\001\217\000\000\003)\002[\0039\000\000\003\145\002\148\000\000\000\000\000>\002\149\000\163\001D\002m\003:\003V\003\253\000\000\000\163\001D\000>\000\000\002f\000\000\001F\000\000\0037\003\147\004\232\000\000\000\000\001F\000\000\003<\000\000\001m\000\000\003A\000\000\003N\001\232\003!\000\000\001\202\000\163\001D\004\233\001\203\002\143\004\236\004d\002\169\003\184\000\000\000v\000\000\000\000\005z\000\000\000\000\001p\001\233\001s\002u\002\\\000\000\001\234\001p\001\233\001s\001\235\000\000\000\000\001\"\001\216\001\236\000v\000*\000w\002a\000\000\000\000\001\238\002b\000\163\001D\003(\002\187\001\217\004\157\005}\001\200\001\223\005~\000j\000\173\000\000\003)\002\148\003Y\000w\003[\002\149\002\162\000\149\000>\002\230\000\000\004e\002m\003:\003V\002\190\000>\000@\001z\000C\002\163\002f\000\000\000\000\000\000\0037\003]\000\000\000\000\000y\000\163\000\176\003<\000\150\000\000\002\\\003_\000\151\003N\001\232\003!\002\232\001\202\000{\000\000\001\216\001\203\002\193\000E\000\000\002a\0010\000\000\000\000\002b\000\163\001D\003(\000\000\001\217\001\233\000\000\001\200\001\223\000\000\001\234\000\163\001D\003)\001\235\003^\000\000\002d\000>\001\236\000\000\000>\000\000\000\000\003\190\002m\003:\003V\000\000\004\135\002\238\000\000\000\000\000\000\002f\000F\002\195\004\165\003W\000\000\003X\000\000\000\000\002\162\000\000\003<\000\000\004\136\004d\003A\002\196\003N\001\232\003!\000\000\001\202\000\000\002\163\000\000\001\203\003\202\000\000\003\208\000\000\000h\000\000\005\024\000\000\001<\000\000\001\200\001\223\000\000\001\233\004\135\000\000\002\\\000\000\001\234\000\000\000\000\000\000\001\235\003P\000>\000\000\001\216\001\236\002m\003n\003V\002a\004\136\004d\000\000\002b\000\163\001D\003(\000\000\001\217\003T\004\135\000\000\000\163\001D\004e\000\000\000\000\003)\000j\000\000\000>\002d\000\000\000k\003!\001F\001\202\000l\004\136\004d\001\203\000\000\000\000\000\000\000\000\000\210\001m\000\211\002f\004\162\000\000\000\000\003W\000\000\003X\000\000\001\200\001\223\000\000\003<\000h\000u\002\\\003A\000q\003N\001\232\000\000\000\000\004e\000>\001p\001\216\001s\002m\003n\003V\002a\000\000\000\163\000\164\002b\000\163\001D\003(\000>\001\217\001\233\000\000\000\000\000\000\000j\001\234\000\000\000\212\003)\001\235\004e\000\213\002d\000\000\001\236\003!\000\000\001\202\000\000\000j\000\000\001\203\000\000\000\000\000k\000\000\000\000\000\000\000l\002f\000\000\000\000\000\000\003W\000\000\003X\000\000\000\226\002\\\000\000\003<\004\163\000\000\000\173\003A\000\000\003N\001\232\001\216\000\000\004\155\000\000\000u\002a\005\130\000\000\000v\002b\000\163\001D\003(\000\000\001\217\000\000\003u\001\200\001\223\000\000\001\233\000\000\000\000\003)\000\000\001\234\000\000\002d\000\000\001\235\000\000\000>\000w\000\000\001\236\002m\003n\003V\000\163\000\164\000\000\000\000\000\000\000\000\002f\000\000\004\171\004\191\003W\000\000\003v\000\000\000\000\000\000\000\210\003<\000\233\000\000\002\\\003A\000\000\003N\001\232\003!\004\172\001\202\004\175\004d\001\216\001\203\000\000\000\227\000\000\002a\000\000\004\196\002\181\002b\000\163\001D\003(\000\000\001\217\001\233\003w\0054\000v\004\163\001\234\000\173\000\000\003)\001\235\000\163\001D\002d\000\000\001\236\000\000\000\000\000j\001\200\001\223\000\212\004\166\002\183\005z\000\213\000\000\000\000\000w\000\000\002f\000\000\000\000\000>\003W\000\000\003v\002m\003\148\003V\000\000\003<\000\000\004e\000\000\003A\000\000\003N\001\232\000\000\000\000\000\226\000\000\005\133\000\149\005\134\000\000\005}\000\000\000\252\005~\000\000\000\173\000\000\000\000\003!\000\000\001\202\000\000\001\233\000\000\001\203\002\\\001\001\001\234\000\000\000y\000\000\001\235\000\000\000\150\000\000\001\216\001\236\000\151\000h\000\000\002a\000\000\000q\000{\002b\000\163\001D\003(\000\000\001\217\000\000\003\137\003\150\000\000\000\000\000\000\001\200\001\223\003)\000\000\000h\000\000\002d\000\000\000i\000\000\000\000\000\000\000\000\000\000\000>\000\000\000\000\004\135\002m\003\148\003V\000\000\000\000\002f\000\000\000\000\000\000\003W\000j\003v\000\227\000\000\000\000\000k\003<\004\136\004d\000l\003A\000\000\003N\001\232\000\210\000\000\000\229\000\000\003!\000\000\001\202\000\000\000j\004\199\001\203\002\\\000\000\000k\0052\000\000\000\000\000l\000\000\000u\001\233\001\216\001\200\001\223\000\000\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\251\003\152\000\000\001\030\000u\001\200\001\223\003)\000\000\000j\000\000\002d\000\212\003\170\000\000\004e\000\213\000\000\000\000\000>\000\000\000\252\000\000\002m\003:\003V\000\253\000\000\002f\000\000\000\254\000j\003W\001\202\003\151\000\255\000\000\001\203\000\000\003<\000\000\004\171\000\226\003A\000\000\003N\001\232\000\000\000\000\000\000\000\000\003!\000\000\001\202\000\000\000\000\000\000\001\203\002\\\004\172\000\000\004\175\004d\000\000\000v\000\000\000\000\001\233\001\216\001\200\001\201\000\000\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\001\"\001\228\000\000\000v\000\000\000w\001\200\001\223\003)\000\000\000\000\000>\002d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000>\004\232\000\000\000\000\002m\000\000\003 \000w\000\000\002f\000\000\000\149\000j\003W\001\202\003\151\000\000\004e\001\203\004\233\003<\000\227\004\236\004d\003A\004\211\003N\001\232\000\000\001\216\000\000\000\000\003!\000y\001\202\000\000\000\000\000\150\001\203\002\\\000\000\000\151\000\000\001\217\000\000\000\000\000\000\000{\001\233\001\216\001\200\001\220\005\013\001\234\002a\000y\001\230\001\235\002b\000\163\001D\003(\001\236\001\217\004\020\000\000\000\000\000\000\003\156\000}\001\200\001\223\003)\000\000\000h\000>\002d\000\000\000i\000\000\000\000\004e\005\016\000\000\000>\004\232\000\000\000\000\002m\000\000\003 \001\232\000\000\002f\000\000\000\000\000j\003W\001\202\003X\000\000\000\000\001\203\004\233\003<\000\000\004\236\004d\003A\000\000\003N\001\232\001\233\001\216\000\000\000\000\003!\001\234\001\202\000\000\000j\001\235\001\203\002\\\000\000\000k\001\236\001\217\004\202\000l\000\000\000\000\001\233\001\216\000\163\000\164\000\000\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\004\"\000\000\000\000\000\000\003\156\000u\001\200\001\223\003)\004\135\000h\000\000\003\145\000\000\000i\000\000\000\000\004e\005\005\000\000\000>\000\000\000\000\004\135\002m\000\000\003 \004\136\004d\002f\000\000\000\000\000\000\0037\003\147\005\008\000\000\000\173\000\000\000\000\003<\004\136\004d\005\019\003A\000\000\003N\001\232\001\233\001\216\000\000\000\000\003!\000\000\001\202\000\000\000j\000\000\001\203\002\\\000\000\000k\001\240\001\217\000\000\000l\000\000\000\000\001\233\001\216\000\163\000\164\000\000\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\004$\000\000\004e\000v\003\156\000u\001\200\001\223\003)\000\000\000\000\000\000\003\145\000\000\000\000\000\000\004e\000\000\000\000\000\000\000>\000h\000\000\000\000\002m\000i\003 \000w\000>\002f\000\000\000\000\005E\0037\003\147\005\008\000\000\000\173\000\000\000\000\003<\000\000\004\171\005\t\003A\000\000\003N\001\232\000\210\000\000\000\211\000\000\003!\000\000\001\202\000\000\000\000\000\000\001\203\002\\\004\172\000\000\004\175\004d\000\000\000\000\000\000\000j\001\233\001\216\000\000\000\000\000k\001\234\002a\000y\000l\001\235\002b\000\163\001D\003(\001\236\001\217\005U\000\000\000\000\000v\003\156\000\127\001\200\001\223\003)\000\000\000j\000\000\003\145\000\212\005]\000\000\000u\000\213\000\000\000\000\000>\000\000\000\000\000\000\002m\003:\003V\000w\000\000\002f\000\000\004\209\000\000\0037\003\147\000\000\000\000\004e\000\000\000\000\003<\000\000\000\000\000\226\003A\004\253\003N\001\232\000\000\001\200\001\201\000\000\003!\000\000\001\202\000\000\000\000\000\000\001\203\002\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\233\001\216\000\210\000\000\000\211\001\234\002a\000y\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000\000\000\163\005F\000\129\001\200\001\223\003)\001\200\001\201\000j\003\145\001\202\000v\005H\005I\001\203\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \000\000\000\000\002f\000\000\000\000\000j\0037\003\147\000\212\000\000\000\000\000w\000\213\003<\000\227\000\000\000\000\003A\000\000\003N\001\232\000\000\001\200\001\219\000\000\003!\000\000\001\202\000j\000\000\001\202\001\203\002\\\000\000\001\203\000\000\000\000\004\255\000\226\000\000\000\000\001\233\001\216\000\000\000\000\000h\001\234\002a\000\000\000q\001\235\002b\000\163\001D\003(\001\236\001\217\005c\000\000\000y\000\000\003\156\000\000\001\200\001\223\003)\000\000\000\000\000j\002d\001\202\005\143\000\000\000\131\001\203\000\000\000\000\000>\000\000\000\000\000\000\002m\003:\003V\000\252\001\216\002f\000\000\000\000\000\000\003W\000j\003X\000\000\000\000\000\000\000k\003<\001\003\001\217\000l\003A\000\000\003N\001\232\000\210\000\000\000\211\000\000\003!\001\021\001\202\000\000\000\000\000\000\001\203\002\\\000\000\000\000\000\000\000\227\000\000\000\000\000\000\000u\001\233\001\216\000\000\000\000\001\216\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\001\217\000\000\000\000\003\165\001\200\001\223\003)\000\000\000j\000\000\003\145\000\212\000\000\000\000\000\000\000\213\000\000\000\000\000>\000h\000\000\000\000\002m\000i\003V\001\233\001\216\002f\000\000\000\000\000\000\0037\003\147\000\000\000\000\000\000\000\000\000\000\003<\001\242\001\217\000\226\003A\000\000\003N\001\232\000\000\000\252\000\000\000\000\003!\000\000\001\202\000\000\000\000\002\143\001\203\002\\\002\147\000\000\000\000\001\005\000\000\000v\000\000\000j\001\233\001\216\000\000\001\233\000k\001\234\002a\000\000\000l\001\235\002b\000\163\001D\003(\001\236\001\217\000\148\001\244\000\000\000\000\000\000\000w\001\200\001\223\003)\000\000\000\000\000\000\002d\000\000\000\000\000\000\000u\003Z\000\000\000j\000>\000\000\000\000\002\148\002m\000\000\003 \002\149\000\000\002f\000\000\000\149\000\000\003W\000\000\003X\000\000\000\000\000\000\000\000\003<\000\227\000\000\000\000\003A\000\000\003N\001\232\000\000\000\000\000\000\000\000\003!\000y\001\202\000\000\000\000\000\150\001\203\002\\\000\000\000\151\000\000\000\000\000\000\000\000\000\000\000{\001\233\001\216\000\000\000\000\000h\001\234\002a\000\000\000q\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000\000\000\000\000\000\000\000\001\200\001\223\003)\000\000\000\000\000\000\003\167\000\000\000v\000\000\000\000\003\031\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \000\252\000\000\002f\000\000\000\000\000\000\003W\000j\003\169\002\162\000\000\000w\000k\003<\001\007\000\000\000l\003A\000\000\003N\001\232\002\143\000\000\002\163\002\147\003!\002\002\001\202\000\000\000\000\002\143\001\203\002\\\002\147\000\000\000\000\000\000\000\000\000\000\000\000\000u\001\233\001\216\000\000\000\000\000\000\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000y\000\000\000\000\000\000\001\200\001\223\003)\000\000\000j\000\000\0035\000\000\002\148\000\000\000\133\003;\002\149\000j\000>\000h\000\000\002\148\002m\000i\003 \002\149\000\000\002f\000\000\000\000\000\000\0037\0038\000\000\000\000\002\195\000\000\000\000\003<\000\000\000\000\000\000\003A\000\000\003N\001\232\000\210\000\000\000\211\002\200\003!\000\000\001\202\000\000\000\000\000\000\001\203\002\\\000\000\000\000\000\000\000\000\000\000\000v\000\000\000j\001\233\001\216\000\000\000\000\000k\001\234\002a\000\000\000l\001\235\002b\000\163\001D\003(\001\236\001\217\000\148\000\000\000\000\000\000\000\000\000w\001\200\001\223\003)\000\000\000j\000\000\0035\000\212\000\000\000\000\000u\000\213\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \002\162\000\000\002f\000\000\000\149\000\000\0037\0038\000\000\002\162\000\000\000\000\002\143\003<\002\163\002\147\000\226\003A\000\000\003N\001\232\000\000\000\000\002\163\000\000\003!\000y\001\202\000\000\000\000\000\150\001\203\002\\\000\000\000\151\000\000\000\000\000\000\000\000\000\000\000{\001\233\001\216\000\210\000\000\000\211\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000j\000\000\000\000\000\000\002\148\001\200\001\223\003)\002\149\000\000\000\000\0035\000\000\000v\000\000\000\000\000\000\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \000\000\002\195\002f\000\000\000\000\000j\0037\0038\000\212\000\000\002\195\000w\000\213\003<\000\227\002\202\000\000\003A\000\000\003N\001\232\000\210\000\000\000\211\002\204\003!\000\000\001\202\000\000\000\000\000\000\001\203\002\\\000\000\000\000\000\000\000\000\000\000\000\226\000\000\000\000\001\233\001\216\000\000\000\000\000\000\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000y\000\000\000\000\003y\001\200\001\223\003)\000\000\000j\000\000\003r\000\212\000\000\000\000\000\135\000\213\002\162\000\000\000>\000h\000\000\000\000\002m\000i\003 \000\252\000\000\002f\000\000\000\000\002\163\0037\003t\000\000\000\000\000\000\000\000\000\000\003<\001\t\000\000\000\226\003A\000\000\003N\001\232\000\000\000\000\000\000\000\000\003!\000\000\001\202\000\000\000\000\000\000\001\203\002\\\000\000\000\000\000\000\000\227\000\000\000\000\000\000\000j\001\233\001\216\000\000\000\000\000k\001\234\002a\000\000\000l\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000\000\000\000\000\000\003q\001\200\001\223\003)\000\000\000h\000\000\003r\000\000\000i\000\000\000u\000\000\000\000\002\164\000>\000\000\000\000\000\000\002m\000\000\003 \000\000\000\000\002f\000\000\000\000\000\000\0037\003t\000\000\000\000\000\000\000\000\000\000\003<\000\227\000\000\000\000\003A\000\000\003N\001\232\000\210\000\252\000\211\000\000\003!\000\000\001\202\000\000\000j\000\000\001\203\002\\\000\000\000k\000\000\001\011\000\000\000l\000\000\000\000\001\233\001\216\000\210\000\000\000\211\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000\000\000\000\003\133\000u\001\200\001\223\003)\000\000\000j\000\000\003\134\000\212\000v\000\000\000\000\000\213\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \000\252\000\000\002f\000\000\000\000\000j\0037\003\136\000\212\000\000\000\000\000w\000\213\003<\001\013\000\000\000\226\003A\000\000\003N\001\232\000\000\001\200\001\201\000\000\003!\000\000\001\202\000\000\000\000\000\000\001\203\002\\\000\000\000\000\000\000\000\000\000\000\000\226\000\000\000\000\001\233\001\216\000\000\000\000\000\000\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000y\000v\003\144\003\131\001\200\001\223\003)\000\000\000\000\000j\003r\001\202\000\000\000\000\000\137\001\203\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \000w\000\000\002f\000\000\000\000\000\000\0037\003t\000\000\000\000\000\000\000\000\000\000\003<\000\227\000\000\000\000\003A\000\000\003N\001\232\000\000\000\000\000\000\000\000\003!\000\000\001\202\000\000\000\000\000\000\001\203\002\\\000\000\000\000\000\000\000\227\000\000\000\000\000\000\000\000\001\233\001\216\000\000\000\000\000\000\001\234\002a\000y\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000\000\000\000\003\149\000\139\001\200\001\223\003)\000\000\000h\000\000\003\145\000\000\000i\000\000\005Y\000\000\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \000\252\001\216\002f\000\000\000\000\000\000\0037\003\147\000\000\000\000\000\000\000\000\000\000\003<\001\015\001\217\000\000\003A\000\000\003N\001\232\000\210\000\252\000\211\000\000\003!\000\000\001\202\000\000\000j\000\000\001\203\002\\\000\000\000k\000\000\001\017\000\000\000l\000\000\000\000\001\233\001\216\000\210\000\000\000\211\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000\000\000\000\000\000\000u\001\200\001\223\003)\000\000\000j\000\000\003\145\000\212\000\000\000\000\005e\000\213\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \001\233\000\000\002f\000\000\000\000\000j\0037\003\147\000\212\000\000\000\000\000\000\000\213\003<\001\246\000\000\000\226\003A\000\000\003N\001\232\000\000\000\000\000\000\000\000\003!\000\000\001\202\000\000\000\000\000\000\001\203\002\\\000\000\000\000\000\000\000\000\000\000\000\226\000\000\000\000\001\233\001\216\000\000\000\000\000\000\001\234\002a\000\000\000\000\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000\000\000v\000\000\000\000\001\200\001\223\003)\000\000\000\000\000h\005Z\000\000\000\000\000q\005h\000\000\000\000\000\000\000>\000\000\000\000\000\000\002m\000\000\003 \000w\000\000\002f\000\000\000\000\000\000\0037\005\\\000\000\000\000\000\000\000\000\000>\003<\000\227\000\000\002m\003A\002\143\003N\001\232\002\147\000\000\000\000\000\000\003!\000\000\001\202\000\000\000\000\000j\001\203\002\\\000\000\000\000\000k\000\227\001\200\001\201\000l\000\000\001\233\001\216\000\000\004B\000\000\001\234\002a\000y\0029\001\235\002b\000\163\001D\003(\001\236\001\217\000\000\000\000\000\000\000\000\000\000\000\141\000u\000j\003)\000\000\000\000\002\148\005Z\000\000\000\000\002\149\002\143\000\000\000\000\002\168\000\000\000\000\000\000\000\000\000\000\000\000\000j\000\252\001\202\002f\000\000\000\000\001\203\0037\005\\\000\000\000\000\000\000\001\200\001\223\003<\001\019\000\000\000\000\003A\000\000\003N\001\232\000\000\000\252\000\000\000\000\000>\000\000\000\000\000\000\003\183\001\200\001\223\002\\\000\000\000\000\000j\001\025\000\000\000\000\002\148\000\000\001\233\001\216\002\149\000>\000\000\001\234\002a\003\183\003\215\001\235\002b\000\163\001D\003(\001\236\001\217\003\218\000\000\001\202\000\000\000v\000\000\001\203\000\000\003)\000\000\000\000\004\n\005Z\000\000\000\163\001D\003(\000\000\000\000\003\218\000\000\001\202\003\224\000\148\002\162\001\203\000\000\003)\000w\002f\000\000\000\000\000\000\0037\005\\\000\000\000\000\000\000\002\163\000\000\003<\003\224\000\000\001\216\003A\000\000\003N\001\232\001\200\001\223\004\006\000\000\004G\001\228\000\149\001 \000\000\001\217\000\000\003<\000\000\000\000\000>\003A\000\000\003N\003\183\000\000\001\233\000\000\000\000\000\000\000\210\001\234\000\233\000\000\000y\001\235\000\000\002\162\000\150\000\000\001\236\000\000\000\151\000\000\003\217\000\000\000\000\000\000\000{\000h\000\000\002\163\003\218\000q\001\202\000\000\000\000\000\000\001\203\001\216\000\000\000\000\000\000\000>\000h\000\000\000\000\002\195\000i\000\163\001D\003\225\000\000\001\217\003\224\000\000\000j\000\000\001\216\000\212\000\000\002\206\003\226\000\213\001\233\000\000\004\008\000\000\000\163\001D\003\225\000\000\001\217\000\000\000\000\000j\000\000\000\000\001\248\000\000\000k\003\226\000\000\000h\000l\003\238\000\000\000s\000\000\000\226\000j\000\000\000\000\000\000\003\240\000k\000\000\000\000\004\t\000l\003\252\001\232\000h\000h\000\000\000\000\000q\000s\000u\000\000\000\000\000\000\000\000\003\240\000\000\000\000\000>\003\245\000\000\003\252\001\232\000\000\001\233\000u\000\210\000\000\000\233\001\234\000\000\000j\000\000\001\235\000\000\001\216\000k\000\000\001\236\000\000\000l\002\143\000\000\001\233\002\147\000\163\001D\003\225\001\234\001\217\000j\000j\001\235\000\000\000\000\000k\000k\001\236\003\226\000l\000l\000\000\003\238\000\000\000u\000\000\000\000\001\200\001\201\000\000\000\000\000\000\000j\000\227\000\000\000\212\000\000\000\000\000\000\000\213\000\000\000\000\000\000\000u\000u\000\000\000\000\000j\000\163\000\164\003\240\002\148\000v\000\000\003\245\002\149\003\252\001\232\000h\004*\000\000\000\000\000q\000\000\000\000\000\226\000\000\000v\000\167\000\168\000\170\000\171\000>\000j\000\000\001\202\000w\000\000\001\233\001\203\000\000\000\000\000\251\001\234\000\000\000\000\000\000\001\235\000\000\000\000\000\000\000w\001\236\000\000\000\000\000\000\000\000\000\172\000\000\000\173\000\000\000\000\000\149\000\252\000j\000\000\000v\000\000\000\253\000k\000\000\000\000\000\254\000l\000\210\000\000\000\233\000\255\000\000\000\000\000\000\000\163\000\164\000\000\000y\000v\000v\000\000\000\150\000\000\000w\000h\000\151\000\000\000\000\000q\000\000\000u\000{\000y\000\178\000\167\000\217\000\170\000\171\000>\000\000\000\227\002\162\000w\000w\000\000\000\000\000\143\000\000\000\000\000x\000\000\000\000\000\000\000j\000\000\002\163\000\212\000\000\000\000\000\000\000\213\000\000\000\000\000\172\000\000\000\173\004,\001\216\000\149\000x\000j\000y\000\000\000\000\000\000\000k\000\159\000\000\000\000\000l\000\000\001\217\000\000\000\000\000\000\000{\000\226\001\200\001\201\000\251\000y\000y\000\000\000\000\000\150\000\000\000\162\000h\000\151\000\000\000\000\000q\000\000\000u\000{\000{\000\178\000\000\000\163\000\164\000\252\000>\000v\000\000\000\000\000\253\000\000\000\000\000\000\000\254\000\000\000\000\000\000\000\000\000\255\000\000\002\195\000\000\000\167\001\207\000\170\000\171\000\000\000j\000\000\001\202\000w\000\000\000\000\001\203\002\208\000\000\000\000\000j\000\000\000\000\000\000\000\000\000k\000\000\001\233\000\000\000l\000\000\000\000\000\000\000\000\000\172\000\000\000\173\002\143\000\000\000\149\002\167\001\250\000\000\002\143\000\000\000\227\002\147\000\000\000\000\000\000\000\000\000\000\000\000\000u\000\000\000\000\000\000\000\000\000\163\000\164\000\000\000y\000v\000\000\000\000\000\150\000\000\000\000\000h\000\151\000\000\004.\000q\000\000\000\000\000{\000\000\000\178\000\167\002^\000\170\000\171\000>\000j\000\000\000\000\000w\002\148\000\000\002[\000\000\002\149\000\000\002\148\000\251\000\000\000\000\002\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\172\000\000\000\173\002\143\001\216\000\149\002\147\000j\000\252\000\000\000\000\000\000\000k\000\253\000\000\000\000\000l\000\254\001\217\000h\000\000\000\000\000\255\000q\000\163\000\164\000\000\000y\000v\000\000\000\000\000\150\000\000\000>\000h\000\151\000\000\000\000\000q\000\000\000u\000{\000\000\000\178\000\167\002\153\000\170\000\171\000>\000j\000\000\000\000\000w\002\148\000\000\000\000\000\210\002\149\000\211\000\000\000\000\000\000\000\000\000\000\000\000\000j\000\000\002\187\000\000\000\000\000k\000\000\000\000\000\172\000l\000\173\000\000\002\162\000\149\000\000\000j\000\000\000\000\002\162\000\000\000k\002\233\001\233\000\000\000l\000\000\002\163\002\190\000\000\000\000\000\000\000\000\002\163\000u\000\000\000y\001\252\000j\002\143\000\150\000\212\002\147\000\000\000\151\000\213\000\000\000\000\000\000\000u\000{\000\000\000\178\000\000\000\163\000\164\000\000\000\000\000v\000\000\002\193\000\000\000\000\000\000\000h\000\000\000\000\000\000\000q\000\000\000\000\000\226\000\000\000\000\000\167\003>\000\170\000\171\000>\000\000\000\000\000\000\000w\000\000\000\000\002[\002\162\000\000\000\000\002\148\000\000\000\000\000\000\002\149\000\000\000\000\000\000\002\236\000\000\000\000\002\163\000\000\000\000\000\172\002\195\000\173\002\143\000\000\000\149\002\147\000j\000\000\000\163\000\164\000\000\000k\000v\000\000\002\196\000l\000\000\001\200\001\223\000\000\000\000\000\000\000\000\000\163\000\164\000h\000y\000v\000\180\000\193\000\150\000\171\000\000\000\000\000\151\000\000\000w\003b\000\000\000u\000{\000\000\000\178\000\167\003\242\000\170\000\171\000\000\000j\000\227\000\000\000w\002\148\000\000\000\000\000\000\002\149\000\172\000\000\000\173\001\030\001 \000\149\002[\000\000\001\202\002\187\002\195\000\000\001\203\000\000\000j\000\172\000\000\000\173\000\000\000k\000\149\000\000\000h\000l\002\210\002\162\000q\000y\002\189\000\000\000\000\000\150\000\000\000\000\002\190\000\151\000>\000\000\000\000\002\163\000h\000{\000y\000\178\000q\000\000\000\150\000u\000\000\000\000\000\151\000\000\000\000\000\000\000>\003h\000{\000\000\000\178\001\228\000\163\000\164\000\252\000\000\000v\000\000\002\193\000\000\000j\000\000\000\000\000\000\000\000\000k\000\000\000\000\001\027\000l\000\000\000\210\000h\000\233\000\000\001\"\000q\000\000\000j\000\000\000w\000\000\000\000\000k\002\162\000\000\000>\000l\000\000\002\\\000\000\000\000\000\000\000u\000\000\000\000\000\000\000\000\002\163\001\216\000\000\001(\002\195\000\173\002a\000\000\000\149\000\000\002b\000\000\000\000\000u\000\000\001\217\000\000\000\000\002\196\000j\000j\000\000\000\212\000v\000\000\000k\000\213\000\000\003j\000l\000y\000\000\000h\000\210\000\150\000\211\000q\000\000\000\151\000\000\000\000\000\000\000\000\000\000\000{\002f\000>\000w\000\000\000\000\000\000\000\000\000\226\000u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\200\001\201\001\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\000\163\000\164\000\000\000\000\000v\000j\000j\000\000\000\000\000\212\000k\001\233\002\212\000\213\000l\000\000\001\234\000\000\000\163\000\164\001\235\000\000\000v\000\191\000\000\001\236\000\000\000\000\000w\000\000\000\000\000\000\000\000\000\000\000j\000\000\001\202\000\000\000u\000\226\001\203\000\194\000\000\001\200\001\223\000\000\000w\000\000\000\000\001.\000\000\000\173\000\000\000\000\000\149\000\000\000\000\000\000\000\163\000\164\000\000\000\227\000v\002T\004\031\002\143\000\000\000\196\002\166\000\173\000\000\000\000\000\149\000\000\000\000\000\000\000y\000\000\000h\000\000\000\150\000\194\000q\000\000\000\151\000\000\000w\004>\000\000\002[\000{\001\202\000>\000\000\000y\001\203\000\000\000\000\000\150\000>\000\000\000\000\000\151\000\000\000\000\000\000\000\000\0014\000{\000\173\000\251\000j\000\149\000\000\000\000\002\148\000\163\000\164\000h\002\149\000v\000\227\000q\000\000\000j\000\000\000\000\000\000\000\000\000k\000\000\000\252\000>\000l\000y\001\216\000\253\000\000\000\150\000\191\000\254\000\000\000\151\000\000\000w\000\255\000\000\000\000\000{\001\217\000\000\000\000\000\000\000\000\001Y\000\000\000\000\000u\000\000\000\000\000\000\000\000\001\200\001\223\000j\001:\000\000\000\173\001S\000k\000\149\000\000\000\000\000l\000\000\000\000\000\000\000\000\000\000\000\000\002\\\000\000\002T\003k\000\000\000\000\000\000\000\000\000\000\000\000\001\216\000\252\000y\000\000\000\000\002a\000\150\000u\000\000\002b\000\151\000\000\001\200\001\223\001\217\001\029\000{\000\000\002[\000\000\001\202\000\000\002\162\000\000\001\203\000\000\000\000\002d\001\233\000\000\000\000\000\000\002T\003a\000\000\000\000\002\163\000\000\000\000\000\000\000\000\000\000\001\254\000\000\002f\000\163\000\164\000\000\000\000\000v\000\000\000\000\000\163\001D\001\200\001\223\000\000\000\000\002[\000\000\001\202\000\000\001\232\000\000\001\203\001T\000\000\000\000\001\183\000\000\000\000\000\000\000\000\000w\002T\002U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\233\000\000\000\163\000\164\000\000\001\234\000v\000\000\000\000\001\235\001_\001\185\001e\000\173\001\236\001\\\000\149\002[\001]\001\202\000\173\000\000\000\000\001\203\000\000\001\183\002\\\001\200\001\201\000\000\000w\000\000\000\000\000\000\000\000\000\000\001\216\000\000\000y\000\000\000\000\002a\000\150\000\000\000\000\002b\000\151\001\200\001\223\000\000\001\217\002\012\000{\000\173\000\000\000h\000\149\000\000\000\000\000q\000\000\000\000\000\000\002d\000\000\000\000\002\\\002T\002`\000>\000h\000\000\000\000\000j\000q\001\202\001\216\000\000\000y\001\203\002f\002a\000\150\000\000\000>\002b\000\151\000\000\000\000\000\000\001\217\000\000\000{\002[\000\000\001\202\000\000\000\000\001\232\001\203\000\000\000j\000\000\002d\001\200\001\201\000k\000\000\002\\\000\000\000l\000\000\000\000\000\000\000\000\000\000\000j\000\000\001\216\001\233\002f\000k\000\000\002a\001\234\000l\000\000\002b\001\235\000\000\000\000\000\000\001\217\001\236\000u\000\000\000\000\000\000\001\232\000\000\000\000\000\000\000\000\000\000\000\000\002d\000\000\000\000\000\000\000u\000j\000\210\001\202\000\233\000\000\000\000\001\203\000\000\000\000\001\233\000\000\000\000\002f\000\000\001\234\000\000\000\000\000\000\001\235\000\000\000\000\001\200\001\223\001\236\001\216\000\000\000\000\000\000\000\000\000\000\001\232\000\000\000\000\000\000\002\\\000\000\000\000\000\000\001\217\000\000\000\000\002T\003m\000\000\001\216\000\000\000\000\000j\000\000\002a\000\212\001\233\000\000\002b\000\213\000\000\001\234\000\000\001\217\000\000\001\235\000\000\000\163\000\164\000\000\001\236\000v\002[\000\000\001\202\000\000\002d\000\000\001\203\000\000\000\000\000\000\000\163\000\164\000\000\000\226\000v\000\000\000\000\000\000\002\127\000\000\000\000\002f\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\001\200\001\223\000\000\002\127\001\216\000\000\000\000\000\000\000w\001\232\001\233\000\000\000\000\000\000\002\129\000\000\000\173\000\000\001\217\000\149\002T\0044\000\000\000\000\002\000\000\000\000\000\000\000\000\000\002\145\001\233\000\173\000\000\000\000\000\149\001\234\000\000\000\000\000\000\001\235\000\000\000y\001\200\001\223\001\236\000\150\002[\000\000\001\202\000\151\000\000\000\000\001\203\000\000\000\000\000{\000y\000\000\001\200\001\223\000\150\002\\\002T\0046\000\151\000\227\002\143\000\000\000\000\002\147\000{\001\216\000\000\000\000\000\000\000\000\002a\000\000\002T\0048\002b\000\000\000\000\000\000\000\000\001\217\000\000\001\233\002[\000\000\001\202\004M\000\000\000\000\001\203\000\000\000\000\000\000\002d\000\000\000\000\002\006\000\000\000\000\002[\000\000\001\202\000\000\000\000\000\000\001\203\000\000\000j\000\000\000\251\002f\002\148\000\000\001\200\001\223\002\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\232\000\000\000\252\000\000\002\\\003d\000\000\000\253\000\000\000\000\000\000\000\254\000\000\000\000\001\216\000\000\000\255\000\000\000\000\002a\000\000\001\233\000\000\002b\000\000\000\000\001\234\000\000\001\217\000\000\001\235\002[\000\000\001\202\000\000\001\236\000\000\001\203\000\000\002\143\000\000\002d\002\147\000\000\000\000\000\000\002\\\000\000\000>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\216\000\000\002f\000\000\000\000\002a\002\\\000\000\000h\002b\000\000\000\000\000q\000\000\001\217\000\000\001\216\000\000\000\000\000\000\001\232\002a\000\000\000\000\002\162\002b\000\000\002d\000\000\002[\001\217\000h\000\000\002\148\000\000\000q\000\000\002\149\002\163\000\000\000\000\001\233\000\000\002d\002f\000\000\001\234\001Y\002\143\000\000\001\235\002\147\000\000\000\000\000j\001\236\000\000\000\000\000\000\000k\002f\001S\001\232\000l\000\000\000\000\002\\\000\000\000\000\000\000\000\000\000h\000\000\002;\000\000\000q\001\216\000j\001\232\000\000\000\000\002a\000k\001\233\000\000\002b\000l\000u\001\234\000\000\001\217\000h\001\235\000\000\002[\000q\002=\001\236\002\148\001\233\000\000\000\000\002\149\002d\001\234\000\000\001\200\001\201\001\235\002\195\000u\000\000\000\000\001\236\002\187\000\000\000\000\000j\000\000\000\000\002f\000\000\000k\002\214\000\000\000\000\000l\000\000\000\000\000\000\002\162\002\223\002\224\002\226\000\000\000\163\001D\000j\001\232\002\190\000\000\000\000\000k\000\000\002\163\000\000\000l\000\000\001T\000\000\000u\000\000\000j\002\143\001\202\000\000\002\147\000\000\001\203\001\233\002\143\000\000\000\000\002\147\001\234\002\229\000\000\000\000\001\235\000v\000u\002\193\000\000\001\236\000\000\000\000\001_\000\000\001\141\002\187\000\000\001\\\000\000\000\000\001]\000\000\000\173\000\000\000\148\000\000\000\000\002|\000v\000w\000\000\002\162\002\223\005_\002\226\002[\000\000\000\000\000\000\002\148\002\190\000\000\002[\002\149\000h\002\163\002\148\000\148\000q\000\000\002\149\002\195\000w\000\000\000\000\000\149\002\143\000\000\003\003\002\147\000\000\000\000\000\000\000\000\000\000\002\196\002\229\000\000\000v\000\000\000\000\002\143\002\193\000\000\002\147\000\000\000\000\000y\000\149\000\000\000h\000\150\000\000\000\000\000\190\000\151\000\000\002\183\000v\001\216\000j\000{\000w\000\000\000\000\000k\000\000\000\000\000\000\000l\000y\000\000\002[\001\217\000\150\000\000\002\148\001\"\000\151\000\000\002\149\000\000\000w\000\000\000{\000h\002\195\000j\000\149\000q\002\187\002\148\000\000\000u\000\000\002\149\000j\002\187\000\000\000\000\002\196\000k\000\000\000\000\000\000\000l\002\162\002\228\000\149\002\226\000y\000\000\000\000\002\162\000\150\002\190\002\230\000h\000\151\000\000\002\163\000q\002\190\000\000\000{\000\000\000\000\002\163\000h\000u\000y\000j\000q\000\000\000\150\000\000\000k\000\000\000\151\000\000\000l\002\229\001\233\000\000\000{\000\000\000\000\002\193\002\232\000h\000\000\000\000\000\000\000q\002\193\000\000\002\008\002\187\000\000\000\000\000\000\000\000\000\000\000j\000u\003\015\000\000\000\000\000k\000\000\000\000\000\000\000l\002\162\000j\000v\002\230\000\000\000\000\000k\000\000\000\000\002\190\000l\000\000\000\000\000\000\002\163\002\162\000\000\000\000\002\195\002\237\000\000\002\183\000j\000u\000\000\002\195\000w\000k\000\000\002\163\000\000\000l\002\196\000\000\000u\002\232\000\000\000\000\000v\002\196\000\000\002\193\000\000\000\000\000\000\000\000\000\000\000h\000\000\000\000\000\000\000q\000\149\000\000\000\000\000u\000\000\000\000\000\000\000\000\000\000\000\000\000w\003\023\000h\000\000\000\000\000h\000q\000\000\000\000\000q\000\000\000v\000y\000\000\000\000\000\000\000\150\002\235\000\000\000\000\000\151\000\000\000\000\002\195\000\000\000\000\000{\000\000\001\200\001\201\002\183\000j\000\000\003$\000\000\000w\000k\002\196\002\195\000\000\000l\000\000\000\000\000v\0033\000\000\000\000\000\000\000j\000\000\000\000\000j\002\216\000k\000v\000\000\000k\000l\000\000\000h\000l\000\149\002\183\000s\000u\003J\000\000\000w\000\000\000\000\000\000\000\000\000\000\002\183\000j\000v\001\202\000\000\000w\000\000\001\203\000u\000\000\000y\000u\000\000\000\000\000\150\000\000\000\000\000\000\000\151\000\000\000\149\002\183\000\000\000\000\000{\000\000\000w\000\000\000\000\000\000\000\000\000\149\000j\000\000\000\000\000\000\000\000\000k\000\000\000\000\000h\000l\000y\000h\000q\000\000\000\150\000q\000\000\000\000\000\151\000\000\000\149\000y\000\000\000h\000{\000\150\000\000\000q\000\000\000\151\000\000\003R\000\000\000u\000\000\000{\000\000\000\000\000\000\000\000\000\000\000v\000y\000h\000\000\000\000\000\150\000q\003\188\000\000\000\151\003\200\000\000\000\000\000j\000\000\000{\000j\000v\000k\002\183\000v\000k\000l\000\000\000w\000l\000\000\000\000\000j\001\216\000\000\000\000\000\000\000k\000\000\000\000\002\183\000l\000\000\002\183\000\000\000w\000\000\001\217\000w\000\000\000u\000\000\000j\000u\000\149\000\000\000\000\000k\000\000\000\000\000\000\000l\000\000\000\000\000\000\000u\000\000\000\000\000\000\000h\000\000\000\149\000\000\000q\000\149\000\000\000y\000\000\000v\000\000\000\150\000\000\000\000\000\000\000\151\000u\000\000\000\000\000\000\000\000\000{\000\000\000\000\000y\000h\000\000\000y\000\150\000q\000\000\000\150\000\151\000w\000\000\000\151\000\000\000\000\000{\000\000\000\000\000{\000\000\000\000\000\000\000h\000j\001\233\000\000\000q\000\000\000k\000\000\003\206\000\000\000l\003\213\000\000\005,\000x\000\000\002\n\000\000\000v\000\000\000\000\000v\000\000\003\222\000\000\000\000\000j\000\000\000\000\000\000\000\000\000k\000\000\000v\000u\000l\000y\002\183\000\000\000\000\002\183\000\235\000w\003\236\000\000\000w\000j\000\000\000\000\000\000\000{\000k\002\183\000v\000\000\000l\000\000\000w\000\000\000u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\149\000h\000\000\000\149\002\183\000q\000\000\000\000\000\000\000w\000\000\000u\000\000\000\000\005\158\000\149\000\000\000\000\000\000\000\000\000\000\000\000\000y\000\000\000h\000y\000\150\000\000\000q\000\150\000\151\000\000\000\000\000\151\000\000\000\149\000{\000y\003\250\000{\000h\000\150\000\000\000\000\000q\000\151\000\000\000j\000v\000\000\000\000\000{\000k\000\000\000\000\000\000\000l\000y\000\000\000\000\000\000\000\150\000\000\004\001\000\000\000\151\000\000\002\183\000\000\000\000\000j\000{\000w\000v\000\000\000k\000\000\000\000\000\000\000l\000u\000\000\000\000\000\000\000h\000h\000j\000\000\000q\000\189\000\000\000k\002\183\000v\000\000\000l\000\000\000w\000\149\000\000\000\000\000\000\000\000\000u\000\000\000h\000\000\000\000\000\000\000q\000\000\000\000\0059\000\000\000\000\000\000\000\000\000w\000\000\000u\000y\000h\000\000\000\149\000\150\000q\000\000\000\000\000\151\000\000\000j\000j\000\000\000\000\000{\000k\000k\000\000\000\000\000l\000l\000\000\000h\000\149\000h\000y\000q\000\000\000q\000\150\000\000\000j\000\000\000\151\000\000\000\000\000k\000\000\000\000\000{\000l\000\000\000v\000u\000u\000y\000\000\000j\000\000\000\150\000\000\000\000\000k\000\151\000\000\000\000\000l\000\000\000\000\000{\000\000\0059\000\000\000\000\000u\000v\000w\000\000\000j\000\000\000j\000\000\000\000\000k\000\000\000k\000\000\000l\000\000\000l\000u\000v\000\000\000\000\000\182\000\000\000\000\000\000\000\000\000w\000\000\000\000\000\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\220\000u\000\000\000u\000\000\000w\000\000\000\000\000\000\000h\000\000\000\000\000\000\000q\000y\000\149\000\000\000\000\000\150\000\000\000\000\000\000\000\151\000\000\000\000\000v\000v\000\000\000{\000\000\000\000\000\149\000\000\000\000\000\000\000\000\000h\000y\000h\000\000\000q\000\150\000q\000\000\000\245\000\151\000v\000\000\000\000\000w\000w\000{\000\000\000y\000\000\000j\000\000\000\150\000\000\000\000\000k\000\151\000v\000\000\000l\001$\000\000\000{\000>\000\000\000w\000\000\000\000\000h\000\000\000\149\000\000\000q\000\000\000\000\000\000\001\170\000j\000v\000j\000v\000w\000k\000u\000k\000\000\000l\000\000\000l\000\000\000\000\000\149\000y\000\000\000\000\000\000\000\150\001\174\000\000\001\210\000\151\000\000\000w\000\000\000w\000\000\000{\000\149\000\000\000\000\000u\000\000\000u\000y\000j\000\000\000\000\000\150\001Y\000k\000\000\000\151\000h\000l\000\000\000\000\000q\000{\000\149\000y\000\149\000\000\001S\000\150\000\000\000\000\000\000\000\151\000\000\000\000\000\000\000\000\000h\000{\000\000\000h\000q\000u\000\000\000q\000y\000\000\000y\000\000\000\150\000\000\000\150\000h\000\151\000\000\000\151\000q\000\000\000\000\000{\000v\000{\000\000\000j\000\000\000\000\000\000\000\000\000k\000\000\000\000\000\000\000l\000\000\000\000\000\000\000\000\000\000\000\000\002\017\000\000\000\000\000\000\000j\000w\000\000\000j\000v\000k\000v\000\000\000k\000l\000\000\000\000\000l\000u\000\000\000j\000\000\000\000\000\163\001D\000k\000\000\000\000\002\022\000l\002\026\000\000\000\149\000w\000\000\000w\001T\000\000\000u\000\000\000\000\000u\000\000\000\000\000\000\000\000\000v\000\000\000\000\000\000\000\000\000\000\000h\000u\000y\000\000\000q\000\000\000\150\000\149\000\000\000\149\000\151\000\000\001_\0021\002q\000\000\000{\001\\\000w\000\000\001]\000\000\000\173\000\000\000\000\000\000\000\000\002\143\000\000\000y\002\147\000y\000\000\000\150\000\000\000\150\000\000\000\151\000h\000\151\000\000\000\000\000q\000{\000\149\000{\000j\000\000\000v\000\000\000\000\000k\000\000\000h\000\000\000l\000\000\000s\000\000\000h\000\000\000\000\000\000\000s\000\000\000\000\000y\002X\000v\000\000\000\150\000v\000w\002[\000\151\000\000\000\000\002\148\000\000\000u\000{\002\149\000\000\000v\000j\000\000\000\000\002\156\000\000\000k\002\171\000\000\000w\000l\000\000\000w\000\000\000\000\000\149\000j\000\000\000\000\002\173\000\000\000k\000j\000\000\000w\000l\000\000\000k\000\000\000\000\000\000\000l\000\000\000\000\000u\000\149\000\000\000y\000\149\000\000\000\000\000\150\000\000\000\000\000h\000\151\000\000\000\000\000s\000u\000\149\000{\000\000\000\000\000\000\000u\000>\000y\000\000\000\000\000y\000\150\000\000\002\143\000\150\000\151\002\147\000\000\000\151\000\000\000\000\000{\000y\000\000\000{\002\187\000\150\000\000\000v\000\000\000\151\000\000\000\000\000\000\000\000\000\000\000{\000>\000\000\000\000\000j\002\162\000\000\000\000\002\192\000k\000\000\003\176\000\000\000l\002\190\000\000\000w\000\000\000\000\002\163\000\000\000\000\000>\000j\000\000\001Y\000\000\002\148\000\000\000\000\000v\002\149\000\000\000\000\000\000\000\000\000\000\000u\000>\001S\000\000\000\000\000\149\000\000\000\000\000v\002\193\000\000\000\000\004\024\000\000\000v\000\000\000\000\000w\000\000\001Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\150\000w\001S\000\000\000\151\000\000\000\000\000w\000\000\001Y\000{\002\143\000\149\000h\002\147\000\000\000h\000i\000\000\000\000\000i\000\000\002\195\001S\000>\001Y\000\000\000x\000\000\000\000\000\000\000\000\000\000\000x\000y\000>\002\196\000\000\000\150\001S\000\000\000\000\000\151\000\000\000\000\000\163\001D\000\000\000{\000y\000\000\000v\000\000\000\000\000\237\000y\002\162\000j\001T\000j\001\225\002\148\000j\000{\000k\002\149\000\000\000k\000l\000{\002\163\000l\000\000\000\000\000\000\000w\000\163\001D\000\000\001Y\000\000\000\000\000\000\000\000\000\000\000\000\001_\000\000\002\255\001T\001Y\001\\\000u\001S\001]\000u\000\173\000\163\001D\000\000\000\000\000x\000\000\002\143\001S\000\000\002\147\000\000\000\000\000\000\001T\000\000\000\000\000\163\001D\000\000\000\000\001_\000\000\003\n\000h\000\000\001\\\000y\000i\001]\001T\000\173\001\227\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000{\001_\000\000\003/\002\195\000\000\001\\\000\000\000\000\001]\000\000\000\173\000j\000\000\000\000\000\000\002\148\001_\002\218\003E\002\149\002\162\001\\\000\000\000\000\001]\000\000\000\173\000\000\000j\000\163\001D\000\000\000\000\000k\002\163\000\000\000v\000l\000\000\000v\000\163\001D\001T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001T\000\000\000\000\000\000\000\000\000\000\000\000\000w\000u\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\001_\000\000\003\196\000\000\000\000\001\\\000\000\000\000\001]\000\000\000\173\001_\000\000\003\232\000\000\000\000\001\\\000\000\000\000\001]\000\000\000\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\000\000\000y\000\000\000\000\000y\002\162\000\000\000\000\000\000\000\000\000\000\000\000\002\220\000\000\000\000\000\153\000\000\000\000\000\155\002\163\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\222\000\000\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\157"))
   
   let semantic_action =
     [|
@@ -1519,9 +1529,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_aexpr = 
-# 1753 "parser_cocci_menhir.mly"
+# 1766 "parser_cocci_menhir.mly"
       ( Ast0.set_arg_exp _1 )
-# 1525 "parser_cocci_menhir.ml"
+# 1535 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1542,12 +1552,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 66 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
-# 1546 "parser_cocci_menhir.ml"
+# 1556 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_aexpr = 
-# 1755 "parser_cocci_menhir.mly"
+# 1768 "parser_cocci_menhir.mly"
       ( let (nm,lenname,pure,clt) = _1 in
       let nm = P.clt2mcode nm clt in
       let lenname =
@@ -1555,7 +1565,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
          Some nm -> Some(P.clt2mcode nm clt)
        | None -> None in
       Ast0.wrap(Ast0.MetaExprList(nm,lenname,pure)) )
-# 1559 "parser_cocci_menhir.ml"
+# 1569 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1577,9 +1587,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_aexpr = 
-# 1763 "parser_cocci_menhir.mly"
+# 1776 "parser_cocci_menhir.mly"
       ( Ast0.set_arg_exp(Ast0.wrap(Ast0.TypeExp(_1))) )
-# 1583 "parser_cocci_menhir.ml"
+# 1593 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1599,9 +1609,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_any_strict = 
-# 1807 "parser_cocci_menhir.mly"
+# 1820 "parser_cocci_menhir.mly"
             ( Ast.WhenAny )
-# 1605 "parser_cocci_menhir.ml"
+# 1615 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1621,9 +1631,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_any_strict = 
-# 1808 "parser_cocci_menhir.mly"
+# 1821 "parser_cocci_menhir.mly"
             ( Ast.WhenStrict )
-# 1627 "parser_cocci_menhir.ml"
+# 1637 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1643,9 +1653,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_any_strict = 
-# 1809 "parser_cocci_menhir.mly"
+# 1822 "parser_cocci_menhir.mly"
             ( Ast.WhenForall )
-# 1649 "parser_cocci_menhir.ml"
+# 1659 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1665,9 +1675,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_any_strict = 
-# 1810 "parser_cocci_menhir.mly"
+# 1823 "parser_cocci_menhir.mly"
             ( Ast.WhenExists )
-# 1671 "parser_cocci_menhir.ml"
+# 1681 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1689,9 +1699,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1254 "parser_cocci_menhir.mly"
+# 1263 "parser_cocci_menhir.mly"
                                             ( _1 )
-# 1695 "parser_cocci_menhir.ml"
+# 1705 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1723,15 +1733,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 1727 "parser_cocci_menhir.ml"
+# 1737 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1256 "parser_cocci_menhir.mly"
+# 1265 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Mul _1 _2 _3 )
-# 1735 "parser_cocci_menhir.ml"
+# 1745 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1763,15 +1773,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 97 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
-# 1767 "parser_cocci_menhir.ml"
+# 1777 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1258 "parser_cocci_menhir.mly"
+# 1267 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
-# 1775 "parser_cocci_menhir.ml"
+# 1785 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1803,15 +1813,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 98 "parser_cocci_menhir.mly"
        (Data.clt)
-# 1807 "parser_cocci_menhir.ml"
+# 1817 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1260 "parser_cocci_menhir.mly"
+# 1269 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Plus _1 _2 _3 )
-# 1815 "parser_cocci_menhir.ml"
+# 1825 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1843,15 +1853,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 98 "parser_cocci_menhir.mly"
        (Data.clt)
-# 1847 "parser_cocci_menhir.ml"
+# 1857 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1262 "parser_cocci_menhir.mly"
+# 1271 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Minus _1 _2 _3 )
-# 1855 "parser_cocci_menhir.ml"
+# 1865 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1883,15 +1893,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 96 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
-# 1887 "parser_cocci_menhir.ml"
+# 1897 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1264 "parser_cocci_menhir.mly"
+# 1273 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
-# 1895 "parser_cocci_menhir.ml"
+# 1905 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1923,15 +1933,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 95 "parser_cocci_menhir.mly"
        (Ast_cocci.logicalOp * Data.clt)
-# 1927 "parser_cocci_menhir.ml"
+# 1937 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1266 "parser_cocci_menhir.mly"
+# 1275 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.logic_op op _1 clt _3 )
-# 1935 "parser_cocci_menhir.ml"
+# 1945 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -1963,15 +1973,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 94 "parser_cocci_menhir.mly"
        (Data.clt)
-# 1967 "parser_cocci_menhir.ml"
+# 1977 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1268 "parser_cocci_menhir.mly"
+# 1277 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.Eq _1 _2 _3 )
-# 1975 "parser_cocci_menhir.ml"
+# 1985 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2003,15 +2013,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 94 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2007 "parser_cocci_menhir.ml"
+# 2017 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1270 "parser_cocci_menhir.mly"
+# 1279 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.NotEq _1 _2 _3 )
-# 2015 "parser_cocci_menhir.ml"
+# 2025 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2043,15 +2053,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 93 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2047 "parser_cocci_menhir.ml"
+# 2057 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1272 "parser_cocci_menhir.mly"
+# 1281 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.And _1 _2 _3 )
-# 2055 "parser_cocci_menhir.ml"
+# 2065 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2083,15 +2093,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 91 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2087 "parser_cocci_menhir.ml"
+# 2097 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1274 "parser_cocci_menhir.mly"
+# 1283 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Or _1 _2 _3 )
-# 2095 "parser_cocci_menhir.ml"
+# 2105 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2123,15 +2133,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 92 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2127 "parser_cocci_menhir.ml"
+# 2137 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1276 "parser_cocci_menhir.mly"
+# 1285 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Xor _1 _2 _3 )
-# 2135 "parser_cocci_menhir.ml"
+# 2145 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2163,15 +2173,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 90 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2167 "parser_cocci_menhir.ml"
+# 2177 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1278 "parser_cocci_menhir.mly"
+# 1287 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.AndLog _1 _2 _3 )
-# 2175 "parser_cocci_menhir.ml"
+# 2185 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2203,15 +2213,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 89 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2207 "parser_cocci_menhir.ml"
+# 2217 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1280 "parser_cocci_menhir.mly"
+# 1289 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.OrLog _1 _2 _3 )
-# 2215 "parser_cocci_menhir.ml"
+# 2225 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2233,9 +2243,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1254 "parser_cocci_menhir.mly"
+# 1263 "parser_cocci_menhir.mly"
                                             ( _1 )
-# 2239 "parser_cocci_menhir.ml"
+# 2249 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2267,15 +2277,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2271 "parser_cocci_menhir.ml"
+# 2281 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1256 "parser_cocci_menhir.mly"
+# 1265 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Mul _1 _2 _3 )
-# 2279 "parser_cocci_menhir.ml"
+# 2289 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2307,15 +2317,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 97 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
-# 2311 "parser_cocci_menhir.ml"
+# 2321 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1258 "parser_cocci_menhir.mly"
+# 1267 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
-# 2319 "parser_cocci_menhir.ml"
+# 2329 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2347,15 +2357,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 98 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2351 "parser_cocci_menhir.ml"
+# 2361 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1260 "parser_cocci_menhir.mly"
+# 1269 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Plus _1 _2 _3 )
-# 2359 "parser_cocci_menhir.ml"
+# 2369 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2387,15 +2397,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 98 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2391 "parser_cocci_menhir.ml"
+# 2401 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1262 "parser_cocci_menhir.mly"
+# 1271 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Minus _1 _2 _3 )
-# 2399 "parser_cocci_menhir.ml"
+# 2409 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2427,15 +2437,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 96 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
-# 2431 "parser_cocci_menhir.ml"
+# 2441 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1264 "parser_cocci_menhir.mly"
+# 1273 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
-# 2439 "parser_cocci_menhir.ml"
+# 2449 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2467,15 +2477,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 95 "parser_cocci_menhir.mly"
        (Ast_cocci.logicalOp * Data.clt)
-# 2471 "parser_cocci_menhir.ml"
+# 2481 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1266 "parser_cocci_menhir.mly"
+# 1275 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.logic_op op _1 clt _3 )
-# 2479 "parser_cocci_menhir.ml"
+# 2489 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2507,15 +2517,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 94 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2511 "parser_cocci_menhir.ml"
+# 2521 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1268 "parser_cocci_menhir.mly"
+# 1277 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.Eq _1 _2 _3 )
-# 2519 "parser_cocci_menhir.ml"
+# 2529 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2547,15 +2557,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 94 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2551 "parser_cocci_menhir.ml"
+# 2561 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1270 "parser_cocci_menhir.mly"
+# 1279 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.NotEq _1 _2 _3 )
-# 2559 "parser_cocci_menhir.ml"
+# 2569 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2587,15 +2597,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 93 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2591 "parser_cocci_menhir.ml"
+# 2601 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1272 "parser_cocci_menhir.mly"
+# 1281 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.And _1 _2 _3 )
-# 2599 "parser_cocci_menhir.ml"
+# 2609 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2627,15 +2637,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 91 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2631 "parser_cocci_menhir.ml"
+# 2641 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1274 "parser_cocci_menhir.mly"
+# 1283 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Or _1 _2 _3 )
-# 2639 "parser_cocci_menhir.ml"
+# 2649 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2667,15 +2677,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 92 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2671 "parser_cocci_menhir.ml"
+# 2681 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1276 "parser_cocci_menhir.mly"
+# 1285 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Xor _1 _2 _3 )
-# 2679 "parser_cocci_menhir.ml"
+# 2689 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2707,15 +2717,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 90 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2711 "parser_cocci_menhir.ml"
+# 2721 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1278 "parser_cocci_menhir.mly"
+# 1287 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.AndLog _1 _2 _3 )
-# 2719 "parser_cocci_menhir.ml"
+# 2729 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2747,15 +2757,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 89 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2751 "parser_cocci_menhir.ml"
+# 2761 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1280 "parser_cocci_menhir.mly"
+# 1289 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.OrLog _1 _2 _3 )
-# 2759 "parser_cocci_menhir.ml"
+# 2769 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2777,9 +2787,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1254 "parser_cocci_menhir.mly"
+# 1263 "parser_cocci_menhir.mly"
                                             ( _1 )
-# 2783 "parser_cocci_menhir.ml"
+# 2793 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2811,15 +2821,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2815 "parser_cocci_menhir.ml"
+# 2825 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1256 "parser_cocci_menhir.mly"
+# 1265 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Mul _1 _2 _3 )
-# 2823 "parser_cocci_menhir.ml"
+# 2833 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2851,15 +2861,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 97 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
-# 2855 "parser_cocci_menhir.ml"
+# 2865 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1258 "parser_cocci_menhir.mly"
+# 1267 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
-# 2863 "parser_cocci_menhir.ml"
+# 2873 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2891,15 +2901,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 98 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2895 "parser_cocci_menhir.ml"
+# 2905 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1260 "parser_cocci_menhir.mly"
+# 1269 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Plus _1 _2 _3 )
-# 2903 "parser_cocci_menhir.ml"
+# 2913 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2931,15 +2941,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 98 "parser_cocci_menhir.mly"
        (Data.clt)
-# 2935 "parser_cocci_menhir.ml"
+# 2945 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1262 "parser_cocci_menhir.mly"
+# 1271 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Minus _1 _2 _3 )
-# 2943 "parser_cocci_menhir.ml"
+# 2953 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -2971,15 +2981,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 96 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
-# 2975 "parser_cocci_menhir.ml"
+# 2985 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1264 "parser_cocci_menhir.mly"
+# 1273 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
-# 2983 "parser_cocci_menhir.ml"
+# 2993 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3011,15 +3021,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 95 "parser_cocci_menhir.mly"
        (Ast_cocci.logicalOp * Data.clt)
-# 3015 "parser_cocci_menhir.ml"
+# 3025 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1266 "parser_cocci_menhir.mly"
+# 1275 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.logic_op op _1 clt _3 )
-# 3023 "parser_cocci_menhir.ml"
+# 3033 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3051,15 +3061,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 94 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3055 "parser_cocci_menhir.ml"
+# 3065 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1268 "parser_cocci_menhir.mly"
+# 1277 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.Eq _1 _2 _3 )
-# 3063 "parser_cocci_menhir.ml"
+# 3073 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3091,15 +3101,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 94 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3095 "parser_cocci_menhir.ml"
+# 3105 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1270 "parser_cocci_menhir.mly"
+# 1279 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.NotEq _1 _2 _3 )
-# 3103 "parser_cocci_menhir.ml"
+# 3113 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3131,15 +3141,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 93 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3135 "parser_cocci_menhir.ml"
+# 3145 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1272 "parser_cocci_menhir.mly"
+# 1281 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.And _1 _2 _3 )
-# 3143 "parser_cocci_menhir.ml"
+# 3153 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3171,15 +3181,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 91 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3175 "parser_cocci_menhir.ml"
+# 3185 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1274 "parser_cocci_menhir.mly"
+# 1283 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Or _1 _2 _3 )
-# 3183 "parser_cocci_menhir.ml"
+# 3193 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3211,15 +3221,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 92 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3215 "parser_cocci_menhir.ml"
+# 3225 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1276 "parser_cocci_menhir.mly"
+# 1285 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Xor _1 _2 _3 )
-# 3223 "parser_cocci_menhir.ml"
+# 3233 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3251,15 +3261,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 90 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3255 "parser_cocci_menhir.ml"
+# 3265 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1278 "parser_cocci_menhir.mly"
+# 1287 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.AndLog _1 _2 _3 )
-# 3263 "parser_cocci_menhir.ml"
+# 3273 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3291,15 +3301,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 89 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3295 "parser_cocci_menhir.ml"
+# 3305 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1280 "parser_cocci_menhir.mly"
+# 1289 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.OrLog _1 _2 _3 )
-# 3303 "parser_cocci_menhir.ml"
+# 3313 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3321,9 +3331,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1254 "parser_cocci_menhir.mly"
+# 1263 "parser_cocci_menhir.mly"
                                             ( _1 )
-# 3327 "parser_cocci_menhir.ml"
+# 3337 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3355,15 +3365,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3359 "parser_cocci_menhir.ml"
+# 3369 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1256 "parser_cocci_menhir.mly"
+# 1265 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Mul _1 _2 _3 )
-# 3367 "parser_cocci_menhir.ml"
+# 3377 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3395,15 +3405,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 97 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
-# 3399 "parser_cocci_menhir.ml"
+# 3409 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1258 "parser_cocci_menhir.mly"
+# 1267 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
-# 3407 "parser_cocci_menhir.ml"
+# 3417 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3435,15 +3445,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 98 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3439 "parser_cocci_menhir.ml"
+# 3449 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1260 "parser_cocci_menhir.mly"
+# 1269 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Plus _1 _2 _3 )
-# 3447 "parser_cocci_menhir.ml"
+# 3457 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3475,15 +3485,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 98 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3479 "parser_cocci_menhir.ml"
+# 3489 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1262 "parser_cocci_menhir.mly"
+# 1271 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Minus _1 _2 _3 )
-# 3487 "parser_cocci_menhir.ml"
+# 3497 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3515,15 +3525,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 96 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
-# 3519 "parser_cocci_menhir.ml"
+# 3529 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1264 "parser_cocci_menhir.mly"
+# 1273 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
-# 3527 "parser_cocci_menhir.ml"
+# 3537 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3555,15 +3565,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 95 "parser_cocci_menhir.mly"
        (Ast_cocci.logicalOp * Data.clt)
-# 3559 "parser_cocci_menhir.ml"
+# 3569 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1266 "parser_cocci_menhir.mly"
+# 1275 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.logic_op op _1 clt _3 )
-# 3567 "parser_cocci_menhir.ml"
+# 3577 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3595,15 +3605,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 94 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3599 "parser_cocci_menhir.ml"
+# 3609 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1268 "parser_cocci_menhir.mly"
+# 1277 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.Eq _1 _2 _3 )
-# 3607 "parser_cocci_menhir.ml"
+# 3617 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3635,15 +3645,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 94 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3639 "parser_cocci_menhir.ml"
+# 3649 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1270 "parser_cocci_menhir.mly"
+# 1279 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.NotEq _1 _2 _3 )
-# 3647 "parser_cocci_menhir.ml"
+# 3657 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3675,15 +3685,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 93 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3679 "parser_cocci_menhir.ml"
+# 3689 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1272 "parser_cocci_menhir.mly"
+# 1281 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.And _1 _2 _3 )
-# 3687 "parser_cocci_menhir.ml"
+# 3697 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3715,15 +3725,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 91 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3719 "parser_cocci_menhir.ml"
+# 3729 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1274 "parser_cocci_menhir.mly"
+# 1283 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Or _1 _2 _3 )
-# 3727 "parser_cocci_menhir.ml"
+# 3737 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3755,15 +3765,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 92 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3759 "parser_cocci_menhir.ml"
+# 3769 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1276 "parser_cocci_menhir.mly"
+# 1285 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Xor _1 _2 _3 )
-# 3767 "parser_cocci_menhir.ml"
+# 3777 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3795,15 +3805,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 90 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3799 "parser_cocci_menhir.ml"
+# 3809 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1278 "parser_cocci_menhir.mly"
+# 1287 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.AndLog _1 _2 _3 )
-# 3807 "parser_cocci_menhir.ml"
+# 3817 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3835,15 +3845,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 89 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3839 "parser_cocci_menhir.ml"
+# 3849 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_arith_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1280 "parser_cocci_menhir.mly"
+# 1289 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.OrLog _1 _2 _3 )
-# 3847 "parser_cocci_menhir.ml"
+# 3857 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3863,9 +3873,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arity = 
-# 450 "parser_cocci_menhir.mly"
+# 459 "parser_cocci_menhir.mly"
               ( Ast.UNIQUE )
-# 3869 "parser_cocci_menhir.ml"
+# 3879 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3885,9 +3895,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arity = 
-# 451 "parser_cocci_menhir.mly"
+# 460 "parser_cocci_menhir.mly"
               ( Ast.OPT )
-# 3891 "parser_cocci_menhir.ml"
+# 3901 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3907,9 +3917,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arity = 
-# 452 "parser_cocci_menhir.mly"
+# 461 "parser_cocci_menhir.mly"
               ( Ast.MULTI )
-# 3913 "parser_cocci_menhir.ml"
+# 3923 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3924,9 +3934,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_arity = 
-# 453 "parser_cocci_menhir.mly"
+# 462 "parser_cocci_menhir.mly"
                    ( Ast.NONE )
-# 3930 "parser_cocci_menhir.ml"
+# 3940 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3957,20 +3967,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let r : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3961 "parser_cocci_menhir.ml"
+# 3971 "parser_cocci_menhir.ml"
         ) = Obj.magic r in
         let i : 'tv_option_eexpr_ = Obj.magic i in
         let l : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 3967 "parser_cocci_menhir.ml"
+# 3977 "parser_cocci_menhir.ml"
         ) = Obj.magic l in
         let _startpos = _startpos_l_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_array_dec = 
-# 1061 "parser_cocci_menhir.mly"
+# 1070 "parser_cocci_menhir.mly"
                                            ( (l,i,r) )
-# 3974 "parser_cocci_menhir.ml"
+# 3984 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -3992,9 +4002,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_assign_expr_eexpr_dot_expressions_ = 
-# 1226 "parser_cocci_menhir.mly"
+# 1235 "parser_cocci_menhir.mly"
                                            ( _1 )
-# 3998 "parser_cocci_menhir.ml"
+# 4008 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4026,17 +4036,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 108 "parser_cocci_menhir.mly"
        (Ast_cocci.assignOp * Data.clt)
-# 4030 "parser_cocci_menhir.ml"
+# 4040 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_unary_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_eexpr_dot_expressions_ = 
-# 1228 "parser_cocci_menhir.mly"
+# 1237 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in
       Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt,
                                Ast0.set_arg_exp _3,false)) )
-# 4040 "parser_cocci_menhir.ml"
+# 4050 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4068,17 +4078,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4072 "parser_cocci_menhir.ml"
+# 4082 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_unary_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_eexpr_dot_expressions_ = 
-# 1232 "parser_cocci_menhir.mly"
+# 1241 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.Assignment
             (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) )
-# 4082 "parser_cocci_menhir.ml"
+# 4092 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4100,9 +4110,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_assign_expr_eexpr_nest_expressions_ = 
-# 1226 "parser_cocci_menhir.mly"
+# 1235 "parser_cocci_menhir.mly"
                                            ( _1 )
-# 4106 "parser_cocci_menhir.ml"
+# 4116 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4134,17 +4144,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 108 "parser_cocci_menhir.mly"
        (Ast_cocci.assignOp * Data.clt)
-# 4138 "parser_cocci_menhir.ml"
+# 4148 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_unary_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_eexpr_nest_expressions_ = 
-# 1228 "parser_cocci_menhir.mly"
+# 1237 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in
       Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt,
                                Ast0.set_arg_exp _3,false)) )
-# 4148 "parser_cocci_menhir.ml"
+# 4158 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4176,17 +4186,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4180 "parser_cocci_menhir.ml"
+# 4190 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_unary_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_eexpr_nest_expressions_ = 
-# 1232 "parser_cocci_menhir.mly"
+# 1241 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.Assignment
             (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) )
-# 4190 "parser_cocci_menhir.ml"
+# 4200 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4208,9 +4218,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_assign_expr_expr_invalid_ = 
-# 1226 "parser_cocci_menhir.mly"
+# 1235 "parser_cocci_menhir.mly"
                                            ( _1 )
-# 4214 "parser_cocci_menhir.ml"
+# 4224 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4242,17 +4252,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 108 "parser_cocci_menhir.mly"
        (Ast_cocci.assignOp * Data.clt)
-# 4246 "parser_cocci_menhir.ml"
+# 4256 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_unary_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_expr_invalid_ = 
-# 1228 "parser_cocci_menhir.mly"
+# 1237 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in
       Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt,
                                Ast0.set_arg_exp _3,false)) )
-# 4256 "parser_cocci_menhir.ml"
+# 4266 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4284,17 +4294,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4288 "parser_cocci_menhir.ml"
+# 4298 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_unary_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_expr_invalid_ = 
-# 1232 "parser_cocci_menhir.mly"
+# 1241 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.Assignment
             (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) )
-# 4298 "parser_cocci_menhir.ml"
+# 4308 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4316,9 +4326,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_assign_expr_bis = 
-# 1237 "parser_cocci_menhir.mly"
+# 1246 "parser_cocci_menhir.mly"
                                                             ( _1 )
-# 4322 "parser_cocci_menhir.ml"
+# 4332 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4350,17 +4360,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 108 "parser_cocci_menhir.mly"
        (Ast_cocci.assignOp * Data.clt)
-# 4354 "parser_cocci_menhir.ml"
+# 4364 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_unary_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_bis = 
-# 1239 "parser_cocci_menhir.mly"
+# 1248 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in
       Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt,
                                Ast0.set_arg_exp _3,false)) )
-# 4364 "parser_cocci_menhir.ml"
+# 4374 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4392,17 +4402,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4396 "parser_cocci_menhir.ml"
+# 4406 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_unary_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_bis = 
-# 1243 "parser_cocci_menhir.mly"
+# 1252 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.Assignment
             (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) )
-# 4406 "parser_cocci_menhir.ml"
+# 4416 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4424,9 +4434,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_basic_expr_eexpr_dot_expressions_ = 
-# 1223 "parser_cocci_menhir.mly"
+# 1232 "parser_cocci_menhir.mly"
                                                              ( _1 )
-# 4430 "parser_cocci_menhir.ml"
+# 4440 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4448,9 +4458,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_basic_expr_eexpr_nest_expressions_ = 
-# 1223 "parser_cocci_menhir.mly"
+# 1232 "parser_cocci_menhir.mly"
                                                              ( _1 )
-# 4454 "parser_cocci_menhir.ml"
+# 4464 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4472,9 +4482,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_basic_expr_expr_invalid_ = 
-# 1223 "parser_cocci_menhir.mly"
+# 1232 "parser_cocci_menhir.mly"
                                                              ( _1 )
-# 4478 "parser_cocci_menhir.ml"
+# 4488 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4506,19 +4516,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4510 "parser_cocci_menhir.ml"
+# 4520 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4515 "parser_cocci_menhir.ml"
+# 4525 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_case_line = 
-# 933 "parser_cocci_menhir.mly"
+# 942 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Default(P.clt2mcode "default" _1,P.clt2mcode ":" _2,_3)) )
-# 4522 "parser_cocci_menhir.ml"
+# 4532 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4555,20 +4565,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4559 "parser_cocci_menhir.ml"
+# 4569 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4565 "parser_cocci_menhir.ml"
+# 4575 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_case_line = 
-# 935 "parser_cocci_menhir.mly"
+# 944 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Case(P.clt2mcode "case" _1,_2,P.clt2mcode ":" _3,_4)) )
-# 4572 "parser_cocci_menhir.ml"
+# 4582 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4590,9 +4600,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cast_expr_eexpr_dot_expressions_ = 
-# 1283 "parser_cocci_menhir.mly"
+# 1292 "parser_cocci_menhir.mly"
                                           ( _1 )
-# 4596 "parser_cocci_menhir.ml"
+# 4606 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4629,21 +4639,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4633 "parser_cocci_menhir.ml"
+# 4643 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4639 "parser_cocci_menhir.ml"
+# 4649 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_e_ in
         let _v : 'tv_cast_expr_eexpr_dot_expressions_ = 
-# 1285 "parser_cocci_menhir.mly"
+# 1294 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t,
                             P.clt2mcode ")" rp, e)) )
-# 4647 "parser_cocci_menhir.ml"
+# 4657 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4665,9 +4675,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cast_expr_eexpr_invalid_ = 
-# 1283 "parser_cocci_menhir.mly"
+# 1292 "parser_cocci_menhir.mly"
                                           ( _1 )
-# 4671 "parser_cocci_menhir.ml"
+# 4681 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4704,21 +4714,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4708 "parser_cocci_menhir.ml"
+# 4718 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4714 "parser_cocci_menhir.ml"
+# 4724 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_e_ in
         let _v : 'tv_cast_expr_eexpr_invalid_ = 
-# 1285 "parser_cocci_menhir.mly"
+# 1294 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t,
                             P.clt2mcode ")" rp, e)) )
-# 4722 "parser_cocci_menhir.ml"
+# 4732 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4740,9 +4750,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cast_expr_eexpr_nest_expressions_ = 
-# 1283 "parser_cocci_menhir.mly"
+# 1292 "parser_cocci_menhir.mly"
                                           ( _1 )
-# 4746 "parser_cocci_menhir.ml"
+# 4756 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4779,21 +4789,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4783 "parser_cocci_menhir.ml"
+# 4793 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4789 "parser_cocci_menhir.ml"
+# 4799 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_e_ in
         let _v : 'tv_cast_expr_eexpr_nest_expressions_ = 
-# 1285 "parser_cocci_menhir.mly"
+# 1294 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t,
                             P.clt2mcode ")" rp, e)) )
-# 4797 "parser_cocci_menhir.ml"
+# 4807 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4815,9 +4825,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cast_expr_expr_invalid_ = 
-# 1283 "parser_cocci_menhir.mly"
+# 1292 "parser_cocci_menhir.mly"
                                           ( _1 )
-# 4821 "parser_cocci_menhir.ml"
+# 4831 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4854,21 +4864,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4858 "parser_cocci_menhir.ml"
+# 4868 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4864 "parser_cocci_menhir.ml"
+# 4874 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_e_ in
         let _v : 'tv_cast_expr_expr_invalid_ = 
-# 1285 "parser_cocci_menhir.mly"
+# 1294 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t,
                             P.clt2mcode ")" rp, e)) )
-# 4872 "parser_cocci_menhir.ml"
+# 4882 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4894,9 +4904,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_choose_iso = 
-# 233 "parser_cocci_menhir.mly"
+# 237 "parser_cocci_menhir.mly"
                                                  ( List.map P.id2name _2 )
-# 4900 "parser_cocci_menhir.ml"
+# 4910 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4922,21 +4932,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4926 "parser_cocci_menhir.ml"
+# 4936 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4931 "parser_cocci_menhir.ml"
+# 4941 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_comma_decls_TEllipsis_decl_ = 
-# 1554 "parser_cocci_menhir.mly"
+# 1567 "parser_cocci_menhir.mly"
     ( function dot_builder ->
       [Ast0.wrap(Ast0.PComma(P.clt2mcode "," _1));
        dot_builder _2] )
-# 4940 "parser_cocci_menhir.ml"
+# 4950 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4963,15 +4973,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 4967 "parser_cocci_menhir.ml"
+# 4977 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_comma_decls_TEllipsis_decl_ = 
-# 1558 "parser_cocci_menhir.mly"
+# 1571 "parser_cocci_menhir.mly"
     ( function dot_builder ->
       [Ast0.wrap(Ast0.PComma(P.clt2mcode "," _1)); _2] )
-# 4975 "parser_cocci_menhir.ml"
+# 4985 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -4997,21 +5007,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5001 "parser_cocci_menhir.ml"
+# 5011 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5006 "parser_cocci_menhir.ml"
+# 5016 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_comma_decls_TEllipsis_name_opt_decl_ = 
-# 1554 "parser_cocci_menhir.mly"
+# 1567 "parser_cocci_menhir.mly"
     ( function dot_builder ->
       [Ast0.wrap(Ast0.PComma(P.clt2mcode "," _1));
        dot_builder _2] )
-# 5015 "parser_cocci_menhir.ml"
+# 5025 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5038,15 +5048,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5042 "parser_cocci_menhir.ml"
+# 5052 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_comma_decls_TEllipsis_name_opt_decl_ = 
-# 1558 "parser_cocci_menhir.mly"
+# 1571 "parser_cocci_menhir.mly"
     ( function dot_builder ->
       [Ast0.wrap(Ast0.PComma(P.clt2mcode "," _1)); _2] )
-# 5050 "parser_cocci_menhir.ml"
+# 5060 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5061,9 +5071,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_comma_initializers_edots_when_TEllipsis_initialize__ = 
-# 1114 "parser_cocci_menhir.mly"
+# 1123 "parser_cocci_menhir.mly"
               ( [] )
-# 5067 "parser_cocci_menhir.ml"
+# 5077 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5091,9 +5101,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_comma_initializers_edots_when_TEllipsis_initialize__ = 
-# 1116 "parser_cocci_menhir.mly"
+# 1125 "parser_cocci_menhir.mly"
       ( (function dot_builder -> [dot_builder d])::r )
-# 5097 "parser_cocci_menhir.ml"
+# 5107 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5125,16 +5135,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let c : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5129 "parser_cocci_menhir.ml"
+# 5139 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let i : 'tv_initialize2 = Obj.magic i in
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_comma_initializers_edots_when_TEllipsis_initialize__ = 
-# 1118 "parser_cocci_menhir.mly"
+# 1127 "parser_cocci_menhir.mly"
     ( (function dot_builder -> [i; Ast0.wrap(Ast0.IComma(P.clt2mcode "," c))])::
       r )
-# 5138 "parser_cocci_menhir.ml"
+# 5148 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5149,9 +5159,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_comma_initializers2_edots_when_TEllipsis_initialize__ = 
-# 1122 "parser_cocci_menhir.mly"
+# 1131 "parser_cocci_menhir.mly"
               ( [] )
-# 5155 "parser_cocci_menhir.ml"
+# 5165 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5183,16 +5193,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let c : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5187 "parser_cocci_menhir.ml"
+# 5197 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let i : 'tv_initialize2 = Obj.magic i in
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_comma_initializers2_edots_when_TEllipsis_initialize__ = 
-# 1124 "parser_cocci_menhir.mly"
+# 1133 "parser_cocci_menhir.mly"
     ( (function dot_builder -> [i; Ast0.wrap(Ast0.IComma(P.clt2mcode "," c))])::
       r )
-# 5196 "parser_cocci_menhir.ml"
+# 5206 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5214,9 +5224,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_any_strict_ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5220 "parser_cocci_menhir.ml"
+# 5230 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5238,9 +5248,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_ctype_ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5244 "parser_cocci_menhir.ml"
+# 5254 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5262,9 +5272,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_d_ident_ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5268 "parser_cocci_menhir.ml"
+# 5278 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5286,9 +5296,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_dexpr_ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5292 "parser_cocci_menhir.ml"
+# 5302 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5310,9 +5320,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_ident_or_const_ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5316 "parser_cocci_menhir.ml"
+# 5326 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5334,9 +5344,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_meta_ident_ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5340 "parser_cocci_menhir.ml"
+# 5350 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5358,9 +5368,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5364 "parser_cocci_menhir.ml"
+# 5374 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5382,9 +5392,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5388 "parser_cocci_menhir.ml"
+# 5398 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5406,9 +5416,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_not_eq_not_ceq__ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5412 "parser_cocci_menhir.ml"
+# 5422 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5430,9 +5440,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_not_eq_not_eq__ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5436 "parser_cocci_menhir.ml"
+# 5446 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5454,9 +5464,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_not_eq_not_eqe__ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5460 "parser_cocci_menhir.ml"
+# 5470 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5478,9 +5488,33 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_not_eq_not_pos__ = 
-# 1785 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
+                                       ( _1 )
+# 5494 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          } = _menhir_stack in
+        let _1 : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_seed_ = Obj.magic _1 in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_seed_ = 
+# 1798 "parser_cocci_menhir.mly"
                                        ( _1 )
-# 5484 "parser_cocci_menhir.ml"
+# 5518 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5502,9 +5536,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cond_expr_eexpr_dot_expressions_ = 
-# 1248 "parser_cocci_menhir.mly"
+# 1257 "parser_cocci_menhir.mly"
                                              ( _1 )
-# 5508 "parser_cocci_menhir.ml"
+# 5542 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5546,22 +5580,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let dd : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5550 "parser_cocci_menhir.ml"
+# 5584 "parser_cocci_menhir.ml"
         ) = Obj.magic dd in
         let t : 'tv_option_eexpr_ = Obj.magic t in
         let w : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5556 "parser_cocci_menhir.ml"
+# 5590 "parser_cocci_menhir.ml"
         ) = Obj.magic w in
         let l : 'tv_arith_expr_eexpr_dot_expressions_ = Obj.magic l in
         let _startpos = _startpos_l_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_cond_expr_eexpr_dot_expressions_ = 
-# 1250 "parser_cocci_menhir.mly"
+# 1259 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.CondExpr (l, P.clt2mcode "?" w, t,
                                 P.clt2mcode ":" dd, r)) )
-# 5565 "parser_cocci_menhir.ml"
+# 5599 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5583,9 +5617,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cond_expr_eexpr_nest_expressions_ = 
-# 1248 "parser_cocci_menhir.mly"
+# 1257 "parser_cocci_menhir.mly"
                                              ( _1 )
-# 5589 "parser_cocci_menhir.ml"
+# 5623 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5627,22 +5661,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let dd : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5631 "parser_cocci_menhir.ml"
+# 5665 "parser_cocci_menhir.ml"
         ) = Obj.magic dd in
         let t : 'tv_option_eexpr_ = Obj.magic t in
         let w : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5637 "parser_cocci_menhir.ml"
+# 5671 "parser_cocci_menhir.ml"
         ) = Obj.magic w in
         let l : 'tv_arith_expr_eexpr_nest_expressions_ = Obj.magic l in
         let _startpos = _startpos_l_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_cond_expr_eexpr_nest_expressions_ = 
-# 1250 "parser_cocci_menhir.mly"
+# 1259 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.CondExpr (l, P.clt2mcode "?" w, t,
                                 P.clt2mcode ":" dd, r)) )
-# 5646 "parser_cocci_menhir.ml"
+# 5680 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5664,9 +5698,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cond_expr_expr_invalid_ = 
-# 1248 "parser_cocci_menhir.mly"
+# 1257 "parser_cocci_menhir.mly"
                                              ( _1 )
-# 5670 "parser_cocci_menhir.ml"
+# 5704 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5708,22 +5742,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let dd : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5712 "parser_cocci_menhir.ml"
+# 5746 "parser_cocci_menhir.ml"
         ) = Obj.magic dd in
         let t : 'tv_option_eexpr_ = Obj.magic t in
         let w : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 5718 "parser_cocci_menhir.ml"
+# 5752 "parser_cocci_menhir.ml"
         ) = Obj.magic w in
         let l : 'tv_arith_expr_expr_invalid_ = Obj.magic l in
         let _startpos = _startpos_l_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_cond_expr_expr_invalid_ = 
-# 1250 "parser_cocci_menhir.mly"
+# 1259 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.CondExpr (l, P.clt2mcode "?" w, t,
                                 P.clt2mcode ":" dd, r)) )
-# 5727 "parser_cocci_menhir.ml"
+# 5761 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5744,14 +5778,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 54 "parser_cocci_menhir.mly"
       (Data.clt)
-# 5748 "parser_cocci_menhir.ml"
+# 5782 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_const_vol = 
-# 842 "parser_cocci_menhir.mly"
+# 851 "parser_cocci_menhir.mly"
                    ( P.clt2mcode Ast.Const _1 )
-# 5755 "parser_cocci_menhir.ml"
+# 5789 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5772,14 +5806,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 54 "parser_cocci_menhir.mly"
       (Data.clt)
-# 5776 "parser_cocci_menhir.ml"
+# 5810 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_const_vol = 
-# 843 "parser_cocci_menhir.mly"
+# 852 "parser_cocci_menhir.mly"
                    ( P.clt2mcode Ast.Volatile _1 )
-# 5783 "parser_cocci_menhir.ml"
+# 5817 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5794,9 +5828,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_continue_struct_decl_list = 
-# 540 "parser_cocci_menhir.mly"
+# 549 "parser_cocci_menhir.mly"
                                      ( [] )
-# 5800 "parser_cocci_menhir.ml"
+# 5834 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5824,9 +5858,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_struct_decl_list = 
-# 541 "parser_cocci_menhir.mly"
+# 550 "parser_cocci_menhir.mly"
                                      ( _1@_2 )
-# 5830 "parser_cocci_menhir.ml"
+# 5864 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5848,9 +5882,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_continue_struct_decl_list = 
-# 542 "parser_cocci_menhir.mly"
+# 551 "parser_cocci_menhir.mly"
                                      ( _1 )
-# 5854 "parser_cocci_menhir.ml"
+# 5888 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5881,13 +5915,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 5885 "parser_cocci_menhir.ml"
+# 5919 "parser_cocci_menhir.ml"
           
         in
         
-# 546 "parser_cocci_menhir.mly"
+# 555 "parser_cocci_menhir.mly"
   ( P.pointerify (P.make_cv cv ty) m )
-# 5891 "parser_cocci_menhir.ml"
+# 5925 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5925,13 +5959,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 5929 "parser_cocci_menhir.ml"
+# 5963 "parser_cocci_menhir.ml"
           
         in
         
-# 546 "parser_cocci_menhir.mly"
+# 555 "parser_cocci_menhir.mly"
   ( P.pointerify (P.make_cv cv ty) m )
-# 5935 "parser_cocci_menhir.ml"
+# 5969 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -5958,7 +5992,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let t : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 5962 "parser_cocci_menhir.ml"
+# 5996 "parser_cocci_menhir.ml"
         ) = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_m_ in
@@ -5966,15 +6000,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 5970 "parser_cocci_menhir.ml"
+# 6004 "parser_cocci_menhir.ml"
           
         in
         
-# 548 "parser_cocci_menhir.mly"
+# 557 "parser_cocci_menhir.mly"
          ( let ty =
             Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])) in
           P.pointerify (P.make_cv cv ty) m )
-# 5978 "parser_cocci_menhir.ml"
+# 6012 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6006,7 +6040,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let t : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 6010 "parser_cocci_menhir.ml"
+# 6044 "parser_cocci_menhir.ml"
         ) = Obj.magic t in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -6016,15 +6050,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 6020 "parser_cocci_menhir.ml"
+# 6054 "parser_cocci_menhir.ml"
           
         in
         
-# 548 "parser_cocci_menhir.mly"
+# 557 "parser_cocci_menhir.mly"
          ( let ty =
             Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])) in
           P.pointerify (P.make_cv cv ty) m )
-# 6028 "parser_cocci_menhir.ml"
+# 6062 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6055,22 +6089,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6059 "parser_cocci_menhir.ml"
+# 6093 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_midzero_list_ctype_ctype_ = Obj.magic t in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6065 "parser_cocci_menhir.ml"
+# 6099 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_ctype = 
-# 553 "parser_cocci_menhir.mly"
+# 562 "parser_cocci_menhir.mly"
     ( let (mids,code) = t in
       Ast0.wrap
        (Ast0.DisjType(P.clt2mcode "(" lp,code,mids, P.clt2mcode ")" rp)) )
-# 6074 "parser_cocci_menhir.ml"
+# 6108 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6101,13 +6135,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 6105 "parser_cocci_menhir.ml"
+# 6139 "parser_cocci_menhir.ml"
           
         in
         
-# 559 "parser_cocci_menhir.mly"
+# 568 "parser_cocci_menhir.mly"
   ( P.pointerify (P.make_cv cv ty) m )
-# 6111 "parser_cocci_menhir.ml"
+# 6145 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6145,13 +6179,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 6149 "parser_cocci_menhir.ml"
+# 6183 "parser_cocci_menhir.ml"
           
         in
         
-# 559 "parser_cocci_menhir.mly"
+# 568 "parser_cocci_menhir.mly"
   ( P.pointerify (P.make_cv cv ty) m )
-# 6155 "parser_cocci_menhir.ml"
+# 6189 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6178,7 +6212,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let t : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 6182 "parser_cocci_menhir.ml"
+# 6216 "parser_cocci_menhir.ml"
         ) = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_m_ in
@@ -6186,15 +6220,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 6190 "parser_cocci_menhir.ml"
+# 6224 "parser_cocci_menhir.ml"
           
         in
         
-# 561 "parser_cocci_menhir.mly"
+# 570 "parser_cocci_menhir.mly"
          ( let ty =
             Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])) in
           P.pointerify (P.make_cv cv ty) m )
-# 6198 "parser_cocci_menhir.ml"
+# 6232 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6226,7 +6260,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let t : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 6230 "parser_cocci_menhir.ml"
+# 6264 "parser_cocci_menhir.ml"
         ) = Obj.magic t in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -6236,15 +6270,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 6240 "parser_cocci_menhir.ml"
+# 6274 "parser_cocci_menhir.ml"
           
         in
         
-# 561 "parser_cocci_menhir.mly"
+# 570 "parser_cocci_menhir.mly"
          ( let ty =
             Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])) in
           P.pointerify (P.make_cv cv ty) m )
-# 6248 "parser_cocci_menhir.ml"
+# 6282 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6275,22 +6309,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6279 "parser_cocci_menhir.ml"
+# 6313 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_midzero_list_ctype_ctype_ = Obj.magic t in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6285 "parser_cocci_menhir.ml"
+# 6319 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_ctype_full = 
-# 566 "parser_cocci_menhir.mly"
+# 575 "parser_cocci_menhir.mly"
     ( let (mids,code) = t in
       Ast0.wrap
        (Ast0.DisjType(P.clt2mcode "(" lp,code,mids, P.clt2mcode ")" rp)) )
-# 6294 "parser_cocci_menhir.ml"
+# 6328 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6318,7 +6352,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_d_ident = 
-# 1052 "parser_cocci_menhir.mly"
+# 1061 "parser_cocci_menhir.mly"
       ( (_1,
         function t ->
           List.fold_right
@@ -6327,7 +6361,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
                 Ast0.wrap
                   (Ast0.Array(rest,P.clt2mcode "[" l,i,P.clt2mcode "]" r)))
             _2 t) )
-# 6331 "parser_cocci_menhir.ml"
+# 6365 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6355,9 +6389,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_decl = 
-# 812 "parser_cocci_menhir.mly"
+# 821 "parser_cocci_menhir.mly"
  ( Ast0.wrap(Ast0.Param(t, Some i)) )
-# 6361 "parser_cocci_menhir.ml"
+# 6395 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6413,42 +6447,42 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6417 "parser_cocci_menhir.ml"
+# 6451 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6423 "parser_cocci_menhir.ml"
+# 6457 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6428 "parser_cocci_menhir.ml"
+# 6462 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let i : 'tv_ident = Obj.magic i in
         let s : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6434 "parser_cocci_menhir.ml"
+# 6468 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6439 "parser_cocci_menhir.ml"
+# 6473 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let t : 'tv_fn_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_rp1_ in
         let _v : 'tv_decl = 
-# 815 "parser_cocci_menhir.mly"
+# 824 "parser_cocci_menhir.mly"
         ( let fnptr =
          Ast0.wrap
            (Ast0.FunctionPointer
               (t,P.clt2mcode "(" lp,P.clt2mcode "*" s,P.clt2mcode ")" rp,
                P.clt2mcode "(" lp1,d,P.clt2mcode ")" rp1)) in
        Ast0.wrap(Ast0.Param(fnptr, Some i)) )
-# 6452 "parser_cocci_menhir.ml"
+# 6486 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6469,16 +6503,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let t : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 6473 "parser_cocci_menhir.ml"
+# 6507 "parser_cocci_menhir.ml"
         ) = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_decl = 
-# 822 "parser_cocci_menhir.mly"
+# 831 "parser_cocci_menhir.mly"
  ( let ty =
          Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])) in
           Ast0.wrap(Ast0.VoidParam(ty)) )
-# 6482 "parser_cocci_menhir.ml"
+# 6516 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6499,15 +6533,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 64 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 6503 "parser_cocci_menhir.ml"
+# 6537 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl = 
-# 826 "parser_cocci_menhir.mly"
+# 835 "parser_cocci_menhir.mly"
  ( let (nm,pure,clt) = _1 in
        Ast0.wrap(Ast0.MetaParam(P.clt2mcode nm clt,pure)) )
-# 6511 "parser_cocci_menhir.ml"
+# 6545 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6528,14 +6562,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 59 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 6532 "parser_cocci_menhir.ml"
+# 6566 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_ident = 
-# 1503 "parser_cocci_menhir.mly"
+# 1516 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) )
-# 6539 "parser_cocci_menhir.ml"
+# 6573 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6556,15 +6590,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 62 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
-# 6560 "parser_cocci_menhir.ml"
+# 6594 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_ident = 
-# 1505 "parser_cocci_menhir.mly"
+# 1518 "parser_cocci_menhir.mly"
          ( let (nm,constraints,pure,clt) = _1 in
          Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,pure)) )
-# 6568 "parser_cocci_menhir.ml"
+# 6602 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6579,9 +6613,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_decl_list_decl_ = 
-# 1525 "parser_cocci_menhir.mly"
+# 1538 "parser_cocci_menhir.mly"
               ( Ast0.wrap(Ast0.DOTS([])) )
-# 6585 "parser_cocci_menhir.ml"
+# 6619 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6603,13 +6637,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_list_decl_ = 
-# 1527 "parser_cocci_menhir.mly"
+# 1540 "parser_cocci_menhir.mly"
      (let circle x =
        match Ast0.unwrap x with Ast0.Pcircles(_) -> true | _ -> false in
      if List.exists circle _1
      then Ast0.wrap(Ast0.CIRCLES(_1))
      else Ast0.wrap(Ast0.DOTS(_1)) )
-# 6613 "parser_cocci_menhir.ml"
+# 6647 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6624,9 +6658,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_decl_list_name_opt_decl_ = 
-# 1525 "parser_cocci_menhir.mly"
+# 1538 "parser_cocci_menhir.mly"
               ( Ast0.wrap(Ast0.DOTS([])) )
-# 6630 "parser_cocci_menhir.ml"
+# 6664 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6648,13 +6682,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_list_name_opt_decl_ = 
-# 1527 "parser_cocci_menhir.mly"
+# 1540 "parser_cocci_menhir.mly"
      (let circle x =
        match Ast0.unwrap x with Ast0.Pcircles(_) -> true | _ -> false in
      if List.exists circle _1
      then Ast0.wrap(Ast0.CIRCLES(_1))
      else Ast0.wrap(Ast0.DOTS(_1)) )
-# 6658 "parser_cocci_menhir.ml"
+# 6692 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6676,9 +6710,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_list_start_decl_ = 
-# 1534 "parser_cocci_menhir.mly"
+# 1547 "parser_cocci_menhir.mly"
                  ( [_1] )
-# 6682 "parser_cocci_menhir.ml"
+# 6716 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6710,15 +6744,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6714 "parser_cocci_menhir.ml"
+# 6748 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_one_dec_decl_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_decl_list_start_decl_ = 
-# 1536 "parser_cocci_menhir.mly"
+# 1549 "parser_cocci_menhir.mly"
     ( _1::Ast0.wrap(Ast0.PComma(P.clt2mcode "," _2))::_3 )
-# 6722 "parser_cocci_menhir.ml"
+# 6756 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6745,15 +6779,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6749 "parser_cocci_menhir.ml"
+# 6783 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_decl_list_start_decl_ = 
-# 1538 "parser_cocci_menhir.mly"
+# 1551 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Pdots(P.clt2mcode "..." _1))::
       (List.concat(List.map (function x -> x (P.mkpdots "...")) _2)) )
-# 6757 "parser_cocci_menhir.ml"
+# 6791 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6775,9 +6809,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_list_start_name_opt_decl_ = 
-# 1534 "parser_cocci_menhir.mly"
+# 1547 "parser_cocci_menhir.mly"
                  ( [_1] )
-# 6781 "parser_cocci_menhir.ml"
+# 6815 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6809,15 +6843,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6813 "parser_cocci_menhir.ml"
+# 6847 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_one_dec_name_opt_decl_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_decl_list_start_name_opt_decl_ = 
-# 1536 "parser_cocci_menhir.mly"
+# 1549 "parser_cocci_menhir.mly"
     ( _1::Ast0.wrap(Ast0.PComma(P.clt2mcode "," _2))::_3 )
-# 6821 "parser_cocci_menhir.ml"
+# 6855 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6844,15 +6878,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6848 "parser_cocci_menhir.ml"
+# 6882 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_decl_list_start_name_opt_decl_ = 
-# 1538 "parser_cocci_menhir.mly"
+# 1551 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Pdots(P.clt2mcode "..." _1))::
       (List.concat(List.map (function x -> x (P.mkpdots "...")) _2)) )
-# 6856 "parser_cocci_menhir.ml"
+# 6890 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6873,15 +6907,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 64 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 6877 "parser_cocci_menhir.ml"
+# 6911 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement = 
-# 1130 "parser_cocci_menhir.mly"
+# 1139 "parser_cocci_menhir.mly"
       ( let (nm,pure,clt) = _1 in
       [Ast0.wrap(Ast0.MetaStmt(P.clt2mcode nm clt,pure))] )
-# 6885 "parser_cocci_menhir.ml"
+# 6919 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6903,13 +6937,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement = 
-# 1133 "parser_cocci_menhir.mly"
+# 1142 "parser_cocci_menhir.mly"
       ( List.map
          (function x ->
            Ast0.wrap
              (Ast0.Decl((Ast0.default_info(),Ast0.context_befaft()),x)))
          _1 )
-# 6913 "parser_cocci_menhir.ml"
+# 6947 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6931,9 +6965,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement = 
-# 1138 "parser_cocci_menhir.mly"
+# 1147 "parser_cocci_menhir.mly"
               ( [_1] )
-# 6937 "parser_cocci_menhir.ml"
+# 6971 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -6964,18 +6998,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6968 "parser_cocci_menhir.ml"
+# 7002 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let t : 'tv_midzero_list_fun_start_fun_start_ = Obj.magic t in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 6974 "parser_cocci_menhir.ml"
+# 7008 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_decl_statement = 
-# 1147 "parser_cocci_menhir.mly"
+# 1156 "parser_cocci_menhir.mly"
       ( let (mids,code) = t in
        if List.for_all
            (function x ->
@@ -6985,7 +7019,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
       else
          [Ast0.wrap(Ast0.Disj(P.clt2mcode "(" _1, code, mids,
                               P.clt2mcode ")" _3))] )
-# 6989 "parser_cocci_menhir.ml"
+# 7023 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7006,15 +7040,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 64 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 7010 "parser_cocci_menhir.ml"
+# 7044 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement_expr = 
-# 1160 "parser_cocci_menhir.mly"
+# 1169 "parser_cocci_menhir.mly"
       ( let (nm,pure,clt) = _1 in
       [Ast0.wrap(Ast0.MetaStmt(P.clt2mcode nm clt,pure))] )
-# 7018 "parser_cocci_menhir.ml"
+# 7052 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7036,13 +7070,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement_expr = 
-# 1163 "parser_cocci_menhir.mly"
+# 1172 "parser_cocci_menhir.mly"
       ( List.map
          (function x ->
            Ast0.wrap
              (Ast0.Decl((Ast0.default_info(),Ast0.context_befaft()),x)))
          _1 )
-# 7046 "parser_cocci_menhir.ml"
+# 7080 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7064,9 +7098,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement_expr = 
-# 1168 "parser_cocci_menhir.mly"
+# 1177 "parser_cocci_menhir.mly"
               ( [_1] )
-# 7070 "parser_cocci_menhir.ml"
+# 7104 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7097,18 +7131,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7101 "parser_cocci_menhir.ml"
+# 7135 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let t : 'tv_midzero_list_fun_after_stm_fun_after_dots_or_ = Obj.magic t in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7107 "parser_cocci_menhir.ml"
+# 7141 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_decl_statement_expr = 
-# 1177 "parser_cocci_menhir.mly"
+# 1186 "parser_cocci_menhir.mly"
       ( let (mids,code) = t in
        if List.for_all (function [] -> true | _ -> false) code
       then []
@@ -7117,7 +7151,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
            List.map (function x -> Ast0.wrap(Ast0.DOTS x)) code in
          [Ast0.wrap(Ast0.Disj(P.clt2mcode "(" _1, dot_code, mids,
                               P.clt2mcode ")" _3))] )
-# 7121 "parser_cocci_menhir.ml"
+# 7155 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7143,15 +7177,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7147 "parser_cocci_menhir.ml"
+# 7181 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let t : 'tv_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_pv_ in
         let _v : 'tv_decl_var = 
-# 943 "parser_cocci_menhir.mly"
+# 952 "parser_cocci_menhir.mly"
       ( [Ast0.wrap(Ast0.TyDecl(t,P.clt2mcode ";" pv))] )
-# 7155 "parser_cocci_menhir.ml"
+# 7189 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7182,7 +7216,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7186 "parser_cocci_menhir.ml"
+# 7220 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_comma_list_d_ident_ = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -7192,16 +7226,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 7196 "parser_cocci_menhir.ml"
+# 7230 "parser_cocci_menhir.ml"
           
         in
         
-# 945 "parser_cocci_menhir.mly"
+# 954 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)))
          d )
-# 7205 "parser_cocci_menhir.ml"
+# 7239 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7237,7 +7271,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7241 "parser_cocci_menhir.ml"
+# 7275 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_comma_list_d_ident_ = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -7249,16 +7283,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 7253 "parser_cocci_menhir.ml"
+# 7287 "parser_cocci_menhir.ml"
           
         in
         
-# 945 "parser_cocci_menhir.mly"
+# 954 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)))
          d )
-# 7262 "parser_cocci_menhir.ml"
+# 7296 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7280,9 +7314,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_f_ in
         let _v : 'tv_decl_var = 
-# 949 "parser_cocci_menhir.mly"
+# 958 "parser_cocci_menhir.mly"
                ( [f] )
-# 7286 "parser_cocci_menhir.ml"
+# 7320 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7323,13 +7357,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7327 "parser_cocci_menhir.ml"
+# 7361 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7333 "parser_cocci_menhir.ml"
+# 7367 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -7339,14 +7373,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 7343 "parser_cocci_menhir.ml"
+# 7377 "parser_cocci_menhir.ml"
           
         in
         
-# 951 "parser_cocci_menhir.mly"
+# 960 "parser_cocci_menhir.mly"
       (let (id,fn) = d in
       [Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv))])
-# 7350 "parser_cocci_menhir.ml"
+# 7384 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7392,13 +7426,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7396 "parser_cocci_menhir.ml"
+# 7430 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7402 "parser_cocci_menhir.ml"
+# 7436 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -7410,14 +7444,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 7414 "parser_cocci_menhir.ml"
+# 7448 "parser_cocci_menhir.ml"
           
         in
         
-# 951 "parser_cocci_menhir.mly"
+# 960 "parser_cocci_menhir.mly"
       (let (id,fn) = d in
       [Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv))])
-# 7421 "parser_cocci_menhir.ml"
+# 7455 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7448,7 +7482,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7452 "parser_cocci_menhir.ml"
+# 7486 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_comma_list_d_ident_ = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -7458,25 +7492,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 7462 "parser_cocci_menhir.ml"
+# 7496 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 7469 "parser_cocci_menhir.ml"
+# 7503 "parser_cocci_menhir.ml"
           
         in
         
-# 956 "parser_cocci_menhir.mly"
+# 965 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            let idtype =
              P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
            Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)))
          d )
-# 7480 "parser_cocci_menhir.ml"
+# 7514 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7512,7 +7546,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7516 "parser_cocci_menhir.ml"
+# 7550 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_comma_list_d_ident_ = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -7524,25 +7558,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 7528 "parser_cocci_menhir.ml"
+# 7562 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 7535 "parser_cocci_menhir.ml"
+# 7569 "parser_cocci_menhir.ml"
           
         in
         
-# 956 "parser_cocci_menhir.mly"
+# 965 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            let idtype =
              P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
            Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)))
          d )
-# 7546 "parser_cocci_menhir.ml"
+# 7580 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7578,7 +7612,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7582 "parser_cocci_menhir.ml"
+# 7616 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_comma_list_d_ident_ = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -7589,7 +7623,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 7593 "parser_cocci_menhir.ml"
+# 7627 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -7597,18 +7631,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 7601 "parser_cocci_menhir.ml"
+# 7635 "parser_cocci_menhir.ml"
           
         in
         
-# 956 "parser_cocci_menhir.mly"
+# 965 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            let idtype =
              P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
            Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)))
          d )
-# 7612 "parser_cocci_menhir.ml"
+# 7646 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7649,7 +7683,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7653 "parser_cocci_menhir.ml"
+# 7687 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_comma_list_d_ident_ = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -7662,7 +7696,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 7666 "parser_cocci_menhir.ml"
+# 7700 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -7670,18 +7704,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 7674 "parser_cocci_menhir.ml"
+# 7708 "parser_cocci_menhir.ml"
           
         in
         
-# 956 "parser_cocci_menhir.mly"
+# 965 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            let idtype =
              P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
            Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)))
          d )
-# 7685 "parser_cocci_menhir.ml"
+# 7719 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7722,13 +7756,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7726 "parser_cocci_menhir.ml"
+# 7760 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7732 "parser_cocci_menhir.ml"
+# 7766 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -7738,24 +7772,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 7742 "parser_cocci_menhir.ml"
+# 7776 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 7749 "parser_cocci_menhir.ml"
+# 7783 "parser_cocci_menhir.ml"
           
         in
         
-# 964 "parser_cocci_menhir.mly"
+# 973 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       [Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv))] )
-# 7759 "parser_cocci_menhir.ml"
+# 7793 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7801,13 +7835,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7805 "parser_cocci_menhir.ml"
+# 7839 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7811 "parser_cocci_menhir.ml"
+# 7845 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -7819,24 +7853,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 7823 "parser_cocci_menhir.ml"
+# 7857 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 7830 "parser_cocci_menhir.ml"
+# 7864 "parser_cocci_menhir.ml"
           
         in
         
-# 964 "parser_cocci_menhir.mly"
+# 973 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       [Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv))] )
-# 7840 "parser_cocci_menhir.ml"
+# 7874 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7882,13 +7916,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7886 "parser_cocci_menhir.ml"
+# 7920 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7892 "parser_cocci_menhir.ml"
+# 7926 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -7899,7 +7933,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 7903 "parser_cocci_menhir.ml"
+# 7937 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -7907,17 +7941,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 7911 "parser_cocci_menhir.ml"
+# 7945 "parser_cocci_menhir.ml"
           
         in
         
-# 964 "parser_cocci_menhir.mly"
+# 973 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       [Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv))] )
-# 7921 "parser_cocci_menhir.ml"
+# 7955 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -7968,13 +8002,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7972 "parser_cocci_menhir.ml"
+# 8006 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 7978 "parser_cocci_menhir.ml"
+# 8012 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -7987,7 +8021,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 7991 "parser_cocci_menhir.ml"
+# 8025 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -7995,17 +8029,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 7999 "parser_cocci_menhir.ml"
+# 8033 "parser_cocci_menhir.ml"
           
         in
         
-# 964 "parser_cocci_menhir.mly"
+# 973 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       [Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv))] )
-# 8009 "parser_cocci_menhir.ml"
+# 8043 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8066,34 +8100,34 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8070 "parser_cocci_menhir.ml"
+# 8104 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let rp2 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8075 "parser_cocci_menhir.ml"
+# 8109 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8081 "parser_cocci_menhir.ml"
+# 8115 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8086 "parser_cocci_menhir.ml"
+# 8120 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8092 "parser_cocci_menhir.ml"
+# 8126 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8097 "parser_cocci_menhir.ml"
+# 8131 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_fn_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
@@ -8102,11 +8136,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 8106 "parser_cocci_menhir.ml"
+# 8140 "parser_cocci_menhir.ml"
           
         in
         
-# 974 "parser_cocci_menhir.mly"
+# 983 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -8114,7 +8148,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
         [Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv))] )
-# 8118 "parser_cocci_menhir.ml"
+# 8152 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8180,34 +8214,34 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8184 "parser_cocci_menhir.ml"
+# 8218 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let rp2 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8189 "parser_cocci_menhir.ml"
+# 8223 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8195 "parser_cocci_menhir.ml"
+# 8229 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8200 "parser_cocci_menhir.ml"
+# 8234 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8206 "parser_cocci_menhir.ml"
+# 8240 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8211 "parser_cocci_menhir.ml"
+# 8245 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_fn_ctype = Obj.magic t in
         let x0 : 'tv_storage = Obj.magic x0 in
@@ -8218,11 +8252,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 8222 "parser_cocci_menhir.ml"
+# 8256 "parser_cocci_menhir.ml"
           
         in
         
-# 974 "parser_cocci_menhir.mly"
+# 983 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -8230,7 +8264,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
         [Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv))] )
-# 8234 "parser_cocci_menhir.ml"
+# 8268 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8271,27 +8305,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _5 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8275 "parser_cocci_menhir.ml"
+# 8309 "parser_cocci_menhir.ml"
         ) = Obj.magic _5 in
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8280 "parser_cocci_menhir.ml"
+# 8314 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8286 "parser_cocci_menhir.ml"
+# 8320 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_decl_ident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_decl_var = 
-# 982 "parser_cocci_menhir.mly"
+# 991 "parser_cocci_menhir.mly"
       ( [Ast0.wrap(Ast0.MacroDecl(_1,P.clt2mcode "(" _2,_3,
                                  P.clt2mcode ")" _4,P.clt2mcode ";" _5))] )
-# 8295 "parser_cocci_menhir.ml"
+# 8329 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8362,40 +8396,40 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8366 "parser_cocci_menhir.ml"
+# 8400 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8372 "parser_cocci_menhir.ml"
+# 8406 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let rp2 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8377 "parser_cocci_menhir.ml"
+# 8411 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8383 "parser_cocci_menhir.ml"
+# 8417 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8388 "parser_cocci_menhir.ml"
+# 8422 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8394 "parser_cocci_menhir.ml"
+# 8428 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8399 "parser_cocci_menhir.ml"
+# 8433 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_fn_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
@@ -8404,11 +8438,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 8408 "parser_cocci_menhir.ml"
+# 8442 "parser_cocci_menhir.ml"
           
         in
         
-# 988 "parser_cocci_menhir.mly"
+# 997 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -8416,7 +8450,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
       [Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv))])
-# 8420 "parser_cocci_menhir.ml"
+# 8454 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8492,40 +8526,40 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8496 "parser_cocci_menhir.ml"
+# 8530 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8502 "parser_cocci_menhir.ml"
+# 8536 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let rp2 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8507 "parser_cocci_menhir.ml"
+# 8541 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8513 "parser_cocci_menhir.ml"
+# 8547 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8518 "parser_cocci_menhir.ml"
+# 8552 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8524 "parser_cocci_menhir.ml"
+# 8558 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8529 "parser_cocci_menhir.ml"
+# 8563 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_fn_ctype = Obj.magic t in
         let x0 : 'tv_storage = Obj.magic x0 in
@@ -8536,11 +8570,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 8540 "parser_cocci_menhir.ml"
+# 8574 "parser_cocci_menhir.ml"
           
         in
         
-# 988 "parser_cocci_menhir.mly"
+# 997 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -8548,7 +8582,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
       [Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv))])
-# 8552 "parser_cocci_menhir.ml"
+# 8586 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8584,22 +8618,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8588 "parser_cocci_menhir.ml"
+# 8622 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let id : 'tv_typedef_ident = Obj.magic id in
         let t : 'tv_ctype_full = Obj.magic t in
         let s : (
 # 53 "parser_cocci_menhir.mly"
       (Data.clt)
-# 8595 "parser_cocci_menhir.ml"
+# 8629 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_pv_ in
         let _v : 'tv_decl_var = 
-# 996 "parser_cocci_menhir.mly"
+# 1005 "parser_cocci_menhir.mly"
       ( let s = P.clt2mcode "typedef" s in
         [Ast0.wrap(Ast0.Typedef(s,t,id,P.clt2mcode ";" pv))] )
-# 8603 "parser_cocci_menhir.ml"
+# 8637 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8621,13 +8655,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_define_param_list = 
-# 704 "parser_cocci_menhir.mly"
+# 713 "parser_cocci_menhir.mly"
      (let circle x =
        match Ast0.unwrap x with Ast0.DPcircles(_) -> true | _ -> false in
      if List.exists circle _1
      then Ast0.wrap(Ast0.CIRCLES(_1))
      else Ast0.wrap(Ast0.DOTS(_1)) )
-# 8631 "parser_cocci_menhir.ml"
+# 8665 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8649,9 +8683,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_define_param_list_option = 
-# 728 "parser_cocci_menhir.mly"
+# 737 "parser_cocci_menhir.mly"
                                             ( _1 )
-# 8655 "parser_cocci_menhir.ml"
+# 8689 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8666,9 +8700,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_define_param_list_option = 
-# 729 "parser_cocci_menhir.mly"
+# 738 "parser_cocci_menhir.mly"
                            ( Ast0.wrap(Ast0.DOTS([])) )
-# 8672 "parser_cocci_menhir.ml"
+# 8706 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8690,9 +8724,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_define_param_list_start = 
-# 711 "parser_cocci_menhir.mly"
+# 720 "parser_cocci_menhir.mly"
           ( [Ast0.wrap(Ast0.DParam _1)] )
-# 8696 "parser_cocci_menhir.ml"
+# 8730 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8724,16 +8758,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8728 "parser_cocci_menhir.ml"
+# 8762 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_ident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_define_param_list_start = 
-# 713 "parser_cocci_menhir.mly"
+# 722 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.DParam _1)::
        Ast0.wrap(Ast0.DPComma(P.clt2mcode "," _2))::_3 )
-# 8737 "parser_cocci_menhir.ml"
+# 8771 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8760,15 +8794,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let d : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8764 "parser_cocci_menhir.ml"
+# 8798 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_define_param_list_start = 
-# 716 "parser_cocci_menhir.mly"
+# 725 "parser_cocci_menhir.mly"
       ( (P.mkdpdots "..." d)::
        (List.concat (List.map (function x -> x (P.mkdpdots "...")) r)) )
-# 8772 "parser_cocci_menhir.ml"
+# 8806 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8789,12 +8823,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 81 "parser_cocci_menhir.mly"
        (Data.clt * token)
-# 8793 "parser_cocci_menhir.ml"
+# 8827 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_defineop = 
-# 664 "parser_cocci_menhir.mly"
+# 673 "parser_cocci_menhir.mly"
     ( let (clt,ident) = _1 in
       function body ->
        Ast0.wrap
@@ -8811,7 +8845,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
                       "unexpected name for a #define")),
              Ast0.wrap Ast0.NoParams,
              body)) )
-# 8815 "parser_cocci_menhir.ml"
+# 8849 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8842,18 +8876,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 8846 "parser_cocci_menhir.ml"
+# 8880 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_define_param_list_option = Obj.magic _2 in
         let _1 : (
 # 82 "parser_cocci_menhir.mly"
        (Data.clt * token * int)
-# 8852 "parser_cocci_menhir.ml"
+# 8886 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_defineop = 
-# 681 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( let (clt,ident,parenoff) = _1 in
       let (arity,line,lline,offset,col,strbef,straft,pos) = clt in
       let lp =
@@ -8873,7 +8907,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
                    (Semantic_cocci.Semantic
                       "unexpected name for a #define")),
              Ast0.wrap (Ast0.DParams (lp,_2,P.clt2mcode ")" _3)),body)) )
-# 8877 "parser_cocci_menhir.ml"
+# 8911 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8895,9 +8929,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_dep = 
-# 221 "parser_cocci_menhir.mly"
+# 225 "parser_cocci_menhir.mly"
                    ( _1 )
-# 8901 "parser_cocci_menhir.ml"
+# 8935 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8929,9 +8963,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_dep = 
-# 222 "parser_cocci_menhir.mly"
+# 226 "parser_cocci_menhir.mly"
                    ( Ast.AndDep(_1, _3) )
-# 8935 "parser_cocci_menhir.ml"
+# 8969 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8963,9 +8997,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_dep = 
-# 223 "parser_cocci_menhir.mly"
+# 227 "parser_cocci_menhir.mly"
                    ( Ast.OrDep (_1, _3) )
-# 8969 "parser_cocci_menhir.ml"
+# 9003 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -8980,9 +9014,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_depends = 
-# 217 "parser_cocci_menhir.mly"
+# 221 "parser_cocci_menhir.mly"
                            ( Ast.NoDep )
-# 8986 "parser_cocci_menhir.ml"
+# 9020 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9012,9 +9046,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_parents_ in
         let _v : 'tv_depends = 
-# 218 "parser_cocci_menhir.mly"
+# 222 "parser_cocci_menhir.mly"
                            ( parents )
-# 9018 "parser_cocci_menhir.ml"
+# 9052 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9041,14 +9075,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9045 "parser_cocci_menhir.ml"
+# 9079 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_designator = 
-# 1094 "parser_cocci_menhir.mly"
+# 1103 "parser_cocci_menhir.mly"
      ( Ast0.DesignatorField (P.clt2mcode "." _1,_2) )
-# 9052 "parser_cocci_menhir.ml"
+# 9086 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9079,20 +9113,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9083 "parser_cocci_menhir.ml"
+# 9117 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9089 "parser_cocci_menhir.ml"
+# 9123 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_designator = 
-# 1096 "parser_cocci_menhir.mly"
+# 1105 "parser_cocci_menhir.mly"
      ( Ast0.DesignatorIndex (P.clt2mcode "[" _1,_2,P.clt2mcode "]" _3) )
-# 9096 "parser_cocci_menhir.ml"
+# 9130 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9133,27 +9167,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _5 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9137 "parser_cocci_menhir.ml"
+# 9171 "parser_cocci_menhir.ml"
         ) = Obj.magic _5 in
         let _4 : 'tv_eexpr = Obj.magic _4 in
         let _3 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9143 "parser_cocci_menhir.ml"
+# 9177 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9149 "parser_cocci_menhir.ml"
+# 9183 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_designator = 
-# 1098 "parser_cocci_menhir.mly"
+# 1107 "parser_cocci_menhir.mly"
      ( Ast0.DesignatorRange (P.clt2mcode "[" _1,_2,P.clt2mcode "..." _3,
                             _4,P.clt2mcode "]" _5) )
-# 9157 "parser_cocci_menhir.ml"
+# 9191 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9175,9 +9209,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_dexpr = 
-# 1197 "parser_cocci_menhir.mly"
+# 1206 "parser_cocci_menhir.mly"
                                           ( _1 )
-# 9181 "parser_cocci_menhir.ml"
+# 9215 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9203,9 +9237,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_disable = 
-# 236 "parser_cocci_menhir.mly"
+# 240 "parser_cocci_menhir.mly"
                                                       ( List.map P.id2name _2 )
-# 9209 "parser_cocci_menhir.ml"
+# 9243 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9226,14 +9260,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9230 "parser_cocci_menhir.ml"
+# 9264 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_dot_expressions = 
-# 1206 "parser_cocci_menhir.mly"
+# 1215 "parser_cocci_menhir.mly"
             ( Ast0.wrap(Ast0.Edots(P.clt2mcode "..." _1,None)) )
-# 9237 "parser_cocci_menhir.ml"
+# 9271 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9255,9 +9289,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_dot_expressions = 
-# 1207 "parser_cocci_menhir.mly"
+# 1216 "parser_cocci_menhir.mly"
                    ( _1 )
-# 9261 "parser_cocci_menhir.ml"
+# 9295 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9283,20 +9317,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let d : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9287 "parser_cocci_menhir.ml"
+# 9321 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let c : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9292 "parser_cocci_menhir.ml"
+# 9326 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let _startpos = _startpos_c_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_dp_comma_args_TEllipsis_ = 
-# 721 "parser_cocci_menhir.mly"
+# 730 "parser_cocci_menhir.mly"
     ( function dot_builder ->
       [Ast0.wrap(Ast0.DPComma(P.clt2mcode "," c)); dot_builder d] )
-# 9300 "parser_cocci_menhir.ml"
+# 9334 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9323,16 +9357,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9327 "parser_cocci_menhir.ml"
+# 9361 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_dp_comma_args_TEllipsis_ = 
-# 724 "parser_cocci_menhir.mly"
+# 733 "parser_cocci_menhir.mly"
     ( function dot_builder ->
       [Ast0.wrap(Ast0.DPComma(P.clt2mcode "," _1));
        Ast0.wrap(Ast0.DParam _2)] )
-# 9336 "parser_cocci_menhir.ml"
+# 9370 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9353,14 +9387,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let d : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9357 "parser_cocci_menhir.ml"
+# 9391 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_edots_when_TEllipsis_eexpr_ = 
-# 1795 "parser_cocci_menhir.mly"
+# 1808 "parser_cocci_menhir.mly"
                                                   ( (d,None) )
-# 9364 "parser_cocci_menhir.ml"
+# 9398 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9399,14 +9433,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let d : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9403 "parser_cocci_menhir.ml"
+# 9437 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_edots_when_TEllipsis_eexpr_ = 
-# 1796 "parser_cocci_menhir.mly"
+# 1809 "parser_cocci_menhir.mly"
                                                   ( (d,Some w) )
-# 9410 "parser_cocci_menhir.ml"
+# 9444 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9427,14 +9461,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let d : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9431 "parser_cocci_menhir.ml"
+# 9465 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_edots_when_TEllipsis_initialize_ = 
-# 1795 "parser_cocci_menhir.mly"
+# 1808 "parser_cocci_menhir.mly"
                                                   ( (d,None) )
-# 9438 "parser_cocci_menhir.ml"
+# 9472 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9473,14 +9507,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let d : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9477 "parser_cocci_menhir.ml"
+# 9511 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_edots_when_TEllipsis_initialize_ = 
-# 1796 "parser_cocci_menhir.mly"
+# 1809 "parser_cocci_menhir.mly"
                                                   ( (d,Some w) )
-# 9484 "parser_cocci_menhir.ml"
+# 9518 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9501,14 +9535,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let d : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9505 "parser_cocci_menhir.ml"
+# 9539 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_edots_when_TEllipsis_struct_decl_ = 
-# 1795 "parser_cocci_menhir.mly"
+# 1808 "parser_cocci_menhir.mly"
                                                   ( (d,None) )
-# 9512 "parser_cocci_menhir.ml"
+# 9546 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9547,14 +9581,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let d : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9551 "parser_cocci_menhir.ml"
+# 9585 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_edots_when_TEllipsis_struct_decl_ = 
-# 1796 "parser_cocci_menhir.mly"
+# 1809 "parser_cocci_menhir.mly"
                                                   ( (d,Some w) )
-# 9558 "parser_cocci_menhir.ml"
+# 9592 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9576,9 +9610,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_eexpr = 
-# 1195 "parser_cocci_menhir.mly"
+# 1204 "parser_cocci_menhir.mly"
                                          ( _1 )
-# 9582 "parser_cocci_menhir.ml"
+# 9616 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9600,7 +9634,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_eexpr_list = 
-# 1739 "parser_cocci_menhir.mly"
+# 1752 "parser_cocci_menhir.mly"
      (let circle x =
        match Ast0.unwrap x with Ast0.Ecircles(_) -> true | _ -> false in
      let star x =
@@ -9611,7 +9645,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
        if List.exists star _1
        then Ast0.wrap(Ast0.STARS(_1))
        else Ast0.wrap(Ast0.DOTS(_1)) )
-# 9615 "parser_cocci_menhir.ml"
+# 9649 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9633,9 +9667,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_eexpr_list_option = 
-# 1778 "parser_cocci_menhir.mly"
+# 1791 "parser_cocci_menhir.mly"
                               ( _1 )
-# 9639 "parser_cocci_menhir.ml"
+# 9673 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9650,9 +9684,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_eexpr_list_option = 
-# 1779 "parser_cocci_menhir.mly"
+# 1792 "parser_cocci_menhir.mly"
                            ( Ast0.wrap(Ast0.DOTS([])) )
-# 9656 "parser_cocci_menhir.ml"
+# 9690 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9674,9 +9708,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_eexpr_list_start = 
-# 1766 "parser_cocci_menhir.mly"
+# 1779 "parser_cocci_menhir.mly"
           ( [_1] )
-# 9680 "parser_cocci_menhir.ml"
+# 9714 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9708,15 +9742,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 9712 "parser_cocci_menhir.ml"
+# 9746 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_aexpr = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_eexpr_list_start = 
-# 1768 "parser_cocci_menhir.mly"
+# 1781 "parser_cocci_menhir.mly"
       ( _1::Ast0.wrap(Ast0.EComma(P.clt2mcode "," _2))::_3 )
-# 9720 "parser_cocci_menhir.ml"
+# 9754 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9758,9 +9792,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__6_ in
         let _v : 'tv_error_words = 
-# 1565 "parser_cocci_menhir.mly"
+# 1578 "parser_cocci_menhir.mly"
       ( [Ast0.wrap(Ast0.ERRORWORDS(cl))] )
-# 9764 "parser_cocci_menhir.ml"
+# 9798 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9780,9 +9814,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_exists = 
-# 239 "parser_cocci_menhir.mly"
+# 243 "parser_cocci_menhir.mly"
           ( Ast.Exists )
-# 9786 "parser_cocci_menhir.ml"
+# 9820 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9802,9 +9836,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_exists = 
-# 240 "parser_cocci_menhir.mly"
+# 244 "parser_cocci_menhir.mly"
           ( Ast.Forall )
-# 9808 "parser_cocci_menhir.ml"
+# 9842 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9828,9 +9862,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_exists = 
-# 241 "parser_cocci_menhir.mly"
+# 245 "parser_cocci_menhir.mly"
                    ( Ast.ReverseForall )
-# 9834 "parser_cocci_menhir.ml"
+# 9868 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9845,9 +9879,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_exists = 
-# 242 "parser_cocci_menhir.mly"
+# 246 "parser_cocci_menhir.mly"
           ( Ast.Undetermined )
-# 9851 "parser_cocci_menhir.ml"
+# 9885 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9869,9 +9903,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_expr = 
-# 1193 "parser_cocci_menhir.mly"
+# 1202 "parser_cocci_menhir.mly"
                                 ( _1 )
-# 9875 "parser_cocci_menhir.ml"
+# 9909 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9893,9 +9927,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_r_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_expr_dots_TEllipsis_ = 
-# 1375 "parser_cocci_menhir.mly"
+# 1384 "parser_cocci_menhir.mly"
                                                        ( r )
-# 9899 "parser_cocci_menhir.ml"
+# 9933 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9910,9 +9944,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_extends = 
-# 212 "parser_cocci_menhir.mly"
+# 216 "parser_cocci_menhir.mly"
                                                   ( () )
-# 9916 "parser_cocci_menhir.ml"
+# 9950 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9937,14 +9971,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let parent : (
 # 47 "parser_cocci_menhir.mly"
       (string)
-# 9941 "parser_cocci_menhir.ml"
+# 9975 "parser_cocci_menhir.ml"
         ) = Obj.magic parent in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_parent_ in
         let _v : 'tv_extends = 
-# 214 "parser_cocci_menhir.mly"
+# 218 "parser_cocci_menhir.mly"
     ( !Data.install_bindings (parent) )
-# 9948 "parser_cocci_menhir.ml"
+# 9982 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -9970,21 +10004,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 83 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 9974 "parser_cocci_menhir.ml"
+# 10008 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 83 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 9979 "parser_cocci_menhir.ml"
+# 10013 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_filespec = 
-# 623 "parser_cocci_menhir.mly"
+# 632 "parser_cocci_menhir.mly"
     ( [Ast0.wrap
          (Ast0.FILEINFO(P.id2mcode _1,
                         P.id2mcode _2))] )
-# 9988 "parser_cocci_menhir.ml"
+# 10022 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10012,9 +10046,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ty_ in
         let _endpos = _endpos_m_ in
         let _v : 'tv_fn_ctype = 
-# 572 "parser_cocci_menhir.mly"
+# 581 "parser_cocci_menhir.mly"
                                      ( P.pointerify ty m )
-# 10018 "parser_cocci_menhir.ml"
+# 10052 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10041,16 +10075,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let t : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 10045 "parser_cocci_menhir.ml"
+# 10079 "parser_cocci_menhir.ml"
         ) = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_m_ in
         let _v : 'tv_fn_ctype = 
-# 574 "parser_cocci_menhir.mly"
+# 583 "parser_cocci_menhir.mly"
          ( P.pointerify
             (Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])))
             m )
-# 10054 "parser_cocci_menhir.ml"
+# 10088 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10065,9 +10099,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fninfo = 
-# 767 "parser_cocci_menhir.mly"
+# 776 "parser_cocci_menhir.mly"
                 ( [] )
-# 10071 "parser_cocci_menhir.ml"
+# 10105 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10095,13 +10129,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo = 
-# 769 "parser_cocci_menhir.mly"
+# 778 "parser_cocci_menhir.mly"
       ( try
        let _ =
          List.find (function Ast0.FStorage(_) -> true | _ -> false) _2 in
        raise (Semantic_cocci.Semantic "duplicate storage")
       with Not_found -> (Ast0.FStorage(_1))::_2 )
-# 10105 "parser_cocci_menhir.ml"
+# 10139 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10129,9 +10163,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_fninfo = 
-# 774 "parser_cocci_menhir.mly"
+# 783 "parser_cocci_menhir.mly"
                            ( (Ast0.FType(t))::r )
-# 10135 "parser_cocci_menhir.ml"
+# 10169 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10158,17 +10192,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 53 "parser_cocci_menhir.mly"
       (Data.clt)
-# 10162 "parser_cocci_menhir.ml"
+# 10196 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo = 
-# 776 "parser_cocci_menhir.mly"
+# 785 "parser_cocci_menhir.mly"
       ( try
        let _ = List.find (function Ast0.FInline(_) -> true | _ -> false) _2 in
        raise (Semantic_cocci.Semantic "duplicate inline")
       with Not_found -> (Ast0.FInline(P.clt2mcode "inline" _1))::_2 )
-# 10172 "parser_cocci_menhir.ml"
+# 10206 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10195,17 +10229,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 55 "parser_cocci_menhir.mly"
       (string * Data.clt)
-# 10199 "parser_cocci_menhir.ml"
+# 10233 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo = 
-# 781 "parser_cocci_menhir.mly"
+# 790 "parser_cocci_menhir.mly"
       ( try
        let _ = List.find (function Ast0.FAttr(_) -> true | _ -> false) _2 in
        raise (Semantic_cocci.Semantic "multiple attributes")
       with Not_found -> (Ast0.FAttr(P.id2mcode _1))::_2 )
-# 10209 "parser_cocci_menhir.ml"
+# 10243 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10220,9 +10254,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fninfo_nt = 
-# 787 "parser_cocci_menhir.mly"
+# 796 "parser_cocci_menhir.mly"
                 ( [] )
-# 10226 "parser_cocci_menhir.ml"
+# 10260 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10250,13 +10284,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo_nt = 
-# 789 "parser_cocci_menhir.mly"
+# 798 "parser_cocci_menhir.mly"
       ( try
        let _ =
          List.find (function Ast0.FStorage(_) -> true | _ -> false) _2 in
        raise (Semantic_cocci.Semantic "duplicate storage")
       with Not_found -> (Ast0.FStorage(_1))::_2 )
-# 10260 "parser_cocci_menhir.ml"
+# 10294 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10283,17 +10317,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 53 "parser_cocci_menhir.mly"
       (Data.clt)
-# 10287 "parser_cocci_menhir.ml"
+# 10321 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo_nt = 
-# 795 "parser_cocci_menhir.mly"
+# 804 "parser_cocci_menhir.mly"
       ( try
        let _ = List.find (function Ast0.FInline(_) -> true | _ -> false) _2 in
        raise (Semantic_cocci.Semantic "duplicate inline")
       with Not_found -> (Ast0.FInline(P.clt2mcode "inline" _1))::_2 )
-# 10297 "parser_cocci_menhir.ml"
+# 10331 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10320,17 +10354,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 55 "parser_cocci_menhir.mly"
       (string * Data.clt)
-# 10324 "parser_cocci_menhir.ml"
+# 10358 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo_nt = 
-# 800 "parser_cocci_menhir.mly"
+# 809 "parser_cocci_menhir.mly"
       ( try
        let _ = List.find (function Ast0.FAttr(_) -> true | _ -> false) _2 in
        raise (Semantic_cocci.Semantic "duplicate init")
       with Not_found -> (Ast0.FAttr(P.id2mcode _1))::_2 )
-# 10334 "parser_cocci_menhir.ml"
+# 10368 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10345,9 +10379,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fun_after_dots = 
-# 1687 "parser_cocci_menhir.mly"
+# 1700 "parser_cocci_menhir.mly"
                                ([])
-# 10351 "parser_cocci_menhir.ml"
+# 10385 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10373,9 +10407,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots = 
-# 1688 "parser_cocci_menhir.mly"
+# 1701 "parser_cocci_menhir.mly"
                                (_2)
-# 10379 "parser_cocci_menhir.ml"
+# 10413 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10403,9 +10437,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots = 
-# 1689 "parser_cocci_menhir.mly"
+# 1702 "parser_cocci_menhir.mly"
                                (Ast0.wrap(Ast0.Exp(_1))::_2)
-# 10409 "parser_cocci_menhir.ml"
+# 10443 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10433,9 +10467,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots = 
-# 1690 "parser_cocci_menhir.mly"
+# 1703 "parser_cocci_menhir.mly"
                                     (_1@_2)
-# 10439 "parser_cocci_menhir.ml"
+# 10473 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10450,9 +10484,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fun_after_dots_or = 
-# 1697 "parser_cocci_menhir.mly"
+# 1710 "parser_cocci_menhir.mly"
                                ([])
-# 10456 "parser_cocci_menhir.ml"
+# 10490 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10478,9 +10512,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots_or = 
-# 1698 "parser_cocci_menhir.mly"
+# 1711 "parser_cocci_menhir.mly"
                                (_2)
-# 10484 "parser_cocci_menhir.ml"
+# 10518 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10508,9 +10542,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots_or = 
-# 1699 "parser_cocci_menhir.mly"
+# 1712 "parser_cocci_menhir.mly"
                                (Ast0.wrap(Ast0.Exp(_1))::_2)
-# 10514 "parser_cocci_menhir.ml"
+# 10548 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10538,9 +10572,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots_or = 
-# 1700 "parser_cocci_menhir.mly"
+# 1713 "parser_cocci_menhir.mly"
                                     (_1@_2)
-# 10544 "parser_cocci_menhir.ml"
+# 10578 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10568,9 +10602,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_exp = 
-# 1693 "parser_cocci_menhir.mly"
+# 1706 "parser_cocci_menhir.mly"
                                (_1::_2)
-# 10574 "parser_cocci_menhir.ml"
+# 10608 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10585,9 +10619,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fun_after_exp_or = 
-# 1703 "parser_cocci_menhir.mly"
+# 1716 "parser_cocci_menhir.mly"
                                ([])
-# 10591 "parser_cocci_menhir.ml"
+# 10625 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10615,9 +10649,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_exp_or = 
-# 1704 "parser_cocci_menhir.mly"
+# 1717 "parser_cocci_menhir.mly"
                                (_1::_2)
-# 10621 "parser_cocci_menhir.ml"
+# 10655 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10632,9 +10666,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fun_after_stm = 
-# 1682 "parser_cocci_menhir.mly"
+# 1695 "parser_cocci_menhir.mly"
                                ([])
-# 10638 "parser_cocci_menhir.ml"
+# 10672 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10662,9 +10696,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_stm = 
-# 1683 "parser_cocci_menhir.mly"
+# 1696 "parser_cocci_menhir.mly"
                                (_1::_2)
-# 10668 "parser_cocci_menhir.ml"
+# 10702 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10692,9 +10726,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_stm = 
-# 1684 "parser_cocci_menhir.mly"
+# 1697 "parser_cocci_menhir.mly"
                                (_1@_2)
-# 10698 "parser_cocci_menhir.ml"
+# 10732 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10716,9 +10750,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_fun_start = 
-# 1679 "parser_cocci_menhir.mly"
+# 1692 "parser_cocci_menhir.mly"
                  ( Ast0.wrap(Ast0.DOTS(_1)) )
-# 10722 "parser_cocci_menhir.ml"
+# 10756 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10740,9 +10774,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_func_ident = 
-# 1483 "parser_cocci_menhir.mly"
+# 1496 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) )
-# 10746 "parser_cocci_menhir.ml"
+# 10780 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10763,15 +10797,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 61 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
-# 10767 "parser_cocci_menhir.ml"
+# 10801 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_func_ident = 
-# 1485 "parser_cocci_menhir.mly"
+# 1498 "parser_cocci_menhir.mly"
          ( let (nm,constraints,pure,clt) = _1 in
         Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,pure)) )
-# 10775 "parser_cocci_menhir.ml"
+# 10809 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10792,15 +10826,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 61 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
-# 10796 "parser_cocci_menhir.ml"
+# 10830 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_func_ident = 
-# 1488 "parser_cocci_menhir.mly"
+# 1501 "parser_cocci_menhir.mly"
          ( let (nm,constraints,pure,clt) = _1 in
         Ast0.wrap(Ast0.MetaFunc(P.clt2mcode nm clt,constraints,pure)) )
-# 10804 "parser_cocci_menhir.ml"
+# 10838 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10821,16 +10855,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 61 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
-# 10825 "parser_cocci_menhir.ml"
+# 10859 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_func_ident = 
-# 1491 "parser_cocci_menhir.mly"
+# 1504 "parser_cocci_menhir.mly"
   ( let (nm,constraints,pure,clt) = _1 in
         Ast0.wrap
           (Ast0.MetaLocalFunc(P.clt2mcode nm clt,constraints,pure)) )
-# 10834 "parser_cocci_menhir.ml"
+# 10868 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10890,38 +10924,38 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rb : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 10894 "parser_cocci_menhir.ml"
+# 10928 "parser_cocci_menhir.ml"
         ) = Obj.magic rb in
         let b : 'tv_fun_start = Obj.magic b in
         let lb : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 10900 "parser_cocci_menhir.ml"
+# 10934 "parser_cocci_menhir.ml"
         ) = Obj.magic lb in
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 10905 "parser_cocci_menhir.ml"
+# 10939 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let d : 'tv_decl_list_decl_ = Obj.magic d in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 10911 "parser_cocci_menhir.ml"
+# 10945 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let i : 'tv_func_ident = Obj.magic i in
         let f : 'tv_fninfo = Obj.magic f in
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_rb_ in
         let _v : 'tv_fundecl = 
-# 759 "parser_cocci_menhir.mly"
+# 768 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.FunDecl((Ast0.default_info(),Ast0.context_befaft()),
                               f, i,
                               P.clt2mcode "(" lp, d,
                               P.clt2mcode ")" rp,
                               P.clt2mcode "{" lb, b,
                               P.clt2mcode "}" rb)) )
-# 10925 "parser_cocci_menhir.ml"
+# 10959 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -10967,18 +11001,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pt : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 10971 "parser_cocci_menhir.ml"
+# 11005 "parser_cocci_menhir.ml"
         ) = Obj.magic pt in
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 10976 "parser_cocci_menhir.ml"
+# 11010 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 10982 "parser_cocci_menhir.ml"
+# 11016 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let id : 'tv_func_ident = Obj.magic id in
         let t : 'tv_ctype = Obj.magic t in
@@ -10988,11 +11022,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 10992 "parser_cocci_menhir.ml"
+# 11026 "parser_cocci_menhir.ml"
           
         in
         
-# 736 "parser_cocci_menhir.mly"
+# 745 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.UnInit
             (s,
@@ -11000,7 +11034,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
                (Ast0.FunctionType(Some t,
                                   P.clt2mcode "(" lp, d, P.clt2mcode ")" rp)),
              id, P.clt2mcode ";" pt)) )
-# 11004 "parser_cocci_menhir.ml"
+# 11038 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11051,18 +11085,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pt : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 11055 "parser_cocci_menhir.ml"
+# 11089 "parser_cocci_menhir.ml"
         ) = Obj.magic pt in
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 11060 "parser_cocci_menhir.ml"
+# 11094 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 11066 "parser_cocci_menhir.ml"
+# 11100 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let id : 'tv_func_ident = Obj.magic id in
         let t : 'tv_ctype = Obj.magic t in
@@ -11074,11 +11108,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 11078 "parser_cocci_menhir.ml"
+# 11112 "parser_cocci_menhir.ml"
           
         in
         
-# 736 "parser_cocci_menhir.mly"
+# 745 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.UnInit
             (s,
@@ -11086,7 +11120,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
                (Ast0.FunctionType(Some t,
                                   P.clt2mcode "(" lp, d, P.clt2mcode ")" rp)),
              id, P.clt2mcode ";" pt)) )
-# 11090 "parser_cocci_menhir.ml"
+# 11124 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11132,24 +11166,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pt : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 11136 "parser_cocci_menhir.ml"
+# 11170 "parser_cocci_menhir.ml"
         ) = Obj.magic pt in
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 11141 "parser_cocci_menhir.ml"
+# 11175 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 11147 "parser_cocci_menhir.ml"
+# 11181 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let id : 'tv_func_ident = Obj.magic id in
         let t : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11153 "parser_cocci_menhir.ml"
+# 11187 "parser_cocci_menhir.ml"
         ) = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_pt_ in
@@ -11157,11 +11191,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 11161 "parser_cocci_menhir.ml"
+# 11195 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( let t = Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])) in
       Ast0.wrap
         (Ast0.UnInit
@@ -11170,7 +11204,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
              (Ast0.FunctionType(Some t,
                                 P.clt2mcode "(" lp, d, P.clt2mcode ")" rp)),
            id, P.clt2mcode ";" pt)) )
-# 11174 "parser_cocci_menhir.ml"
+# 11208 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11221,24 +11255,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pt : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 11225 "parser_cocci_menhir.ml"
+# 11259 "parser_cocci_menhir.ml"
         ) = Obj.magic pt in
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 11230 "parser_cocci_menhir.ml"
+# 11264 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 11236 "parser_cocci_menhir.ml"
+# 11270 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let id : 'tv_func_ident = Obj.magic id in
         let t : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11242 "parser_cocci_menhir.ml"
+# 11276 "parser_cocci_menhir.ml"
         ) = Obj.magic t in
         let x0 : 'tv_storage = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -11248,11 +11282,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 11252 "parser_cocci_menhir.ml"
+# 11286 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( let t = Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" t])) in
       Ast0.wrap
         (Ast0.UnInit
@@ -11261,7 +11295,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
              (Ast0.FunctionType(Some t,
                                 P.clt2mcode "(" lp, d, P.clt2mcode ")" rp)),
            id, P.clt2mcode ";" pt)) )
-# 11265 "parser_cocci_menhir.ml"
+# 11299 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11282,22 +11316,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let r0 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11286 "parser_cocci_menhir.ml"
+# 11320 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_r0_ in
         let _v : 'tv_generic_ctype = let q =
           let r = r0 in
           
-# 580 "parser_cocci_menhir.mly"
+# 589 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) )
-# 11295 "parser_cocci_menhir.ml"
+# 11329 "parser_cocci_menhir.ml"
           
         in
         
-# 504 "parser_cocci_menhir.mly"
+# 513 "parser_cocci_menhir.mly"
                           ( q None )
-# 11301 "parser_cocci_menhir.ml"
+# 11335 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11318,22 +11352,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let r0 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11322 "parser_cocci_menhir.ml"
+# 11356 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_r0_ in
         let _v : 'tv_generic_ctype = let q =
           let r = r0 in
           
-# 582 "parser_cocci_menhir.mly"
+# 591 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) )
-# 11331 "parser_cocci_menhir.ml"
+# 11365 "parser_cocci_menhir.ml"
           
         in
         
-# 504 "parser_cocci_menhir.mly"
+# 513 "parser_cocci_menhir.mly"
                           ( q None )
-# 11337 "parser_cocci_menhir.ml"
+# 11371 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11355,9 +11389,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_generic_ctype = 
-# 505 "parser_cocci_menhir.mly"
+# 514 "parser_cocci_menhir.mly"
                           ( _1 )
-# 11361 "parser_cocci_menhir.ml"
+# 11395 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11383,12 +11417,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11387 "parser_cocci_menhir.ml"
+# 11421 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11392 "parser_cocci_menhir.ml"
+# 11426 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_ty_ in
@@ -11397,21 +11431,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 580 "parser_cocci_menhir.mly"
+# 589 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) )
-# 11403 "parser_cocci_menhir.ml"
+# 11437 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 11409 "parser_cocci_menhir.ml"
+# 11443 "parser_cocci_menhir.ml"
           
         in
         
-# 457 "parser_cocci_menhir.mly"
+# 466 "parser_cocci_menhir.mly"
         ( q (Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty]))) )
-# 11415 "parser_cocci_menhir.ml"
+# 11449 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11437,12 +11471,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11441 "parser_cocci_menhir.ml"
+# 11475 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11446 "parser_cocci_menhir.ml"
+# 11480 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_ty_ in
@@ -11451,21 +11485,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 582 "parser_cocci_menhir.mly"
+# 591 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) )
-# 11457 "parser_cocci_menhir.ml"
+# 11491 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 11463 "parser_cocci_menhir.ml"
+# 11497 "parser_cocci_menhir.ml"
           
         in
         
-# 457 "parser_cocci_menhir.mly"
+# 466 "parser_cocci_menhir.mly"
         ( q (Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty]))) )
-# 11469 "parser_cocci_menhir.ml"
+# 11503 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11486,21 +11520,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11490 "parser_cocci_menhir.ml"
+# 11524 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let _startpos = _startpos_ty_ in
         let _endpos = _endpos_ty_ in
         let _v : 'tv_generic_ctype_full = let q =
           
-# 586 "parser_cocci_menhir.mly"
+# 595 "parser_cocci_menhir.mly"
                 ( function x -> x )
-# 11498 "parser_cocci_menhir.ml"
+# 11532 "parser_cocci_menhir.ml"
           
         in
         
-# 457 "parser_cocci_menhir.mly"
+# 466 "parser_cocci_menhir.mly"
         ( q (Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty]))) )
-# 11504 "parser_cocci_menhir.ml"
+# 11538 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11526,12 +11560,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11530 "parser_cocci_menhir.ml"
+# 11564 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11535 "parser_cocci_menhir.ml"
+# 11569 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_ty_ in
@@ -11540,21 +11574,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 580 "parser_cocci_menhir.mly"
+# 589 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) )
-# 11546 "parser_cocci_menhir.ml"
+# 11580 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 11552 "parser_cocci_menhir.ml"
+# 11586 "parser_cocci_menhir.ml"
           
         in
         
-# 459 "parser_cocci_menhir.mly"
+# 468 "parser_cocci_menhir.mly"
         ( q (Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty]))))
-# 11558 "parser_cocci_menhir.ml"
+# 11592 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11580,12 +11614,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11584 "parser_cocci_menhir.ml"
+# 11618 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11589 "parser_cocci_menhir.ml"
+# 11623 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_ty_ in
@@ -11594,21 +11628,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 582 "parser_cocci_menhir.mly"
+# 591 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) )
-# 11600 "parser_cocci_menhir.ml"
+# 11634 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 11606 "parser_cocci_menhir.ml"
+# 11640 "parser_cocci_menhir.ml"
           
         in
         
-# 459 "parser_cocci_menhir.mly"
+# 468 "parser_cocci_menhir.mly"
         ( q (Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty]))))
-# 11612 "parser_cocci_menhir.ml"
+# 11646 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11629,21 +11663,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11633 "parser_cocci_menhir.ml"
+# 11667 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let _startpos = _startpos_ty_ in
         let _endpos = _endpos_ty_ in
         let _v : 'tv_generic_ctype_full = let q =
           
-# 586 "parser_cocci_menhir.mly"
+# 595 "parser_cocci_menhir.mly"
                 ( function x -> x )
-# 11641 "parser_cocci_menhir.ml"
+# 11675 "parser_cocci_menhir.ml"
           
         in
         
-# 459 "parser_cocci_menhir.mly"
+# 468 "parser_cocci_menhir.mly"
         ( q (Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty]))))
-# 11647 "parser_cocci_menhir.ml"
+# 11681 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11669,12 +11703,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11673 "parser_cocci_menhir.ml"
+# 11707 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11678 "parser_cocci_menhir.ml"
+# 11712 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_ty_ in
@@ -11683,21 +11717,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 580 "parser_cocci_menhir.mly"
+# 589 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) )
-# 11689 "parser_cocci_menhir.ml"
+# 11723 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 11695 "parser_cocci_menhir.ml"
+# 11729 "parser_cocci_menhir.ml"
           
         in
         
-# 461 "parser_cocci_menhir.mly"
+# 470 "parser_cocci_menhir.mly"
          ( q (Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty]))) )
-# 11701 "parser_cocci_menhir.ml"
+# 11735 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11723,12 +11757,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11727 "parser_cocci_menhir.ml"
+# 11761 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11732 "parser_cocci_menhir.ml"
+# 11766 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_ty_ in
@@ -11737,21 +11771,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 582 "parser_cocci_menhir.mly"
+# 591 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) )
-# 11743 "parser_cocci_menhir.ml"
+# 11777 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 11749 "parser_cocci_menhir.ml"
+# 11783 "parser_cocci_menhir.ml"
           
         in
         
-# 461 "parser_cocci_menhir.mly"
+# 470 "parser_cocci_menhir.mly"
          ( q (Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty]))) )
-# 11755 "parser_cocci_menhir.ml"
+# 11789 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11772,21 +11806,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11776 "parser_cocci_menhir.ml"
+# 11810 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let _startpos = _startpos_ty_ in
         let _endpos = _endpos_ty_ in
         let _v : 'tv_generic_ctype_full = let q =
           
-# 586 "parser_cocci_menhir.mly"
+# 595 "parser_cocci_menhir.mly"
                 ( function x -> x )
-# 11784 "parser_cocci_menhir.ml"
+# 11818 "parser_cocci_menhir.ml"
           
         in
         
-# 461 "parser_cocci_menhir.mly"
+# 470 "parser_cocci_menhir.mly"
          ( q (Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty]))) )
-# 11790 "parser_cocci_menhir.ml"
+# 11824 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11807,14 +11841,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let t : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11811 "parser_cocci_menhir.ml"
+# 11845 "parser_cocci_menhir.ml"
         ) = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_generic_ctype_full = 
-# 463 "parser_cocci_menhir.mly"
+# 472 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.BaseType(Ast.DoubleType,[P.clt2mcode "double" t])) )
-# 11818 "parser_cocci_menhir.ml"
+# 11852 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11835,14 +11869,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let t : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11839 "parser_cocci_menhir.ml"
+# 11873 "parser_cocci_menhir.ml"
         ) = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_generic_ctype_full = 
-# 465 "parser_cocci_menhir.mly"
+# 474 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.BaseType(Ast.FloatType,[P.clt2mcode "float" t])) )
-# 11846 "parser_cocci_menhir.ml"
+# 11880 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11868,12 +11902,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11872 "parser_cocci_menhir.ml"
+# 11906 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11877 "parser_cocci_menhir.ml"
+# 11911 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_ty_ in
@@ -11882,21 +11916,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 580 "parser_cocci_menhir.mly"
+# 589 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) )
-# 11888 "parser_cocci_menhir.ml"
+# 11922 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 11894 "parser_cocci_menhir.ml"
+# 11928 "parser_cocci_menhir.ml"
           
         in
         
-# 467 "parser_cocci_menhir.mly"
+# 476 "parser_cocci_menhir.mly"
          ( q (Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty]))) )
-# 11900 "parser_cocci_menhir.ml"
+# 11934 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11922,12 +11956,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11926 "parser_cocci_menhir.ml"
+# 11960 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11931 "parser_cocci_menhir.ml"
+# 11965 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_ty_ in
@@ -11936,21 +11970,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 582 "parser_cocci_menhir.mly"
+# 591 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) )
-# 11942 "parser_cocci_menhir.ml"
+# 11976 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 11948 "parser_cocci_menhir.ml"
+# 11982 "parser_cocci_menhir.ml"
           
         in
         
-# 467 "parser_cocci_menhir.mly"
+# 476 "parser_cocci_menhir.mly"
          ( q (Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty]))) )
-# 11954 "parser_cocci_menhir.ml"
+# 11988 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -11971,21 +12005,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 11975 "parser_cocci_menhir.ml"
+# 12009 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let _startpos = _startpos_ty_ in
         let _endpos = _endpos_ty_ in
         let _v : 'tv_generic_ctype_full = let q =
           
-# 586 "parser_cocci_menhir.mly"
+# 595 "parser_cocci_menhir.mly"
                 ( function x -> x )
-# 11983 "parser_cocci_menhir.ml"
+# 12017 "parser_cocci_menhir.ml"
           
         in
         
-# 467 "parser_cocci_menhir.mly"
+# 476 "parser_cocci_menhir.mly"
          ( q (Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty]))) )
-# 11989 "parser_cocci_menhir.ml"
+# 12023 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12016,17 +12050,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty1 : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12020 "parser_cocci_menhir.ml"
+# 12054 "parser_cocci_menhir.ml"
         ) = Obj.magic ty1 in
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12025 "parser_cocci_menhir.ml"
+# 12059 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12030 "parser_cocci_menhir.ml"
+# 12064 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_ty1_ in
@@ -12035,24 +12069,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 580 "parser_cocci_menhir.mly"
+# 589 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) )
-# 12041 "parser_cocci_menhir.ml"
+# 12075 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 12047 "parser_cocci_menhir.ml"
+# 12081 "parser_cocci_menhir.ml"
           
         in
         
-# 469 "parser_cocci_menhir.mly"
+# 478 "parser_cocci_menhir.mly"
          ( q (Ast0.wrap
                (Ast0.BaseType
                   (Ast.LongLongType,
                      [P.clt2mcode "long" ty;P.clt2mcode "long" ty1]))) )
-# 12056 "parser_cocci_menhir.ml"
+# 12090 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12083,17 +12117,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty1 : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12087 "parser_cocci_menhir.ml"
+# 12121 "parser_cocci_menhir.ml"
         ) = Obj.magic ty1 in
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12092 "parser_cocci_menhir.ml"
+# 12126 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12097 "parser_cocci_menhir.ml"
+# 12131 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_ty1_ in
@@ -12102,24 +12136,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 582 "parser_cocci_menhir.mly"
+# 591 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) )
-# 12108 "parser_cocci_menhir.ml"
+# 12142 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 12114 "parser_cocci_menhir.ml"
+# 12148 "parser_cocci_menhir.ml"
           
         in
         
-# 469 "parser_cocci_menhir.mly"
+# 478 "parser_cocci_menhir.mly"
          ( q (Ast0.wrap
                (Ast0.BaseType
                   (Ast.LongLongType,
                      [P.clt2mcode "long" ty;P.clt2mcode "long" ty1]))) )
-# 12123 "parser_cocci_menhir.ml"
+# 12157 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12145,29 +12179,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let ty1 : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12149 "parser_cocci_menhir.ml"
+# 12183 "parser_cocci_menhir.ml"
         ) = Obj.magic ty1 in
         let ty : (
 # 49 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12154 "parser_cocci_menhir.ml"
+# 12188 "parser_cocci_menhir.ml"
         ) = Obj.magic ty in
         let _startpos = _startpos_ty_ in
         let _endpos = _endpos_ty1_ in
         let _v : 'tv_generic_ctype_full = let q =
           
-# 586 "parser_cocci_menhir.mly"
+# 595 "parser_cocci_menhir.mly"
                 ( function x -> x )
-# 12162 "parser_cocci_menhir.ml"
+# 12196 "parser_cocci_menhir.ml"
           
         in
         
-# 469 "parser_cocci_menhir.mly"
+# 478 "parser_cocci_menhir.mly"
          ( q (Ast0.wrap
                (Ast0.BaseType
                   (Ast.LongLongType,
                      [P.clt2mcode "long" ty;P.clt2mcode "long" ty1]))) )
-# 12171 "parser_cocci_menhir.ml"
+# 12205 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12194,14 +12228,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let s : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12198 "parser_cocci_menhir.ml"
+# 12232 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_generic_ctype_full = 
-# 474 "parser_cocci_menhir.mly"
+# 483 "parser_cocci_menhir.mly"
   ( Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, i)) )
-# 12205 "parser_cocci_menhir.ml"
+# 12239 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12229,9 +12263,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_generic_ctype_full = 
-# 476 "parser_cocci_menhir.mly"
+# 485 "parser_cocci_menhir.mly"
   ( Ast0.wrap(Ast0.StructUnionName(s, Some i)) )
-# 12235 "parser_cocci_menhir.ml"
+# 12269 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12267,13 +12301,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let r : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 12271 "parser_cocci_menhir.ml"
+# 12305 "parser_cocci_menhir.ml"
         ) = Obj.magic r in
         let d : 'tv_struct_decl_list = Obj.magic d in
         let l : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 12277 "parser_cocci_menhir.ml"
+# 12311 "parser_cocci_menhir.ml"
         ) = Obj.magic l in
         let s : 'tv_struct_or_union = Obj.magic s in
         let _startpos = _startpos_s_ in
@@ -12282,17 +12316,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 12286 "parser_cocci_menhir.ml"
+# 12320 "parser_cocci_menhir.ml"
           
         in
         
-# 479 "parser_cocci_menhir.mly"
+# 488 "parser_cocci_menhir.mly"
   ( (if i = None && !Data.in_iso
           then failwith "structures must be named in the iso file");
            Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)),
                                         P.clt2mcode "{" l,
                                         d, P.clt2mcode "}" r)) )
-# 12296 "parser_cocci_menhir.ml"
+# 12330 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12333,13 +12367,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let r : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 12337 "parser_cocci_menhir.ml"
+# 12371 "parser_cocci_menhir.ml"
         ) = Obj.magic r in
         let d : 'tv_struct_decl_list = Obj.magic d in
         let l : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 12343 "parser_cocci_menhir.ml"
+# 12377 "parser_cocci_menhir.ml"
         ) = Obj.magic l in
         let x0 : 'tv_ident = Obj.magic x0 in
         let s : 'tv_struct_or_union = Obj.magic s in
@@ -12350,17 +12384,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 12354 "parser_cocci_menhir.ml"
+# 12388 "parser_cocci_menhir.ml"
           
         in
         
-# 479 "parser_cocci_menhir.mly"
+# 488 "parser_cocci_menhir.mly"
   ( (if i = None && !Data.in_iso
           then failwith "structures must be named in the iso file");
            Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)),
                                         P.clt2mcode "{" l,
                                         d, P.clt2mcode "}" r)) )
-# 12364 "parser_cocci_menhir.ml"
+# 12398 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12396,29 +12430,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let r : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 12400 "parser_cocci_menhir.ml"
+# 12434 "parser_cocci_menhir.ml"
         ) = Obj.magic r in
         let d : 'tv_struct_decl_list = Obj.magic d in
         let l : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 12406 "parser_cocci_menhir.ml"
+# 12440 "parser_cocci_menhir.ml"
         ) = Obj.magic l in
         let s : (
 # 64 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 12411 "parser_cocci_menhir.ml"
+# 12445 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_generic_ctype_full = 
-# 485 "parser_cocci_menhir.mly"
+# 494 "parser_cocci_menhir.mly"
   ( let (nm,pure,clt) = s in
         let ty =
           Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) in
         Ast0.wrap
           (Ast0.StructUnionDef(ty,P.clt2mcode "{" l,d,P.clt2mcode "}" r)) )
-# 12422 "parser_cocci_menhir.ml"
+# 12456 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12448,24 +12482,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let p : (
 # 59 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 12452 "parser_cocci_menhir.ml"
+# 12486 "parser_cocci_menhir.ml"
         ) = Obj.magic p in
         let r : (
 # 47 "parser_cocci_menhir.mly"
       (string)
-# 12457 "parser_cocci_menhir.ml"
+# 12491 "parser_cocci_menhir.ml"
         ) = Obj.magic r in
         let _startpos = _startpos_r_ in
         let _endpos = _endpos_p_ in
         let _v : 'tv_generic_ctype_full = 
-# 491 "parser_cocci_menhir.mly"
+# 500 "parser_cocci_menhir.mly"
   ( let nm = (r,P.id2name p) in
         (* this is only possible when we are in a metavar decl.  Otherwise,
            it will be represented already as a MetaType *)
         let _ = P.check_meta(Ast.MetaTypeDecl(Ast.NONE,nm)) in
         Ast0.wrap(Ast0.MetaType(P.clt2mcode nm (P.id2clt p),
                                 Ast0.Impure (*will be ignored*))) )
-# 12469 "parser_cocci_menhir.ml"
+# 12503 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12486,14 +12520,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let p : (
 # 59 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 12490 "parser_cocci_menhir.ml"
+# 12524 "parser_cocci_menhir.ml"
         ) = Obj.magic p in
         let _startpos = _startpos_p_ in
         let _endpos = _endpos_p_ in
         let _v : 'tv_generic_ctype_full = 
-# 498 "parser_cocci_menhir.mly"
+# 507 "parser_cocci_menhir.mly"
   ( Ast0.wrap(Ast0.TypeName(P.id2mcode p)) )
-# 12497 "parser_cocci_menhir.ml"
+# 12531 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12519,12 +12553,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let p : (
 # 64 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 12523 "parser_cocci_menhir.ml"
+# 12557 "parser_cocci_menhir.ml"
         ) = Obj.magic p in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12528 "parser_cocci_menhir.ml"
+# 12562 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_p_ in
@@ -12533,22 +12567,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 580 "parser_cocci_menhir.mly"
+# 589 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,x)) )
-# 12539 "parser_cocci_menhir.ml"
+# 12573 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 12545 "parser_cocci_menhir.ml"
+# 12579 "parser_cocci_menhir.ml"
           
         in
         
-# 500 "parser_cocci_menhir.mly"
+# 509 "parser_cocci_menhir.mly"
   ( let (nm,pure,clt) = p in
         q (Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure))) )
-# 12552 "parser_cocci_menhir.ml"
+# 12586 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12574,12 +12608,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let p : (
 # 64 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 12578 "parser_cocci_menhir.ml"
+# 12612 "parser_cocci_menhir.ml"
         ) = Obj.magic p in
         let r00 : (
 # 51 "parser_cocci_menhir.mly"
       (Data.clt)
-# 12583 "parser_cocci_menhir.ml"
+# 12617 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_p_ in
@@ -12588,22 +12622,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let s =
             let r = r0 in
             
-# 582 "parser_cocci_menhir.mly"
+# 591 "parser_cocci_menhir.mly"
    ( function x -> Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,x)) )
-# 12594 "parser_cocci_menhir.ml"
+# 12628 "parser_cocci_menhir.ml"
             
           in
           
-# 585 "parser_cocci_menhir.mly"
+# 594 "parser_cocci_menhir.mly"
                   ( function x -> s (Some x) )
-# 12600 "parser_cocci_menhir.ml"
+# 12634 "parser_cocci_menhir.ml"
           
         in
         
-# 500 "parser_cocci_menhir.mly"
+# 509 "parser_cocci_menhir.mly"
   ( let (nm,pure,clt) = p in
         q (Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure))) )
-# 12607 "parser_cocci_menhir.ml"
+# 12641 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12624,22 +12658,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let p : (
 # 64 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 12628 "parser_cocci_menhir.ml"
+# 12662 "parser_cocci_menhir.ml"
         ) = Obj.magic p in
         let _startpos = _startpos_p_ in
         let _endpos = _endpos_p_ in
         let _v : 'tv_generic_ctype_full = let q =
           
-# 586 "parser_cocci_menhir.mly"
+# 595 "parser_cocci_menhir.mly"
                 ( function x -> x )
-# 12636 "parser_cocci_menhir.ml"
+# 12670 "parser_cocci_menhir.ml"
           
         in
         
-# 500 "parser_cocci_menhir.mly"
+# 509 "parser_cocci_menhir.mly"
   ( let (nm,pure,clt) = p in
         q (Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure))) )
-# 12643 "parser_cocci_menhir.ml"
+# 12677 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12661,9 +12695,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_ident = 
-# 1496 "parser_cocci_menhir.mly"
+# 1509 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) )
-# 12667 "parser_cocci_menhir.ml"
+# 12701 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12684,15 +12718,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 61 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
-# 12688 "parser_cocci_menhir.ml"
+# 12722 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_ident = 
-# 1498 "parser_cocci_menhir.mly"
+# 1511 "parser_cocci_menhir.mly"
          ( let (nm,constraints,pure,clt) = _1 in
          Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,pure)) )
-# 12696 "parser_cocci_menhir.ml"
+# 12730 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12714,9 +12748,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_ident_or_const = 
-# 1450 "parser_cocci_menhir.mly"
+# 1463 "parser_cocci_menhir.mly"
                     ( Ast0.wrap(Ast0.Ident(Ast0.wrap(Ast0.Id(P.id2mcode i)))) )
-# 12720 "parser_cocci_menhir.ml"
+# 12754 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12737,15 +12771,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 12741 "parser_cocci_menhir.ml"
+# 12775 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_ident_or_const = 
-# 1452 "parser_cocci_menhir.mly"
+# 1465 "parser_cocci_menhir.mly"
   ( let (x,clt) = _1 in
         Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
-# 12749 "parser_cocci_menhir.ml"
+# 12783 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12770,14 +12804,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 12774 "parser_cocci_menhir.ml"
+# 12808 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_incl = 
-# 253 "parser_cocci_menhir.mly"
+# 257 "parser_cocci_menhir.mly"
                       ( Common.Left(P.id2name _2) )
-# 12781 "parser_cocci_menhir.ml"
+# 12815 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12802,14 +12836,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 79 "parser_cocci_menhir.mly"
        (string)
-# 12806 "parser_cocci_menhir.ml"
+# 12840 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_incl = 
-# 254 "parser_cocci_menhir.mly"
+# 258 "parser_cocci_menhir.mly"
                       ( Common.Right _2 )
-# 12813 "parser_cocci_menhir.ml"
+# 12847 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12837,11 +12871,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 146 "parser_cocci_menhir.mly"
       ((string,string) Common.either list)
-# 12841 "parser_cocci_menhir.ml"
+# 12875 "parser_cocci_menhir.ml"
         ) = 
-# 249 "parser_cocci_menhir.mly"
+# 253 "parser_cocci_menhir.mly"
                        ( _1 )
-# 12845 "parser_cocci_menhir.ml"
+# 12879 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12869,11 +12903,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 146 "parser_cocci_menhir.mly"
       ((string,string) Common.either list)
-# 12873 "parser_cocci_menhir.ml"
+# 12907 "parser_cocci_menhir.ml"
         ) = 
-# 250 "parser_cocci_menhir.mly"
+# 254 "parser_cocci_menhir.mly"
                        ( _1 )
-# 12877 "parser_cocci_menhir.ml"
+# 12911 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12894,12 +12928,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 80 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 12898 "parser_cocci_menhir.ml"
+# 12932 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_includes = 
-# 629 "parser_cocci_menhir.mly"
+# 638 "parser_cocci_menhir.mly"
     ( Ast0.wrap
              (Ast0.Include(P.clt2mcode "#include" (P.drop_aft (P.id2clt _1)),
                            let (arity,ln,lln,offset,col,strbef,straft,pos) =
@@ -12909,7 +12943,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
                            P.clt2mcode
                              (Ast.Local (Parse_aux.str2inc (P.id2name _1)))
                              (P.drop_bef clt))) )
-# 12913 "parser_cocci_menhir.ml"
+# 12947 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12930,12 +12964,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 80 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 12934 "parser_cocci_menhir.ml"
+# 12968 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_includes = 
-# 639 "parser_cocci_menhir.mly"
+# 648 "parser_cocci_menhir.mly"
     ( Ast0.wrap
              (Ast0.Include(P.clt2mcode "#include" (P.drop_aft (P.id2clt _1)),
                            let (arity,ln,lln,offset,col,strbef,straft,pos) =
@@ -12945,7 +12979,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
                            P.clt2mcode
                              (Ast.NonLocal (Parse_aux.str2inc (P.id2name _1)))
                              (P.drop_bef clt))) )
-# 12949 "parser_cocci_menhir.ml"
+# 12983 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -12977,10 +13011,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_includes = 
-# 649 "parser_cocci_menhir.mly"
+# 658 "parser_cocci_menhir.mly"
     ( let ty = Ast0.wrap(Ast0.TopExp(Ast0.wrap(Ast0.TypeExp(t)))) in
       d (Ast0.wrap(Ast0.DOTS([ty]))) )
-# 12984 "parser_cocci_menhir.ml"
+# 13018 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13012,7 +13046,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_includes = 
-# 652 "parser_cocci_menhir.mly"
+# 661 "parser_cocci_menhir.mly"
     ( let body =
        match b with
          [e] ->
@@ -13022,7 +13056,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
            | _ -> b)
        | _ -> b in
       _1 (Ast0.wrap(Ast0.DOTS(body))) )
-# 13026 "parser_cocci_menhir.ml"
+# 13060 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13044,9 +13078,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_initialize = 
-# 1065 "parser_cocci_menhir.mly"
+# 1074 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.InitExpr(_1)) )
-# 13050 "parser_cocci_menhir.ml"
+# 13084 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13077,20 +13111,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13081 "parser_cocci_menhir.ml"
+# 13115 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_initialize_list = Obj.magic _2 in
         let _1 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13087 "parser_cocci_menhir.ml"
+# 13121 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_initialize = 
-# 1067 "parser_cocci_menhir.mly"
+# 1076 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.InitList(P.clt2mcode "{" _1,_2,P.clt2mcode "}" _3)) )
-# 13094 "parser_cocci_menhir.ml"
+# 13128 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13116,21 +13150,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13120 "parser_cocci_menhir.ml"
+# 13154 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13125 "parser_cocci_menhir.ml"
+# 13159 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_initialize = 
-# 1069 "parser_cocci_menhir.mly"
+# 1078 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.InitList(P.clt2mcode "{" _1,Ast0.wrap(Ast0.DOTS []),
                         P.clt2mcode "}" _2)) )
-# 13134 "parser_cocci_menhir.ml"
+# 13168 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13151,15 +13185,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 65 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 13155 "parser_cocci_menhir.ml"
+# 13189 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_initialize = 
-# 1073 "parser_cocci_menhir.mly"
+# 1082 "parser_cocci_menhir.mly"
       (let (nm,pure,clt) = _1 in
       Ast0.wrap(Ast0.MetaInit(P.clt2mcode nm clt,pure)) )
-# 13163 "parser_cocci_menhir.ml"
+# 13197 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13181,9 +13215,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_initialize2 = 
-# 1079 "parser_cocci_menhir.mly"
+# 1088 "parser_cocci_menhir.mly"
                             ( Ast0.wrap(Ast0.InitExpr(_1)) )
-# 13187 "parser_cocci_menhir.ml"
+# 13221 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13214,20 +13248,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13218 "parser_cocci_menhir.ml"
+# 13252 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_initialize_list = Obj.magic _2 in
         let _1 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13224 "parser_cocci_menhir.ml"
+# 13258 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_initialize2 = 
-# 1081 "parser_cocci_menhir.mly"
+# 1090 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.InitList(P.clt2mcode "{" _1,_2,P.clt2mcode "}" _3)) )
-# 13231 "parser_cocci_menhir.ml"
+# 13265 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13253,21 +13287,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13257 "parser_cocci_menhir.ml"
+# 13291 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13262 "parser_cocci_menhir.ml"
+# 13296 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_initialize2 = 
-# 1083 "parser_cocci_menhir.mly"
+# 1092 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.InitList(P.clt2mcode "{" _1,Ast0.wrap(Ast0.DOTS []),
                       P.clt2mcode "}" _2)) )
-# 13271 "parser_cocci_menhir.ml"
+# 13305 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13299,15 +13333,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13303 "parser_cocci_menhir.ml"
+# 13337 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_list_designator_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_initialize2 = 
-# 1088 "parser_cocci_menhir.mly"
+# 1097 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.InitGccExt(_1,P.clt2mcode "=" _2,_3)) )
-# 13311 "parser_cocci_menhir.ml"
+# 13345 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13339,15 +13373,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13343 "parser_cocci_menhir.ml"
+# 13377 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_ident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_initialize2 = 
-# 1090 "parser_cocci_menhir.mly"
+# 1099 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.InitGccName(_1,P.clt2mcode ":" _2,_3)) )
-# 13351 "parser_cocci_menhir.ml"
+# 13385 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13369,9 +13403,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_initialize_list = 
-# 1102 "parser_cocci_menhir.mly"
+# 1111 "parser_cocci_menhir.mly"
                          ( Ast0.wrap(Ast0.DOTS(_1)) )
-# 13375 "parser_cocci_menhir.ml"
+# 13409 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13397,15 +13431,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13401 "parser_cocci_menhir.ml"
+# 13435 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_initialize2 = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_initialize_list_start = 
-# 1105 "parser_cocci_menhir.mly"
+# 1114 "parser_cocci_menhir.mly"
                      ( [_1;Ast0.wrap(Ast0.IComma(P.clt2mcode "," _2))] )
-# 13409 "parser_cocci_menhir.ml"
+# 13443 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13437,15 +13471,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 13441 "parser_cocci_menhir.ml"
+# 13475 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_initialize2 = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_initialize_list_start = 
-# 1107 "parser_cocci_menhir.mly"
+# 1116 "parser_cocci_menhir.mly"
     ( _1::Ast0.wrap(Ast0.IComma(P.clt2mcode "," _2))::_3 )
-# 13449 "parser_cocci_menhir.ml"
+# 13483 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13473,10 +13507,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_initialize_list_start = 
-# 1110 "parser_cocci_menhir.mly"
+# 1119 "parser_cocci_menhir.mly"
     ( (P.mkidots "..." d)::
       (List.concat(List.map (function x -> x (P.mkidots "...")) r)) )
-# 13480 "parser_cocci_menhir.ml"
+# 13514 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13496,9 +13530,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_invalid = 
-# 1203 "parser_cocci_menhir.mly"
+# 1212 "parser_cocci_menhir.mly"
            ( raise (Semantic_cocci.Semantic "not matchable") )
-# 13502 "parser_cocci_menhir.ml"
+# 13536 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13513,9 +13547,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_is_expression = 
-# 245 "parser_cocci_menhir.mly"
+# 249 "parser_cocci_menhir.mly"
               ( false )
-# 13519 "parser_cocci_menhir.ml"
+# 13553 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13535,9 +13569,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_is_expression = 
-# 246 "parser_cocci_menhir.mly"
+# 250 "parser_cocci_menhir.mly"
               ( true )
-# 13541 "parser_cocci_menhir.ml"
+# 13575 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13563,9 +13597,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_ctype_ = 
-# 1847 "parser_cocci_menhir.mly"
+# 1860 "parser_cocci_menhir.mly"
                 ( Common.Left t )
-# 13569 "parser_cocci_menhir.ml"
+# 13603 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13591,9 +13625,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_ctype_ = 
-# 1848 "parser_cocci_menhir.mly"
+# 1861 "parser_cocci_menhir.mly"
                      ( Common.Right t )
-# 13597 "parser_cocci_menhir.ml"
+# 13631 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13619,9 +13653,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_decl_var_ = 
-# 1847 "parser_cocci_menhir.mly"
+# 1860 "parser_cocci_menhir.mly"
                 ( Common.Left t )
-# 13625 "parser_cocci_menhir.ml"
+# 13659 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13647,9 +13681,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_decl_var_ = 
-# 1848 "parser_cocci_menhir.mly"
+# 1861 "parser_cocci_menhir.mly"
                      ( Common.Right t )
-# 13653 "parser_cocci_menhir.ml"
+# 13687 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13675,9 +13709,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_dexpr_ = 
-# 1847 "parser_cocci_menhir.mly"
+# 1860 "parser_cocci_menhir.mly"
                 ( Common.Left t )
-# 13681 "parser_cocci_menhir.ml"
+# 13715 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13703,9 +13737,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_dexpr_ = 
-# 1848 "parser_cocci_menhir.mly"
+# 1861 "parser_cocci_menhir.mly"
                      ( Common.Right t )
-# 13709 "parser_cocci_menhir.ml"
+# 13743 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13731,9 +13765,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_nest_start_ = 
-# 1847 "parser_cocci_menhir.mly"
+# 1860 "parser_cocci_menhir.mly"
                 ( Common.Left t )
-# 13737 "parser_cocci_menhir.ml"
+# 13771 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13759,9 +13793,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_nest_start_ = 
-# 1848 "parser_cocci_menhir.mly"
+# 1861 "parser_cocci_menhir.mly"
                      ( Common.Right t )
-# 13765 "parser_cocci_menhir.ml"
+# 13799 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13787,9 +13821,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_single_statement_ = 
-# 1847 "parser_cocci_menhir.mly"
+# 1860 "parser_cocci_menhir.mly"
                 ( Common.Left t )
-# 13793 "parser_cocci_menhir.ml"
+# 13827 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13815,9 +13849,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_single_statement_ = 
-# 1848 "parser_cocci_menhir.mly"
+# 1861 "parser_cocci_menhir.mly"
                      ( Common.Right t )
-# 13821 "parser_cocci_menhir.ml"
+# 13855 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13855,11 +13889,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 162 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 13859 "parser_cocci_menhir.ml"
+# 13893 "parser_cocci_menhir.ml"
         ) = 
-# 1819 "parser_cocci_menhir.mly"
+# 1832 "parser_cocci_menhir.mly"
     ( P.iso_adjust (function x -> Ast0.ExprTag x) e1 el )
-# 13863 "parser_cocci_menhir.ml"
+# 13897 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13897,11 +13931,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 162 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 13901 "parser_cocci_menhir.ml"
+# 13935 "parser_cocci_menhir.ml"
         ) = 
-# 1821 "parser_cocci_menhir.mly"
+# 1834 "parser_cocci_menhir.mly"
     ( P.iso_adjust (function x -> Ast0.ArgExprTag x) e1 el )
-# 13905 "parser_cocci_menhir.ml"
+# 13939 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13939,11 +13973,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 162 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 13943 "parser_cocci_menhir.ml"
+# 13977 "parser_cocci_menhir.ml"
         ) = 
-# 1823 "parser_cocci_menhir.mly"
+# 1836 "parser_cocci_menhir.mly"
     ( P.iso_adjust (function x -> Ast0.TestExprTag x) e1 el )
-# 13947 "parser_cocci_menhir.ml"
+# 13981 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -13981,11 +14015,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 162 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 13985 "parser_cocci_menhir.ml"
+# 14019 "parser_cocci_menhir.ml"
         ) = 
-# 1825 "parser_cocci_menhir.mly"
+# 1838 "parser_cocci_menhir.mly"
     ( P.iso_adjust (function x -> Ast0.StmtTag x) s1 sl )
-# 13989 "parser_cocci_menhir.ml"
+# 14023 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14023,11 +14057,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 162 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 14027 "parser_cocci_menhir.ml"
+# 14061 "parser_cocci_menhir.ml"
         ) = 
-# 1827 "parser_cocci_menhir.mly"
+# 1840 "parser_cocci_menhir.mly"
     ( P.iso_adjust (function x -> Ast0.TypeCTag x) t1 tl )
-# 14031 "parser_cocci_menhir.ml"
+# 14065 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14065,11 +14099,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 162 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 14069 "parser_cocci_menhir.ml"
+# 14103 "parser_cocci_menhir.ml"
         ) = 
-# 1829 "parser_cocci_menhir.mly"
+# 1842 "parser_cocci_menhir.mly"
     ( P.iso_adjust (function x -> Ast0.DotsStmtTag x) e1 el )
-# 14073 "parser_cocci_menhir.ml"
+# 14107 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14107,9 +14141,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 162 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 14111 "parser_cocci_menhir.ml"
+# 14145 "parser_cocci_menhir.ml"
         ) = 
-# 1831 "parser_cocci_menhir.mly"
+# 1844 "parser_cocci_menhir.mly"
     ( let check_one = function
        [x] -> x
       | _ ->
@@ -14124,7 +14158,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
          | Common.Right x -> Common.Right(check_one x))
        dl in
     P.iso_adjust (function x -> Ast0.DeclTag x) d1 dl )
-# 14128 "parser_cocci_menhir.ml"
+# 14162 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14148,11 +14182,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 165 "parser_cocci_menhir.mly"
       ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list)
-# 14152 "parser_cocci_menhir.ml"
+# 14186 "parser_cocci_menhir.ml"
         ) = 
 # 182 "parser_cocci_menhir.mly"
                          ( m "" )
-# 14156 "parser_cocci_menhir.ml"
+# 14190 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14180,11 +14214,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 149 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 14184 "parser_cocci_menhir.ml"
+# 14218 "parser_cocci_menhir.ml"
         ) = 
 # 197 "parser_cocci_menhir.mly"
                       ( P.make_iso_rule_name_result (P.id2name nm) )
-# 14188 "parser_cocci_menhir.ml"
+# 14222 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14205,14 +14239,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 59 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 14209 "parser_cocci_menhir.ml"
+# 14243 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_iter_ident = 
-# 1510 "parser_cocci_menhir.mly"
+# 1523 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) )
-# 14216 "parser_cocci_menhir.ml"
+# 14250 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14233,15 +14267,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 62 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
-# 14237 "parser_cocci_menhir.ml"
+# 14271 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_iter_ident = 
-# 1512 "parser_cocci_menhir.mly"
+# 1525 "parser_cocci_menhir.mly"
          ( let (nm,constraints,pure,clt) = _1 in
          Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,pure)) )
-# 14245 "parser_cocci_menhir.ml"
+# 14279 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14258,7 +14292,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_TMul_ = 
 # 114 "standard.mly"
     ( [] )
-# 14262 "parser_cocci_menhir.ml"
+# 14296 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14285,14 +14319,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let x : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 14289 "parser_cocci_menhir.ml"
+# 14323 "parser_cocci_menhir.ml"
         ) = Obj.magic x in
         let _startpos = _startpos_x_ in
         let _endpos = _endpos_xs_ in
         let _v : 'tv_list_TMul_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14296 "parser_cocci_menhir.ml"
+# 14330 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14309,7 +14343,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_array_dec_ = 
 # 114 "standard.mly"
     ( [] )
-# 14313 "parser_cocci_menhir.ml"
+# 14347 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14339,7 +14373,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_array_dec_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14343 "parser_cocci_menhir.ml"
+# 14377 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14356,7 +14390,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_case_line_ = 
 # 114 "standard.mly"
     ( [] )
-# 14360 "parser_cocci_menhir.ml"
+# 14394 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14386,7 +14420,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_case_line_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14390 "parser_cocci_menhir.ml"
+# 14424 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14403,7 +14437,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_comma_decls_TEllipsis_decl__ = 
 # 114 "standard.mly"
     ( [] )
-# 14407 "parser_cocci_menhir.ml"
+# 14441 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14433,7 +14467,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_comma_decls_TEllipsis_decl__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14437 "parser_cocci_menhir.ml"
+# 14471 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14450,7 +14484,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_comma_decls_TEllipsis_name_opt_decl__ = 
 # 114 "standard.mly"
     ( [] )
-# 14454 "parser_cocci_menhir.ml"
+# 14488 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14480,7 +14514,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_comma_decls_TEllipsis_name_opt_decl__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14484 "parser_cocci_menhir.ml"
+# 14518 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14497,7 +14531,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_designator_ = 
 # 114 "standard.mly"
     ( [] )
-# 14501 "parser_cocci_menhir.ml"
+# 14535 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14527,7 +14561,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_designator_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14531 "parser_cocci_menhir.ml"
+# 14565 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14544,7 +14578,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_dp_comma_args_TEllipsis__ = 
 # 114 "standard.mly"
     ( [] )
-# 14548 "parser_cocci_menhir.ml"
+# 14582 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14574,7 +14608,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_dp_comma_args_TEllipsis__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14578 "parser_cocci_menhir.ml"
+# 14612 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14591,7 +14625,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_incl_ = 
 # 114 "standard.mly"
     ( [] )
-# 14595 "parser_cocci_menhir.ml"
+# 14629 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14621,7 +14655,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_incl_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14625 "parser_cocci_menhir.ml"
+# 14659 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14638,7 +14672,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_ctype__ = 
 # 114 "standard.mly"
     ( [] )
-# 14642 "parser_cocci_menhir.ml"
+# 14676 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14668,7 +14702,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_ctype__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14672 "parser_cocci_menhir.ml"
+# 14706 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14685,7 +14719,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_decl_var__ = 
 # 114 "standard.mly"
     ( [] )
-# 14689 "parser_cocci_menhir.ml"
+# 14723 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14715,7 +14749,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_decl_var__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14719 "parser_cocci_menhir.ml"
+# 14753 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14732,7 +14766,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_dexpr__ = 
 # 114 "standard.mly"
     ( [] )
-# 14736 "parser_cocci_menhir.ml"
+# 14770 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14762,7 +14796,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_dexpr__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14766 "parser_cocci_menhir.ml"
+# 14800 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14779,7 +14813,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_nest_start__ = 
 # 114 "standard.mly"
     ( [] )
-# 14783 "parser_cocci_menhir.ml"
+# 14817 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14809,7 +14843,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_nest_start__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14813 "parser_cocci_menhir.ml"
+# 14847 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14826,7 +14860,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_single_statement__ = 
 # 114 "standard.mly"
     ( [] )
-# 14830 "parser_cocci_menhir.ml"
+# 14864 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14856,7 +14890,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_single_statement__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14860 "parser_cocci_menhir.ml"
+# 14894 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14873,7 +14907,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_ctype__ = 
 # 114 "standard.mly"
     ( [] )
-# 14877 "parser_cocci_menhir.ml"
+# 14911 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14903,7 +14937,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_ctype__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14907 "parser_cocci_menhir.ml"
+# 14941 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14920,7 +14954,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_eexpr__ = 
 # 114 "standard.mly"
     ( [] )
-# 14924 "parser_cocci_menhir.ml"
+# 14958 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14950,7 +14984,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_eexpr__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 14954 "parser_cocci_menhir.ml"
+# 14988 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14967,7 +15001,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_fun_after_dots_or__ = 
 # 114 "standard.mly"
     ( [] )
-# 14971 "parser_cocci_menhir.ml"
+# 15005 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -14997,7 +15031,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_fun_after_dots_or__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 15001 "parser_cocci_menhir.ml"
+# 15035 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15014,7 +15048,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_fun_start__ = 
 # 114 "standard.mly"
     ( [] )
-# 15018 "parser_cocci_menhir.ml"
+# 15052 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15044,7 +15078,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_fun_start__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 15048 "parser_cocci_menhir.ml"
+# 15082 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15061,7 +15095,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_rule_elem_statement__ = 
 # 114 "standard.mly"
     ( [] )
-# 15065 "parser_cocci_menhir.ml"
+# 15099 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15091,7 +15125,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_rule_elem_statement__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 15095 "parser_cocci_menhir.ml"
+# 15129 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15108,7 +15142,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_statement__ = 
 # 114 "standard.mly"
     ( [] )
-# 15112 "parser_cocci_menhir.ml"
+# 15146 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15138,7 +15172,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_statement__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 15142 "parser_cocci_menhir.ml"
+# 15176 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15155,7 +15189,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_pair_edots_when_TEllipsis_eexpr__dexpr__ = 
 # 114 "standard.mly"
     ( [] )
-# 15159 "parser_cocci_menhir.ml"
+# 15193 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15194,13 +15228,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 70 "standard.mly"
     ( (x, y) )
-# 15198 "parser_cocci_menhir.ml"
+# 15232 "parser_cocci_menhir.ml"
           
         in
         
 # 116 "standard.mly"
     ( x :: xs )
-# 15204 "parser_cocci_menhir.ml"
+# 15238 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15217,7 +15251,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_whenppdecs_ = 
 # 114 "standard.mly"
     ( [] )
-# 15221 "parser_cocci_menhir.ml"
+# 15255 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15247,7 +15281,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_whenppdecs_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 15251 "parser_cocci_menhir.ml"
+# 15285 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15264,7 +15298,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_choose_iso_ = 
 # 57 "standard.mly"
     ( [] )
-# 15268 "parser_cocci_menhir.ml"
+# 15302 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15288,7 +15322,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_choose_iso_ = 
 # 59 "standard.mly"
     ( x )
-# 15292 "parser_cocci_menhir.ml"
+# 15326 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15305,7 +15339,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_disable_ = 
 # 57 "standard.mly"
     ( [] )
-# 15309 "parser_cocci_menhir.ml"
+# 15343 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15329,7 +15363,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_disable_ = 
 # 59 "standard.mly"
     ( x )
-# 15333 "parser_cocci_menhir.ml"
+# 15367 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15346,7 +15380,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_error_words_ = 
 # 57 "standard.mly"
     ( [] )
-# 15350 "parser_cocci_menhir.ml"
+# 15384 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15370,7 +15404,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_error_words_ = 
 # 59 "standard.mly"
     ( x )
-# 15374 "parser_cocci_menhir.ml"
+# 15408 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15387,7 +15421,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_filespec_ = 
 # 57 "standard.mly"
     ( [] )
-# 15391 "parser_cocci_menhir.ml"
+# 15425 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15411,7 +15445,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_filespec_ = 
 # 59 "standard.mly"
     ( x )
-# 15415 "parser_cocci_menhir.ml"
+# 15449 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15428,7 +15462,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_minus_start_ = 
 # 57 "standard.mly"
     ( [] )
-# 15432 "parser_cocci_menhir.ml"
+# 15466 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15452,7 +15486,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_minus_start_ = 
 # 59 "standard.mly"
     ( x )
-# 15456 "parser_cocci_menhir.ml"
+# 15490 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15469,7 +15503,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_not_ceq_ = 
 # 57 "standard.mly"
     ( [] )
-# 15473 "parser_cocci_menhir.ml"
+# 15507 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15493,7 +15527,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_not_ceq_ = 
 # 59 "standard.mly"
     ( x )
-# 15497 "parser_cocci_menhir.ml"
+# 15531 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15510,7 +15544,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_not_eq_ = 
 # 57 "standard.mly"
     ( [] )
-# 15514 "parser_cocci_menhir.ml"
+# 15548 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15534,7 +15568,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_not_eq_ = 
 # 59 "standard.mly"
     ( x )
-# 15538 "parser_cocci_menhir.ml"
+# 15572 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15551,7 +15585,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_not_eqe_ = 
 # 57 "standard.mly"
     ( [] )
-# 15555 "parser_cocci_menhir.ml"
+# 15589 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15575,7 +15609,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_not_eqe_ = 
 # 59 "standard.mly"
     ( x )
-# 15579 "parser_cocci_menhir.ml"
+# 15613 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15592,7 +15626,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_not_pos_ = 
 # 57 "standard.mly"
     ( [] )
-# 15596 "parser_cocci_menhir.ml"
+# 15630 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15616,7 +15650,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_not_pos_ = 
 # 59 "standard.mly"
     ( x )
-# 15620 "parser_cocci_menhir.ml"
+# 15654 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15633,7 +15667,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_plus_start_ = 
 # 57 "standard.mly"
     ( [] )
-# 15637 "parser_cocci_menhir.ml"
+# 15671 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15657,7 +15691,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_plus_start_ = 
 # 59 "standard.mly"
     ( x )
-# 15661 "parser_cocci_menhir.ml"
+# 15695 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15679,9 +15713,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_meta_exp_type = 
-# 444 "parser_cocci_menhir.mly"
+# 453 "parser_cocci_menhir.mly"
     ( [Ast0_cocci.ast0_type_to_type t] )
-# 15685 "parser_cocci_menhir.ml"
+# 15719 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15717,11 +15751,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_m_ in
         let _v : 'tv_meta_exp_type = 
-# 446 "parser_cocci_menhir.mly"
+# 455 "parser_cocci_menhir.mly"
     ( List.map
        (function x -> P.ty_pointerify (Ast0_cocci.ast0_type_to_type x) m)
        t )
-# 15725 "parser_cocci_menhir.ml"
+# 15759 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15752,14 +15786,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 47 "parser_cocci_menhir.mly"
       (string)
-# 15756 "parser_cocci_menhir.ml"
+# 15790 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_meta_ident = 
-# 1389 "parser_cocci_menhir.mly"
+# 1398 "parser_cocci_menhir.mly"
                                  ( (Some _1,P.id2name _3) )
-# 15763 "parser_cocci_menhir.ml"
+# 15797 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15783,68 +15817,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 157 "parser_cocci_menhir.mly"
       ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list)
-# 15787 "parser_cocci_menhir.ml"
+# 15821 "parser_cocci_menhir.ml"
         ) = 
 # 181 "parser_cocci_menhir.mly"
                        ( m (!Ast0.rule_name) )
-# 15791 "parser_cocci_menhir.ml"
-         in
-        _menhir_env.MenhirLib.EngineTypes.stack <- {
-          MenhirLib.EngineTypes.state = _menhir_s;
-          MenhirLib.EngineTypes.semv = Obj.repr _v;
-          MenhirLib.EngineTypes.startp = _startpos;
-          MenhirLib.EngineTypes.endp = _endpos;
-          MenhirLib.EngineTypes.next = _menhir_stack;
-          });
-      (fun _menhir_env ->
-        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
-        let {
-          MenhirLib.EngineTypes.startp = _startpos__6_;
-          MenhirLib.EngineTypes.endp = _endpos__6_;
-          MenhirLib.EngineTypes.next = {
-            MenhirLib.EngineTypes.semv = ids;
-            MenhirLib.EngineTypes.startp = _startpos_ids_;
-            MenhirLib.EngineTypes.endp = _endpos_ids_;
-            MenhirLib.EngineTypes.next = {
-              MenhirLib.EngineTypes.startp = _startpos__4_;
-              MenhirLib.EngineTypes.endp = _endpos__4_;
-              MenhirLib.EngineTypes.next = {
-                MenhirLib.EngineTypes.startp = _startpos__3_;
-                MenhirLib.EngineTypes.endp = _endpos__3_;
-                MenhirLib.EngineTypes.next = {
-                  MenhirLib.EngineTypes.semv = ispure;
-                  MenhirLib.EngineTypes.startp = _startpos_ispure_;
-                  MenhirLib.EngineTypes.endp = _endpos_ispure_;
-                  MenhirLib.EngineTypes.next = {
-                    MenhirLib.EngineTypes.state = _menhir_s;
-                    MenhirLib.EngineTypes.semv = ar;
-                    MenhirLib.EngineTypes.startp = _startpos_ar_;
-                    MenhirLib.EngineTypes.endp = _endpos_ar_;
-                    MenhirLib.EngineTypes.next = _menhir_stack;
-                    };
-                  };
-                };
-              };
-            };
-          } = _menhir_stack in
-        let ids : 'tv_comma_list_pure_ident_or_meta_ident_ = Obj.magic ids in
-        let ispure : 'tv_pure = Obj.magic ispure in
-        let ar : 'tv_arity = Obj.magic ar in
-        let _startpos = _startpos_ar_ in
-        let _endpos = _endpos__6_ in
-        let _v : 'tv_metadec = let kindfn =
-          
-# 305 "parser_cocci_menhir.mly"
-    ( (fun arity name pure check_meta ->
-      let tok = check_meta(Ast.MetaFreshIdDecl(arity,name)) in
-      !Data.add_id_meta name [] pure; tok) )
-# 15842 "parser_cocci_menhir.ml"
-          
-        in
-        
-# 259 "parser_cocci_menhir.mly"
-    ( P.create_metadec ar ispure kindfn ids )
-# 15848 "parser_cocci_menhir.ml"
+# 15825 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15887,17 +15864,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 309 "parser_cocci_menhir.mly"
+# 318 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaParamDecl(arity,name)) in
       !Data.add_param_meta name pure; tok) )
-# 15895 "parser_cocci_menhir.ml"
+# 15872 "parser_cocci_menhir.ml"
           
         in
         
-# 259 "parser_cocci_menhir.mly"
+# 263 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 15901 "parser_cocci_menhir.ml"
+# 15878 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -15944,17 +15921,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 313 "parser_cocci_menhir.mly"
+# 322 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaParamListDecl(arity,name,None)) in
       !Data.add_paramlist_meta name None pure; tok) )
-# 15952 "parser_cocci_menhir.ml"
+# 15929 "parser_cocci_menhir.ml"
           
         in
         
-# 259 "parser_cocci_menhir.mly"
+# 263 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 15958 "parser_cocci_menhir.ml"
+# 15935 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16001,17 +15978,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 317 "parser_cocci_menhir.mly"
+# 326 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaExpListDecl(arity,name,None)) in
       !Data.add_explist_meta name None pure; tok) )
-# 16009 "parser_cocci_menhir.ml"
+# 15986 "parser_cocci_menhir.ml"
           
         in
         
-# 259 "parser_cocci_menhir.mly"
+# 263 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 16015 "parser_cocci_menhir.ml"
+# 15992 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16054,17 +16031,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 321 "parser_cocci_menhir.mly"
+# 330 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaTypeDecl(arity,name)) in
       !Data.add_type_meta name pure; tok) )
-# 16062 "parser_cocci_menhir.ml"
+# 16039 "parser_cocci_menhir.ml"
           
         in
         
-# 259 "parser_cocci_menhir.mly"
+# 263 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 16068 "parser_cocci_menhir.ml"
+# 16045 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16107,17 +16084,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 325 "parser_cocci_menhir.mly"
+# 334 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaInitDecl(arity,name)) in
       !Data.add_init_meta name pure; tok) )
-# 16115 "parser_cocci_menhir.ml"
+# 16092 "parser_cocci_menhir.ml"
           
         in
         
-# 259 "parser_cocci_menhir.mly"
+# 263 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 16121 "parser_cocci_menhir.ml"
+# 16098 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16160,17 +16137,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 329 "parser_cocci_menhir.mly"
+# 338 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaStmDecl(arity,name)) in
       !Data.add_stm_meta name pure; tok) )
-# 16168 "parser_cocci_menhir.ml"
+# 16145 "parser_cocci_menhir.ml"
           
         in
         
-# 259 "parser_cocci_menhir.mly"
+# 263 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 16174 "parser_cocci_menhir.ml"
+# 16151 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16217,17 +16194,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 333 "parser_cocci_menhir.mly"
+# 342 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaStmListDecl(arity,name)) in
       !Data.add_stmlist_meta name pure; tok) )
-# 16225 "parser_cocci_menhir.ml"
+# 16202 "parser_cocci_menhir.ml"
           
         in
         
-# 259 "parser_cocci_menhir.mly"
+# 263 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 16231 "parser_cocci_menhir.ml"
+# 16208 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16270,18 +16247,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 337 "parser_cocci_menhir.mly"
+# 346 "parser_cocci_menhir.mly"
     ( (fun arity (_,name) pure check_meta ->
       if arity = Ast.NONE && pure = Ast0.Impure
       then (!Data.add_type_name name; [])
       else raise (Semantic_cocci.Semantic "bad typedef")) )
-# 16279 "parser_cocci_menhir.ml"
+# 16256 "parser_cocci_menhir.ml"
           
         in
         
-# 259 "parser_cocci_menhir.mly"
+# 263 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 16285 "parser_cocci_menhir.ml"
+# 16262 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16328,18 +16305,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 342 "parser_cocci_menhir.mly"
+# 351 "parser_cocci_menhir.mly"
     ( (fun arity (_,name) pure check_meta ->
       if arity = Ast.NONE && pure = Ast0.Impure
       then (!Data.add_declarer_name name; [])
       else raise (Semantic_cocci.Semantic "bad declarer")) )
-# 16337 "parser_cocci_menhir.ml"
+# 16314 "parser_cocci_menhir.ml"
           
         in
         
-# 259 "parser_cocci_menhir.mly"
+# 263 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 16343 "parser_cocci_menhir.ml"
+# 16320 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16386,18 +16363,63 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 347 "parser_cocci_menhir.mly"
+# 356 "parser_cocci_menhir.mly"
     ( (fun arity (_,name) pure check_meta ->
       if arity = Ast.NONE && pure = Ast0.Impure
       then (!Data.add_iterator_name name; [])
       else raise (Semantic_cocci.Semantic "bad iterator")) )
-# 16395 "parser_cocci_menhir.ml"
+# 16372 "parser_cocci_menhir.ml"
           
         in
         
-# 259 "parser_cocci_menhir.mly"
+# 263 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 16401 "parser_cocci_menhir.ml"
+# 16378 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.semv = ids;
+            MenhirLib.EngineTypes.startp = _startpos_ids_;
+            MenhirLib.EngineTypes.endp = _endpos_ids_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          } = _menhir_stack in
+        let ids : 'tv_comma_list_pure_ident_or_meta_ident_with_seed_ = Obj.magic ids in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v : 'tv_metadec = let kindfn =
+          
+# 312 "parser_cocci_menhir.mly"
+    ( (fun name check_meta seed ->
+      let tok = check_meta(Ast.MetaFreshIdDecl(name,seed)) in
+      !Data.add_fresh_id_meta name; tok) )
+# 16417 "parser_cocci_menhir.ml"
+          
+        in
+        
+# 266 "parser_cocci_menhir.mly"
+    ( P.create_fresh_metadec kindfn ids )
+# 16423 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16440,17 +16462,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 355 "parser_cocci_menhir.mly"
+# 364 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaIdDecl(arity,name)) in
       !Data.add_id_meta name constraints pure; tok) )
-# 16448 "parser_cocci_menhir.ml"
+# 16470 "parser_cocci_menhir.ml"
           
         in
         
-# 263 "parser_cocci_menhir.mly"
+# 270 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 16454 "parser_cocci_menhir.ml"
+# 16476 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16493,17 +16515,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 359 "parser_cocci_menhir.mly"
+# 368 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaFuncDecl(arity,name)) in
       !Data.add_func_meta name constraints pure; tok) )
-# 16501 "parser_cocci_menhir.ml"
+# 16523 "parser_cocci_menhir.ml"
           
         in
         
-# 263 "parser_cocci_menhir.mly"
+# 270 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 16507 "parser_cocci_menhir.ml"
+# 16529 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16550,18 +16572,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 363 "parser_cocci_menhir.mly"
+# 372 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaLocalFuncDecl(arity,name)) in
       !Data.add_local_func_meta name constraints pure;
       tok) )
-# 16559 "parser_cocci_menhir.ml"
+# 16581 "parser_cocci_menhir.ml"
           
         in
         
-# 263 "parser_cocci_menhir.mly"
+# 270 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 16565 "parser_cocci_menhir.ml"
+# 16587 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16604,17 +16626,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 368 "parser_cocci_menhir.mly"
+# 377 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaDeclarerDecl(arity,name)) in
       !Data.add_declarer_meta name constraints pure; tok) )
-# 16612 "parser_cocci_menhir.ml"
+# 16634 "parser_cocci_menhir.ml"
           
         in
         
-# 263 "parser_cocci_menhir.mly"
+# 270 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 16618 "parser_cocci_menhir.ml"
+# 16640 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16657,17 +16679,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 372 "parser_cocci_menhir.mly"
+# 381 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaIteratorDecl(arity,name)) in
       !Data.add_iterator_meta name constraints pure; tok) )
-# 16665 "parser_cocci_menhir.ml"
+# 16687 "parser_cocci_menhir.ml"
           
         in
         
-# 263 "parser_cocci_menhir.mly"
+# 270 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 16671 "parser_cocci_menhir.ml"
+# 16693 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16710,17 +16732,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 378 "parser_cocci_menhir.mly"
+# 387 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaErrDecl(arity,name)) in
       !Data.add_err_meta name constraints pure; tok) )
-# 16718 "parser_cocci_menhir.ml"
+# 16740 "parser_cocci_menhir.ml"
           
         in
         
-# 267 "parser_cocci_menhir.mly"
+# 274 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 16724 "parser_cocci_menhir.ml"
+# 16746 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16773,11 +16795,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
 # 39 "standard.mly"
     ( None )
-# 16777 "parser_cocci_menhir.ml"
+# 16799 "parser_cocci_menhir.ml"
             
           in
           
-# 382 "parser_cocci_menhir.mly"
+# 391 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       match l with
        None ->
@@ -16786,13 +16808,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
       | Some _ ->
          !Data.add_local_idexp_meta ty name constraints pure;
          check_meta(Ast.MetaLocalIdExpDecl(arity,name,ty))) )
-# 16790 "parser_cocci_menhir.ml"
+# 16812 "parser_cocci_menhir.ml"
           
         in
         
-# 267 "parser_cocci_menhir.mly"
+# 274 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 16796 "parser_cocci_menhir.ml"
+# 16818 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16853,11 +16875,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
 # 41 "standard.mly"
     ( Some x )
-# 16857 "parser_cocci_menhir.ml"
+# 16879 "parser_cocci_menhir.ml"
             
           in
           
-# 382 "parser_cocci_menhir.mly"
+# 391 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       match l with
        None ->
@@ -16866,13 +16888,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
       | Some _ ->
          !Data.add_local_idexp_meta ty name constraints pure;
          check_meta(Ast.MetaLocalIdExpDecl(arity,name,ty))) )
-# 16870 "parser_cocci_menhir.ml"
+# 16892 "parser_cocci_menhir.ml"
           
         in
         
-# 267 "parser_cocci_menhir.mly"
+# 274 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 16876 "parser_cocci_menhir.ml"
+# 16898 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16929,7 +16951,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let m = m0 in
           let l = l0 in
           
-# 391 "parser_cocci_menhir.mly"
+# 400 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let ty = Some [P.ty_pointerify Type_cocci.Unknown m] in
       match l with
@@ -16939,13 +16961,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
       | Some _ ->
          !Data.add_local_idexp_meta ty name constraints pure;
          check_meta(Ast.MetaLocalIdExpDecl(arity,name,ty))) )
-# 16943 "parser_cocci_menhir.ml"
+# 16965 "parser_cocci_menhir.ml"
           
         in
         
-# 267 "parser_cocci_menhir.mly"
+# 274 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 16949 "parser_cocci_menhir.ml"
+# 16971 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -16995,18 +17017,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_metadec = let kindfn =
           let m = m0 in
           
-# 401 "parser_cocci_menhir.mly"
+# 410 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let ty = Some [P.ty_pointerify Type_cocci.Unknown m] in
       let tok = check_meta(Ast.MetaExpDecl(arity,name,ty)) in
       !Data.add_exp_meta ty name constraints pure; tok) )
-# 17004 "parser_cocci_menhir.ml"
+# 17026 "parser_cocci_menhir.ml"
           
         in
         
-# 267 "parser_cocci_menhir.mly"
+# 274 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 17010 "parser_cocci_menhir.ml"
+# 17032 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17060,18 +17082,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_metadec = let kindfn =
           let vl = vl0 in
           
-# 406 "parser_cocci_menhir.mly"
+# 415 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let ty = Some (List.map (function x -> Type_cocci.Array x) vl) in
       let tok = check_meta(Ast.MetaExpDecl(arity,name,ty)) in
       !Data.add_exp_meta ty name constraints pure; tok) )
-# 17069 "parser_cocci_menhir.ml"
+# 17091 "parser_cocci_menhir.ml"
           
         in
         
-# 267 "parser_cocci_menhir.mly"
+# 274 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 17075 "parser_cocci_menhir.ml"
+# 17097 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17117,21 +17139,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
 # 39 "standard.mly"
     ( None )
-# 17121 "parser_cocci_menhir.ml"
+# 17143 "parser_cocci_menhir.ml"
             
           in
           
-# 411 "parser_cocci_menhir.mly"
+# 420 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaConstDecl(arity,name,ty)) in
       !Data.add_const_meta ty name constraints pure; tok) )
-# 17129 "parser_cocci_menhir.ml"
+# 17151 "parser_cocci_menhir.ml"
           
         in
         
-# 267 "parser_cocci_menhir.mly"
+# 274 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 17135 "parser_cocci_menhir.ml"
+# 17157 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17185,21 +17207,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
 # 41 "standard.mly"
     ( Some x )
-# 17189 "parser_cocci_menhir.ml"
+# 17211 "parser_cocci_menhir.ml"
             
           in
           
-# 411 "parser_cocci_menhir.mly"
+# 420 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaConstDecl(arity,name,ty)) in
       !Data.add_const_meta ty name constraints pure; tok) )
-# 17197 "parser_cocci_menhir.ml"
+# 17219 "parser_cocci_menhir.ml"
           
         in
         
-# 267 "parser_cocci_menhir.mly"
+# 274 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 17203 "parser_cocci_menhir.ml"
+# 17225 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17242,17 +17264,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 417 "parser_cocci_menhir.mly"
+# 426 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaExpDecl(arity,name,None)) in
       !Data.add_exp_meta None name constraints pure; tok) )
-# 17250 "parser_cocci_menhir.ml"
+# 17272 "parser_cocci_menhir.ml"
           
         in
         
-# 271 "parser_cocci_menhir.mly"
+# 278 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 17256 "parser_cocci_menhir.ml"
+# 17278 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17298,7 +17320,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_metadec = let kindfn =
           let vl = vl0 in
           
-# 421 "parser_cocci_menhir.mly"
+# 430 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let ty = Some vl in
       List.iter
@@ -17318,13 +17340,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
        constraints;
       let tok = check_meta(Ast.MetaExpDecl(arity,name,ty)) in
       !Data.add_exp_meta ty name constraints pure; tok) )
-# 17322 "parser_cocci_menhir.ml"
+# 17344 "parser_cocci_menhir.ml"
           
         in
         
-# 271 "parser_cocci_menhir.mly"
+# 278 "parser_cocci_menhir.mly"
     ( P.create_metadec_ne ar ispure kindfn ids )
-# 17328 "parser_cocci_menhir.ml"
+# 17350 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17366,7 +17388,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ar_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = 
-# 277 "parser_cocci_menhir.mly"
+# 284 "parser_cocci_menhir.mly"
     ( (if !Data.in_generating
       then failwith "position variables not allowed in a generated rule file");
       let kindfn arity name pure check_meta constraints =
@@ -17374,7 +17396,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
       let any = match a with None -> Ast.PER | Some _ -> Ast.ALL in
       !Data.add_pos_meta name constraints any; tok in
     P.create_metadec_ne ar false kindfn ids )
-# 17378 "parser_cocci_menhir.ml"
+# 17400 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17434,14 +17456,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ar_ in
         let _endpos = _endpos__9_ in
         let _v : 'tv_metadec = 
-# 287 "parser_cocci_menhir.mly"
+# 294 "parser_cocci_menhir.mly"
     ( P.create_len_metadec ar ispure
        (fun lenname arity name pure check_meta ->
          let tok =
            check_meta(Ast.MetaParamListDecl(arity,name,Some lenname)) in
          !Data.add_paramlist_meta name (Some lenname) pure; tok)
        id ids )
-# 17445 "parser_cocci_menhir.ml"
+# 17467 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17501,14 +17523,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ar_ in
         let _endpos = _endpos__9_ in
         let _v : 'tv_metadec = 
-# 296 "parser_cocci_menhir.mly"
+# 303 "parser_cocci_menhir.mly"
     ( P.create_len_metadec ar ispure
        (fun lenname arity name pure check_meta ->
          let tok =
            check_meta(Ast.MetaExpListDecl(arity,name,Some lenname)) in
          !Data.add_explist_meta name (Some lenname) pure; tok)
        id ids )
-# 17512 "parser_cocci_menhir.ml"
+# 17534 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17536,9 +17558,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_ctype_ctype_ = 
-# 1789 "parser_cocci_menhir.mly"
+# 1802 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 17542 "parser_cocci_menhir.ml"
+# 17564 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17566,9 +17588,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_eexpr_eexpr_ = 
-# 1789 "parser_cocci_menhir.mly"
+# 1802 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 17572 "parser_cocci_menhir.ml"
+# 17594 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17596,9 +17618,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_expr_eexpr_ = 
-# 1789 "parser_cocci_menhir.mly"
+# 1802 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 17602 "parser_cocci_menhir.ml"
+# 17624 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17626,9 +17648,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_fun_after_stm_fun_after_dots_or_ = 
-# 1789 "parser_cocci_menhir.mly"
+# 1802 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 17632 "parser_cocci_menhir.ml"
+# 17654 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17656,9 +17678,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_fun_start_fun_start_ = 
-# 1789 "parser_cocci_menhir.mly"
+# 1802 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 17662 "parser_cocci_menhir.ml"
+# 17684 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17686,9 +17708,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_rule_elem_statement_rule_elem_statement_ = 
-# 1789 "parser_cocci_menhir.mly"
+# 1802 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 17692 "parser_cocci_menhir.ml"
+# 17714 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17716,9 +17738,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_statement_statement_ = 
-# 1789 "parser_cocci_menhir.mly"
+# 1802 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 17722 "parser_cocci_menhir.ml"
+# 17744 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17752,11 +17774,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_ew_ in
         let _v : 'tv_minus_body = 
-# 597 "parser_cocci_menhir.mly"
+# 606 "parser_cocci_menhir.mly"
     ( match f@b@ew with
       [] -> raise (Semantic_cocci.Semantic "minus slice can't be empty")
     | code -> Top_level.top_level code )
-# 17760 "parser_cocci_menhir.ml"
+# 17782 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17790,11 +17812,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_ew_ in
         let _v : 'tv_minus_exp_body = 
-# 611 "parser_cocci_menhir.mly"
+# 620 "parser_cocci_menhir.mly"
     ( match f@[b]@ew with
       [] -> raise (Semantic_cocci.Semantic "minus slice can't be empty")
     | code -> Top_level.top_level code )
-# 17798 "parser_cocci_menhir.ml"
+# 17820 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17822,11 +17844,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 137 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 17826 "parser_cocci_menhir.ml"
+# 17848 "parser_cocci_menhir.ml"
         ) = 
 # 177 "parser_cocci_menhir.mly"
                                    ( _1 )
-# 17830 "parser_cocci_menhir.ml"
+# 17852 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17854,11 +17876,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 137 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 17858 "parser_cocci_menhir.ml"
+# 17880 "parser_cocci_menhir.ml"
         ) = 
 # 177 "parser_cocci_menhir.mly"
                                                                        ( m )
-# 17862 "parser_cocci_menhir.ml"
+# 17884 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17886,11 +17908,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 137 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 17890 "parser_cocci_menhir.ml"
+# 17912 "parser_cocci_menhir.ml"
         ) = 
 # 178 "parser_cocci_menhir.mly"
                          ( m )
-# 17894 "parser_cocci_menhir.ml"
+# 17916 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17918,11 +17940,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 134 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 17922 "parser_cocci_menhir.ml"
+# 17944 "parser_cocci_menhir.ml"
         ) = 
 # 173 "parser_cocci_menhir.mly"
                            ( _1 )
-# 17926 "parser_cocci_menhir.ml"
+# 17948 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17950,11 +17972,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 134 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 17954 "parser_cocci_menhir.ml"
+# 17976 "parser_cocci_menhir.ml"
         ) = 
 # 173 "parser_cocci_menhir.mly"
                                                            ( m )
-# 17958 "parser_cocci_menhir.ml"
+# 17980 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -17982,11 +18004,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 134 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 17986 "parser_cocci_menhir.ml"
+# 18008 "parser_cocci_menhir.ml"
         ) = 
 # 174 "parser_cocci_menhir.mly"
                      ( m )
-# 17990 "parser_cocci_menhir.ml"
+# 18012 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18008,9 +18030,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_minus_start = 
-# 1598 "parser_cocci_menhir.mly"
+# 1611 "parser_cocci_menhir.mly"
                          ( [Ast0.wrap(Ast0.DECL(_1))] )
-# 18014 "parser_cocci_menhir.ml"
+# 18036 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18032,9 +18054,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_minus_start = 
-# 1599 "parser_cocci_menhir.mly"
+# 1612 "parser_cocci_menhir.mly"
                          ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Ty(_1))))] )
-# 18038 "parser_cocci_menhir.ml"
+# 18060 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18056,9 +18078,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_minus_start = 
-# 1600 "parser_cocci_menhir.mly"
+# 1613 "parser_cocci_menhir.mly"
                     ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.TopInit(_1))))] )
-# 18062 "parser_cocci_menhir.ml"
+# 18084 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18080,9 +18102,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_minus_start = 
-# 1602 "parser_cocci_menhir.mly"
+# 1615 "parser_cocci_menhir.mly"
     ( List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1 )
-# 18086 "parser_cocci_menhir.ml"
+# 18108 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18109,14 +18131,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let a : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18113 "parser_cocci_menhir.ml"
+# 18135 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_ctype_ = 
-# 1792 "parser_cocci_menhir.mly"
+# 1805 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 18120 "parser_cocci_menhir.ml"
+# 18142 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18143,14 +18165,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let a : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18147 "parser_cocci_menhir.ml"
+# 18169 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_eexpr_ = 
-# 1792 "parser_cocci_menhir.mly"
+# 1805 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 18154 "parser_cocci_menhir.ml"
+# 18176 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18177,14 +18199,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let a : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18181 "parser_cocci_menhir.ml"
+# 18203 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_fun_after_dots_or_ = 
-# 1792 "parser_cocci_menhir.mly"
+# 1805 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 18188 "parser_cocci_menhir.ml"
+# 18210 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18211,14 +18233,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let a : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18215 "parser_cocci_menhir.ml"
+# 18237 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_fun_start_ = 
-# 1792 "parser_cocci_menhir.mly"
+# 1805 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 18222 "parser_cocci_menhir.ml"
+# 18244 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18245,14 +18267,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let a : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18249 "parser_cocci_menhir.ml"
+# 18271 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_rule_elem_statement_ = 
-# 1792 "parser_cocci_menhir.mly"
+# 1805 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 18256 "parser_cocci_menhir.ml"
+# 18278 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18279,14 +18301,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let a : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18283 "parser_cocci_menhir.ml"
+# 18305 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_statement_ = 
-# 1792 "parser_cocci_menhir.mly"
+# 1805 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 18290 "parser_cocci_menhir.ml"
+# 18312 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18308,9 +18330,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_name_opt_decl = 
-# 830 "parser_cocci_menhir.mly"
+# 839 "parser_cocci_menhir.mly"
             ( _1 )
-# 18314 "parser_cocci_menhir.ml"
+# 18336 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18332,9 +18354,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_name_opt_decl = 
-# 831 "parser_cocci_menhir.mly"
+# 840 "parser_cocci_menhir.mly"
               ( Ast0.wrap(Ast0.Param(t, None)) )
-# 18338 "parser_cocci_menhir.ml"
+# 18360 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18385,41 +18407,41 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18389 "parser_cocci_menhir.ml"
+# 18411 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18395 "parser_cocci_menhir.ml"
+# 18417 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18400 "parser_cocci_menhir.ml"
+# 18422 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let s : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18405 "parser_cocci_menhir.ml"
+# 18427 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18410 "parser_cocci_menhir.ml"
+# 18432 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let t : 'tv_fn_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_rp1_ in
         let _v : 'tv_name_opt_decl = 
-# 834 "parser_cocci_menhir.mly"
+# 843 "parser_cocci_menhir.mly"
         ( let fnptr =
          Ast0.wrap
            (Ast0.FunctionPointer
               (t,P.clt2mcode "(" lp,P.clt2mcode "*" s,P.clt2mcode ")" rp,
                P.clt2mcode "(" lp1,d,P.clt2mcode ")" rp1)) in
        Ast0.wrap(Ast0.Param(fnptr, None)) )
-# 18423 "parser_cocci_menhir.ml"
+# 18445 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18447,9 +18469,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_dots = 
-# 1713 "parser_cocci_menhir.mly"
+# 1726 "parser_cocci_menhir.mly"
                                      (_1@_2)
-# 18453 "parser_cocci_menhir.ml"
+# 18475 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18475,9 +18497,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_dots = 
-# 1714 "parser_cocci_menhir.mly"
+# 1727 "parser_cocci_menhir.mly"
                                 (_2)
-# 18481 "parser_cocci_menhir.ml"
+# 18503 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18505,9 +18527,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_dots = 
-# 1715 "parser_cocci_menhir.mly"
+# 1728 "parser_cocci_menhir.mly"
                                 ((Ast0.wrap(Ast0.Exp(_1)))::_2)
-# 18511 "parser_cocci_menhir.ml"
+# 18533 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18522,9 +18544,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_nest_after_exp = 
-# 1723 "parser_cocci_menhir.mly"
+# 1736 "parser_cocci_menhir.mly"
                                 ([])
-# 18528 "parser_cocci_menhir.ml"
+# 18550 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18552,9 +18574,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_exp = 
-# 1724 "parser_cocci_menhir.mly"
+# 1737 "parser_cocci_menhir.mly"
                                 (_1::_2)
-# 18558 "parser_cocci_menhir.ml"
+# 18580 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18569,9 +18591,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_nest_after_stm = 
-# 1718 "parser_cocci_menhir.mly"
+# 1731 "parser_cocci_menhir.mly"
                                 ([])
-# 18575 "parser_cocci_menhir.ml"
+# 18597 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18599,9 +18621,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_stm = 
-# 1719 "parser_cocci_menhir.mly"
+# 1732 "parser_cocci_menhir.mly"
                                 (_1::_2)
-# 18605 "parser_cocci_menhir.ml"
+# 18627 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18629,9 +18651,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_stm = 
-# 1720 "parser_cocci_menhir.mly"
+# 1733 "parser_cocci_menhir.mly"
                                 (_1@_2)
-# 18635 "parser_cocci_menhir.ml"
+# 18657 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18662,22 +18684,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let c : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18666 "parser_cocci_menhir.ml"
+# 18688 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let e : 'tv_expr_dots_TEllipsis_ = Obj.magic e in
         let _1 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18672 "parser_cocci_menhir.ml"
+# 18694 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_c_ in
         let _v : 'tv_nest_expressions = 
-# 1212 "parser_cocci_menhir.mly"
+# 1221 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.NestExpr(P.clt2mcode "<..." _1,
                              Ast0.wrap(Ast0.DOTS(e (P.mkedots "..."))),
                              P.clt2mcode "...>" c, None, false)) )
-# 18681 "parser_cocci_menhir.ml"
+# 18703 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18708,22 +18730,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let c : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18712 "parser_cocci_menhir.ml"
+# 18734 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let e : 'tv_expr_dots_TEllipsis_ = Obj.magic e in
         let _1 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18718 "parser_cocci_menhir.ml"
+# 18740 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_c_ in
         let _v : 'tv_nest_expressions = 
-# 1216 "parser_cocci_menhir.mly"
+# 1225 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.NestExpr(P.clt2mcode "<+..." _1,
                              Ast0.wrap(Ast0.DOTS(e (P.mkedots "..."))),
                              P.clt2mcode "...+>" c, None, true)) )
-# 18727 "parser_cocci_menhir.ml"
+# 18749 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18745,9 +18767,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_nest_start = 
-# 1710 "parser_cocci_menhir.mly"
+# 1723 "parser_cocci_menhir.mly"
                    ( Ast0.wrap(Ast0.DOTS(_1)) )
-# 18751 "parser_cocci_menhir.ml"
+# 18773 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18769,11 +18791,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 168 "parser_cocci_menhir.mly"
       (unit)
-# 18773 "parser_cocci_menhir.ml"
+# 18795 "parser_cocci_menhir.ml"
         ) = 
-# 1855 "parser_cocci_menhir.mly"
+# 1868 "parser_cocci_menhir.mly"
                     ( () )
-# 18777 "parser_cocci_menhir.ml"
+# 18799 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18799,11 +18821,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 168 "parser_cocci_menhir.mly"
       (unit)
-# 18803 "parser_cocci_menhir.ml"
+# 18825 "parser_cocci_menhir.ml"
         ) = 
-# 1856 "parser_cocci_menhir.mly"
+# 1869 "parser_cocci_menhir.mly"
                     ( () )
-# 18807 "parser_cocci_menhir.ml"
+# 18829 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18825,11 +18847,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 168 "parser_cocci_menhir.mly"
       (unit)
-# 18829 "parser_cocci_menhir.ml"
+# 18851 "parser_cocci_menhir.ml"
         ) = 
-# 1857 "parser_cocci_menhir.mly"
+# 1870 "parser_cocci_menhir.mly"
                     ( () )
-# 18833 "parser_cocci_menhir.ml"
+# 18855 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18857,10 +18879,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_g_ in
         let _endpos = _endpos_dg_ in
         let _v : 'tv_no_dot_start_end_dexpr_edots_when_TEllipsis_eexpr__ = 
-# 1380 "parser_cocci_menhir.mly"
+# 1389 "parser_cocci_menhir.mly"
   ( function dot_builder ->
       g :: (List.concat(List.map (function (d,g) -> [dot_builder d;g]) dg)) )
-# 18864 "parser_cocci_menhir.ml"
+# 18886 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18881,14 +18903,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let x : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18885 "parser_cocci_menhir.ml"
+# 18907 "parser_cocci_menhir.ml"
         ) = Obj.magic x in
         let _startpos = _startpos_x_ in
         let _endpos = _endpos_x_ in
         let _v : 'tv_nonempty_list_TMul_ = 
 # 124 "standard.mly"
     ( [ x ] )
-# 18892 "parser_cocci_menhir.ml"
+# 18914 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18915,14 +18937,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let x : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 18919 "parser_cocci_menhir.ml"
+# 18941 "parser_cocci_menhir.ml"
         ) = Obj.magic x in
         let _startpos = _startpos_x_ in
         let _endpos = _endpos_xs_ in
         let _v : 'tv_nonempty_list_TMul_ = 
 # 126 "standard.mly"
     ( x :: xs )
-# 18926 "parser_cocci_menhir.ml"
+# 18948 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18948,13 +18970,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_not_ceq = 
-# 1437 "parser_cocci_menhir.mly"
+# 1450 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
           then failwith "constraints not allowed in a generated rule file");
           [i] )
-# 18958 "parser_cocci_menhir.ml"
+# 18980 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -18988,13 +19010,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_not_ceq = 
-# 1443 "parser_cocci_menhir.mly"
+# 1456 "parser_cocci_menhir.mly"
   ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
           then failwith "constraints not allowed in a generated rule file");
           l )
-# 18998 "parser_cocci_menhir.ml"
+# 19020 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19020,7 +19042,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_not_eq = 
-# 1404 "parser_cocci_menhir.mly"
+# 1417 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -19028,7 +19050,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
              them in the pattern *)
           then failwith "constraints not allowed in a generated rule file");
           [Ast0.wrap(Ast0.Id(P.id2mcode i))] )
-# 19032 "parser_cocci_menhir.ml"
+# 19054 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19062,13 +19084,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_not_eq = 
-# 1412 "parser_cocci_menhir.mly"
+# 1425 "parser_cocci_menhir.mly"
   ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
           then failwith "constraints not allowed in a generated rule file");
           List.map (function i -> Ast0.wrap(Ast0.Id(P.id2mcode i))) l )
-# 19072 "parser_cocci_menhir.ml"
+# 19094 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19094,13 +19116,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_not_eqe = 
-# 1420 "parser_cocci_menhir.mly"
+# 1433 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
           then failwith "constraints not allowed in a generated rule file");
           [Ast0.wrap(Ast0.Ident(Ast0.wrap(Ast0.Id(P.id2mcode i))))] )
-# 19104 "parser_cocci_menhir.ml"
+# 19126 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19134,7 +19156,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_not_eqe = 
-# 1426 "parser_cocci_menhir.mly"
+# 1439 "parser_cocci_menhir.mly"
   ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -19143,7 +19165,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             (function i ->
               Ast0.wrap(Ast0.Ident(Ast0.wrap(Ast0.Id(P.id2mcode i)))))
             l )
-# 19147 "parser_cocci_menhir.ml"
+# 19169 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19169,7 +19191,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_not_pos = 
-# 1457 "parser_cocci_menhir.mly"
+# 1470 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -19180,7 +19202,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               let i = (rule,name) in
               P.check_meta(Ast.MetaPosDecl(Ast.NONE,i));
               [i] )
-# 19184 "parser_cocci_menhir.ml"
+# 19206 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19214,7 +19236,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_not_pos = 
-# 1468 "parser_cocci_menhir.mly"
+# 1481 "parser_cocci_menhir.mly"
   ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -19228,7 +19250,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
                   P.check_meta(Ast.MetaPosDecl(Ast.NONE,i));
                   i)
             l )
-# 19232 "parser_cocci_menhir.ml"
+# 19254 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19250,9 +19272,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_one_dec_decl_ = 
-# 1542 "parser_cocci_menhir.mly"
+# 1555 "parser_cocci_menhir.mly"
         ( _1 )
-# 19256 "parser_cocci_menhir.ml"
+# 19278 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19273,12 +19295,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 66 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
-# 19277 "parser_cocci_menhir.ml"
+# 19299 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_one_dec_decl_ = 
-# 1544 "parser_cocci_menhir.mly"
+# 1557 "parser_cocci_menhir.mly"
     ( let (nm,lenname,pure,clt) = _1 in
     let nm = P.clt2mcode nm clt in
     let lenname =
@@ -19286,7 +19308,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
        Some nm -> Some(P.clt2mcode nm clt)
       | None -> None in
     Ast0.wrap(Ast0.MetaParamList(nm,lenname,pure)) )
-# 19290 "parser_cocci_menhir.ml"
+# 19312 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19308,9 +19330,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_one_dec_name_opt_decl_ = 
-# 1542 "parser_cocci_menhir.mly"
+# 1555 "parser_cocci_menhir.mly"
         ( _1 )
-# 19314 "parser_cocci_menhir.ml"
+# 19336 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19331,12 +19353,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 66 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
-# 19335 "parser_cocci_menhir.ml"
+# 19357 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_one_dec_name_opt_decl_ = 
-# 1544 "parser_cocci_menhir.mly"
+# 1557 "parser_cocci_menhir.mly"
     ( let (nm,lenname,pure,clt) = _1 in
     let nm = P.clt2mcode nm clt in
     let lenname =
@@ -19344,7 +19366,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
        Some nm -> Some(P.clt2mcode nm clt)
       | None -> None in
     Ast0.wrap(Ast0.MetaParamList(nm,lenname,pure)) )
-# 19348 "parser_cocci_menhir.ml"
+# 19370 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19370,15 +19392,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19374 "parser_cocci_menhir.ml"
+# 19396 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let t : 'tv_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_pv_ in
         let _v : 'tv_one_decl_var = 
-# 1001 "parser_cocci_menhir.mly"
+# 1010 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.TyDecl(t,P.clt2mcode ";" pv)) )
-# 19382 "parser_cocci_menhir.ml"
+# 19404 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19409,7 +19431,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19413 "parser_cocci_menhir.ml"
+# 19435 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -19419,14 +19441,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 19423 "parser_cocci_menhir.ml"
+# 19445 "parser_cocci_menhir.ml"
           
         in
         
-# 1003 "parser_cocci_menhir.mly"
+# 1012 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) )
-# 19430 "parser_cocci_menhir.ml"
+# 19452 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19462,7 +19484,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19466 "parser_cocci_menhir.ml"
+# 19488 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -19474,14 +19496,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 19478 "parser_cocci_menhir.ml"
+# 19500 "parser_cocci_menhir.ml"
           
         in
         
-# 1003 "parser_cocci_menhir.mly"
+# 1012 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) )
-# 19485 "parser_cocci_menhir.ml"
+# 19507 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19503,9 +19525,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_f_ in
         let _v : 'tv_one_decl_var = 
-# 1005 "parser_cocci_menhir.mly"
+# 1014 "parser_cocci_menhir.mly"
                ( f )
-# 19509 "parser_cocci_menhir.ml"
+# 19531 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19546,13 +19568,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19550 "parser_cocci_menhir.ml"
+# 19572 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19556 "parser_cocci_menhir.ml"
+# 19578 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -19562,14 +19584,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 19566 "parser_cocci_menhir.ml"
+# 19588 "parser_cocci_menhir.ml"
           
         in
         
-# 1007 "parser_cocci_menhir.mly"
+# 1016 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv)) )
-# 19573 "parser_cocci_menhir.ml"
+# 19595 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19615,13 +19637,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19619 "parser_cocci_menhir.ml"
+# 19641 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19625 "parser_cocci_menhir.ml"
+# 19647 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -19633,14 +19655,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 19637 "parser_cocci_menhir.ml"
+# 19659 "parser_cocci_menhir.ml"
           
         in
         
-# 1007 "parser_cocci_menhir.mly"
+# 1016 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv)) )
-# 19644 "parser_cocci_menhir.ml"
+# 19666 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19671,7 +19693,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19675 "parser_cocci_menhir.ml"
+# 19697 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -19681,22 +19703,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 19685 "parser_cocci_menhir.ml"
+# 19707 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 19692 "parser_cocci_menhir.ml"
+# 19714 "parser_cocci_menhir.ml"
           
         in
         
-# 1012 "parser_cocci_menhir.mly"
+# 1021 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
        Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) )
-# 19700 "parser_cocci_menhir.ml"
+# 19722 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19732,7 +19754,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19736 "parser_cocci_menhir.ml"
+# 19758 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -19744,22 +19766,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 19748 "parser_cocci_menhir.ml"
+# 19770 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 19755 "parser_cocci_menhir.ml"
+# 19777 "parser_cocci_menhir.ml"
           
         in
         
-# 1012 "parser_cocci_menhir.mly"
+# 1021 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
        Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) )
-# 19763 "parser_cocci_menhir.ml"
+# 19785 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19795,7 +19817,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19799 "parser_cocci_menhir.ml"
+# 19821 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -19806,7 +19828,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 19810 "parser_cocci_menhir.ml"
+# 19832 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -19814,15 +19836,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 19818 "parser_cocci_menhir.ml"
+# 19840 "parser_cocci_menhir.ml"
           
         in
         
-# 1012 "parser_cocci_menhir.mly"
+# 1021 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
        Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) )
-# 19826 "parser_cocci_menhir.ml"
+# 19848 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19863,7 +19885,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19867 "parser_cocci_menhir.ml"
+# 19889 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -19876,7 +19898,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 19880 "parser_cocci_menhir.ml"
+# 19902 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -19884,15 +19906,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 19888 "parser_cocci_menhir.ml"
+# 19910 "parser_cocci_menhir.ml"
           
         in
         
-# 1012 "parser_cocci_menhir.mly"
+# 1021 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
        Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) )
-# 19896 "parser_cocci_menhir.ml"
+# 19918 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -19933,13 +19955,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19937 "parser_cocci_menhir.ml"
+# 19959 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 19943 "parser_cocci_menhir.ml"
+# 19965 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -19949,24 +19971,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 19953 "parser_cocci_menhir.ml"
+# 19975 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 19960 "parser_cocci_menhir.ml"
+# 19982 "parser_cocci_menhir.ml"
           
         in
         
-# 1017 "parser_cocci_menhir.mly"
+# 1026 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv)) )
-# 19970 "parser_cocci_menhir.ml"
+# 19992 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20012,13 +20034,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20016 "parser_cocci_menhir.ml"
+# 20038 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20022 "parser_cocci_menhir.ml"
+# 20044 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -20030,24 +20052,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 20034 "parser_cocci_menhir.ml"
+# 20056 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 20041 "parser_cocci_menhir.ml"
+# 20063 "parser_cocci_menhir.ml"
           
         in
         
-# 1017 "parser_cocci_menhir.mly"
+# 1026 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv)) )
-# 20051 "parser_cocci_menhir.ml"
+# 20073 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20093,13 +20115,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20097 "parser_cocci_menhir.ml"
+# 20119 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20103 "parser_cocci_menhir.ml"
+# 20125 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -20110,7 +20132,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 20114 "parser_cocci_menhir.ml"
+# 20136 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -20118,17 +20140,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 20122 "parser_cocci_menhir.ml"
+# 20144 "parser_cocci_menhir.ml"
           
         in
         
-# 1017 "parser_cocci_menhir.mly"
+# 1026 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv)) )
-# 20132 "parser_cocci_menhir.ml"
+# 20154 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20179,13 +20201,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20183 "parser_cocci_menhir.ml"
+# 20205 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20189 "parser_cocci_menhir.ml"
+# 20211 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -20198,7 +20220,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 20202 "parser_cocci_menhir.ml"
+# 20224 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -20206,17 +20228,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 20210 "parser_cocci_menhir.ml"
+# 20232 "parser_cocci_menhir.ml"
           
         in
         
-# 1017 "parser_cocci_menhir.mly"
+# 1026 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv)) )
-# 20220 "parser_cocci_menhir.ml"
+# 20242 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20277,34 +20299,34 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20281 "parser_cocci_menhir.ml"
+# 20303 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let rp2 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20286 "parser_cocci_menhir.ml"
+# 20308 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20292 "parser_cocci_menhir.ml"
+# 20314 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20297 "parser_cocci_menhir.ml"
+# 20319 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20303 "parser_cocci_menhir.ml"
+# 20325 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20308 "parser_cocci_menhir.ml"
+# 20330 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_fn_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
@@ -20313,11 +20335,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 20317 "parser_cocci_menhir.ml"
+# 20339 "parser_cocci_menhir.ml"
           
         in
         
-# 1027 "parser_cocci_menhir.mly"
+# 1036 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -20325,7 +20347,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
         Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) )
-# 20329 "parser_cocci_menhir.ml"
+# 20351 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20391,34 +20413,34 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20395 "parser_cocci_menhir.ml"
+# 20417 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let rp2 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20400 "parser_cocci_menhir.ml"
+# 20422 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20406 "parser_cocci_menhir.ml"
+# 20428 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20411 "parser_cocci_menhir.ml"
+# 20433 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20417 "parser_cocci_menhir.ml"
+# 20439 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20422 "parser_cocci_menhir.ml"
+# 20444 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_fn_ctype = Obj.magic t in
         let x0 : 'tv_storage = Obj.magic x0 in
@@ -20429,11 +20451,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 20433 "parser_cocci_menhir.ml"
+# 20455 "parser_cocci_menhir.ml"
           
         in
         
-# 1027 "parser_cocci_menhir.mly"
+# 1036 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -20441,7 +20463,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
         Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) )
-# 20445 "parser_cocci_menhir.ml"
+# 20467 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20482,27 +20504,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _5 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20486 "parser_cocci_menhir.ml"
+# 20508 "parser_cocci_menhir.ml"
         ) = Obj.magic _5 in
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20491 "parser_cocci_menhir.ml"
+# 20513 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20497 "parser_cocci_menhir.ml"
+# 20519 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_decl_ident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_one_decl_var = 
-# 1035 "parser_cocci_menhir.mly"
+# 1044 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.MacroDecl(_1,P.clt2mcode "(" _2,_3,
                                  P.clt2mcode ")" _4,P.clt2mcode ";" _5)) )
-# 20506 "parser_cocci_menhir.ml"
+# 20528 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20573,40 +20595,40 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20577 "parser_cocci_menhir.ml"
+# 20599 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20583 "parser_cocci_menhir.ml"
+# 20605 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let rp2 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20588 "parser_cocci_menhir.ml"
+# 20610 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20594 "parser_cocci_menhir.ml"
+# 20616 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20599 "parser_cocci_menhir.ml"
+# 20621 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20605 "parser_cocci_menhir.ml"
+# 20627 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20610 "parser_cocci_menhir.ml"
+# 20632 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_fn_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
@@ -20615,11 +20637,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 20619 "parser_cocci_menhir.ml"
+# 20641 "parser_cocci_menhir.ml"
           
         in
         
-# 1041 "parser_cocci_menhir.mly"
+# 1050 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -20627,7 +20649,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
       Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv)))
-# 20631 "parser_cocci_menhir.ml"
+# 20653 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20703,40 +20725,40 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20707 "parser_cocci_menhir.ml"
+# 20729 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20713 "parser_cocci_menhir.ml"
+# 20735 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let rp2 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20718 "parser_cocci_menhir.ml"
+# 20740 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20724 "parser_cocci_menhir.ml"
+# 20746 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20729 "parser_cocci_menhir.ml"
+# 20751 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20735 "parser_cocci_menhir.ml"
+# 20757 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20740 "parser_cocci_menhir.ml"
+# 20762 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_fn_ctype = Obj.magic t in
         let x0 : 'tv_storage = Obj.magic x0 in
@@ -20747,11 +20769,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 20751 "parser_cocci_menhir.ml"
+# 20773 "parser_cocci_menhir.ml"
           
         in
         
-# 1041 "parser_cocci_menhir.mly"
+# 1050 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -20759,7 +20781,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
       Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv)))
-# 20763 "parser_cocci_menhir.ml"
+# 20785 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20776,7 +20798,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_TLocal_ = 
 # 29 "standard.mly"
     ( None )
-# 20780 "parser_cocci_menhir.ml"
+# 20802 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20800,7 +20822,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_TLocal_ = 
 # 31 "standard.mly"
     ( Some x )
-# 20804 "parser_cocci_menhir.ml"
+# 20826 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20817,7 +20839,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_TPosAny_ = 
 # 29 "standard.mly"
     ( None )
-# 20821 "parser_cocci_menhir.ml"
+# 20843 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20841,7 +20863,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_TPosAny_ = 
 # 31 "standard.mly"
     ( Some x )
-# 20845 "parser_cocci_menhir.ml"
+# 20867 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20858,7 +20880,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_eexpr_ = 
 # 29 "standard.mly"
     ( None )
-# 20862 "parser_cocci_menhir.ml"
+# 20884 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20882,7 +20904,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_eexpr_ = 
 # 31 "standard.mly"
     ( Some x )
-# 20886 "parser_cocci_menhir.ml"
+# 20908 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20897,9 +20919,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_plus_after_dots = 
-# 1660 "parser_cocci_menhir.mly"
+# 1673 "parser_cocci_menhir.mly"
                                                                          ([])
-# 20903 "parser_cocci_menhir.ml"
+# 20925 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20925,9 +20947,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_dots = 
-# 1661 "parser_cocci_menhir.mly"
+# 1674 "parser_cocci_menhir.mly"
                                                                          (_2)
-# 20931 "parser_cocci_menhir.ml"
+# 20953 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20955,9 +20977,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_dots = 
-# 1663 "parser_cocci_menhir.mly"
+# 1676 "parser_cocci_menhir.mly"
                      ( (Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Exp(_1)))))::_2 )
-# 20961 "parser_cocci_menhir.ml"
+# 20983 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20985,9 +21007,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_dots = 
-# 1664 "parser_cocci_menhir.mly"
+# 1677 "parser_cocci_menhir.mly"
                                              ( Ast0.wrap(Ast0.DECL(_1))::_2 )
-# 20991 "parser_cocci_menhir.ml"
+# 21013 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21015,9 +21037,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_dots = 
-# 1666 "parser_cocci_menhir.mly"
+# 1679 "parser_cocci_menhir.mly"
                 ( (List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1)@_2 )
-# 21021 "parser_cocci_menhir.ml"
+# 21043 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21032,9 +21054,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_plus_after_exp = 
-# 1656 "parser_cocci_menhir.mly"
+# 1669 "parser_cocci_menhir.mly"
                                                                          ([])
-# 21038 "parser_cocci_menhir.ml"
+# 21060 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21062,9 +21084,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_exp = 
-# 1657 "parser_cocci_menhir.mly"
+# 1670 "parser_cocci_menhir.mly"
                                           ( (Ast0.wrap(Ast0.OTHER(_1)))::_2 )
-# 21068 "parser_cocci_menhir.ml"
+# 21090 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21079,9 +21101,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_plus_after_stm = 
-# 1669 "parser_cocci_menhir.mly"
+# 1682 "parser_cocci_menhir.mly"
                                                                          ([])
-# 21085 "parser_cocci_menhir.ml"
+# 21107 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21109,9 +21131,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_stm = 
-# 1670 "parser_cocci_menhir.mly"
+# 1683 "parser_cocci_menhir.mly"
                                           ( (Ast0.wrap(Ast0.OTHER(_1)))::_2 )
-# 21115 "parser_cocci_menhir.ml"
+# 21137 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21139,9 +21161,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_stm = 
-# 1671 "parser_cocci_menhir.mly"
+# 1684 "parser_cocci_menhir.mly"
                                              ( Ast0.wrap(Ast0.DECL(_1))::_2 )
-# 21145 "parser_cocci_menhir.ml"
+# 21167 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21169,9 +21191,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_stm = 
-# 1673 "parser_cocci_menhir.mly"
+# 1686 "parser_cocci_menhir.mly"
                 ( (List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1)@_2 )
-# 21175 "parser_cocci_menhir.ml"
+# 21197 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21205,9 +21227,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_ew_ in
         let _v : 'tv_plus_body = 
-# 605 "parser_cocci_menhir.mly"
+# 614 "parser_cocci_menhir.mly"
     ( Top_level.top_level (f@b@ew) )
-# 21211 "parser_cocci_menhir.ml"
+# 21233 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21241,9 +21263,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_ew_ in
         let _v : 'tv_plus_exp_body = 
-# 619 "parser_cocci_menhir.mly"
+# 628 "parser_cocci_menhir.mly"
     ( Top_level.top_level (f@[b]@ew) )
-# 21247 "parser_cocci_menhir.ml"
+# 21269 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21271,11 +21293,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 143 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 21275 "parser_cocci_menhir.ml"
+# 21297 "parser_cocci_menhir.ml"
         ) = 
 # 179 "parser_cocci_menhir.mly"
                                  ( _1 )
-# 21279 "parser_cocci_menhir.ml"
+# 21301 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21303,11 +21325,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 143 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 21307 "parser_cocci_menhir.ml"
+# 21329 "parser_cocci_menhir.ml"
         ) = 
 # 179 "parser_cocci_menhir.mly"
                                                                     ( p )
-# 21311 "parser_cocci_menhir.ml"
+# 21333 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21335,11 +21357,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 143 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 21339 "parser_cocci_menhir.ml"
+# 21361 "parser_cocci_menhir.ml"
         ) = 
 # 180 "parser_cocci_menhir.mly"
                         ( p )
-# 21343 "parser_cocci_menhir.ml"
+# 21365 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21367,11 +21389,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 140 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 21371 "parser_cocci_menhir.ml"
+# 21393 "parser_cocci_menhir.ml"
         ) = 
 # 175 "parser_cocci_menhir.mly"
                          ( _1 )
-# 21375 "parser_cocci_menhir.ml"
+# 21397 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21399,11 +21421,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 140 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 21403 "parser_cocci_menhir.ml"
+# 21425 "parser_cocci_menhir.ml"
         ) = 
 # 175 "parser_cocci_menhir.mly"
                                                         ( p )
-# 21407 "parser_cocci_menhir.ml"
+# 21429 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21431,11 +21453,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 140 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 21435 "parser_cocci_menhir.ml"
+# 21457 "parser_cocci_menhir.ml"
         ) = 
 # 176 "parser_cocci_menhir.mly"
                     ( p )
-# 21439 "parser_cocci_menhir.ml"
+# 21461 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21457,9 +21479,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_plus_start = 
-# 1645 "parser_cocci_menhir.mly"
+# 1658 "parser_cocci_menhir.mly"
                           ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Ty(_1))))] )
-# 21463 "parser_cocci_menhir.ml"
+# 21485 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21481,9 +21503,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_plus_start = 
-# 1646 "parser_cocci_menhir.mly"
+# 1659 "parser_cocci_menhir.mly"
                      ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.TopInit(_1))))] )
-# 21487 "parser_cocci_menhir.ml"
+# 21509 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21511,9 +21533,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_start = 
-# 1648 "parser_cocci_menhir.mly"
+# 1661 "parser_cocci_menhir.mly"
                                           ( (Ast0.wrap(Ast0.OTHER(_1)))::_2 )
-# 21517 "parser_cocci_menhir.ml"
+# 21539 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21541,9 +21563,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_start = 
-# 1650 "parser_cocci_menhir.mly"
+# 1663 "parser_cocci_menhir.mly"
                      ( (Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Exp(_1)))))::_2 )
-# 21547 "parser_cocci_menhir.ml"
+# 21569 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21571,9 +21593,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_start = 
-# 1651 "parser_cocci_menhir.mly"
+# 1664 "parser_cocci_menhir.mly"
                                              ( Ast0.wrap(Ast0.DECL(_1))::_2 )
-# 21577 "parser_cocci_menhir.ml"
+# 21599 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21601,9 +21623,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_start = 
-# 1653 "parser_cocci_menhir.mly"
+# 1666 "parser_cocci_menhir.mly"
                 ( (List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1)@_2 )
-# 21607 "parser_cocci_menhir.ml"
+# 21629 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21624,14 +21646,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 47 "parser_cocci_menhir.mly"
       (string)
-# 21628 "parser_cocci_menhir.ml"
+# 21650 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pnrule = 
-# 226 "parser_cocci_menhir.mly"
+# 230 "parser_cocci_menhir.mly"
                    ( Ast.Dep      _1 )
-# 21635 "parser_cocci_menhir.ml"
+# 21657 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21656,14 +21678,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 47 "parser_cocci_menhir.mly"
       (string)
-# 21660 "parser_cocci_menhir.ml"
+# 21682 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_pnrule = 
-# 227 "parser_cocci_menhir.mly"
+# 231 "parser_cocci_menhir.mly"
                    ( Ast.AntiDep  _2 )
-# 21667 "parser_cocci_menhir.ml"
+# 21689 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21688,14 +21710,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 47 "parser_cocci_menhir.mly"
       (string)
-# 21692 "parser_cocci_menhir.ml"
+# 21714 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_pnrule = 
-# 228 "parser_cocci_menhir.mly"
+# 232 "parser_cocci_menhir.mly"
                    ( Ast.EverDep  _2 )
-# 21699 "parser_cocci_menhir.ml"
+# 21721 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21720,14 +21742,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 47 "parser_cocci_menhir.mly"
       (string)
-# 21724 "parser_cocci_menhir.ml"
+# 21746 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_pnrule = 
-# 229 "parser_cocci_menhir.mly"
+# 233 "parser_cocci_menhir.mly"
                    ( Ast.NeverDep _2 )
-# 21731 "parser_cocci_menhir.ml"
+# 21753 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21757,9 +21779,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_pnrule = 
-# 230 "parser_cocci_menhir.mly"
+# 234 "parser_cocci_menhir.mly"
                    ( _2 )
-# 21763 "parser_cocci_menhir.ml"
+# 21785 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21781,9 +21803,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1313 "parser_cocci_menhir.mly"
+# 1322 "parser_cocci_menhir.mly"
                                                  ( _1 )
-# 21787 "parser_cocci_menhir.ml"
+# 21809 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21819,22 +21841,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 21823 "parser_cocci_menhir.ml"
+# 21845 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 21829 "parser_cocci_menhir.ml"
+# 21851 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1315 "parser_cocci_menhir.mly"
+# 1324 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3,
                                       P.clt2mcode "]" _4)) )
-# 21838 "parser_cocci_menhir.ml"
+# 21860 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21866,15 +21888,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 21870 "parser_cocci_menhir.ml"
+# 21892 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1318 "parser_cocci_menhir.mly"
+# 1327 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) )
-# 21878 "parser_cocci_menhir.ml"
+# 21900 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21906,16 +21928,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 104 "parser_cocci_menhir.mly"
        (Data.clt)
-# 21910 "parser_cocci_menhir.ml"
+# 21932 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1320 "parser_cocci_menhir.mly"
+# 1329 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2,
                                     _3)) )
-# 21919 "parser_cocci_menhir.ml"
+# 21941 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21941,15 +21963,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 21945 "parser_cocci_menhir.ml"
+# 21967 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1323 "parser_cocci_menhir.mly"
+# 1332 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) )
-# 21953 "parser_cocci_menhir.ml"
+# 21975 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21975,15 +21997,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 21979 "parser_cocci_menhir.ml"
+# 22001 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1325 "parser_cocci_menhir.mly"
+# 1334 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) )
-# 21987 "parser_cocci_menhir.ml"
+# 22009 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22019,23 +22041,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22023 "parser_cocci_menhir.ml"
+# 22045 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22029 "parser_cocci_menhir.ml"
+# 22051 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1327 "parser_cocci_menhir.mly"
+# 1336 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2,
                              _3,
                              P.clt2mcode ")" _4)) )
-# 22039 "parser_cocci_menhir.ml"
+# 22061 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22057,9 +22079,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1313 "parser_cocci_menhir.mly"
+# 1322 "parser_cocci_menhir.mly"
                                                  ( _1 )
-# 22063 "parser_cocci_menhir.ml"
+# 22085 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22095,22 +22117,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22099 "parser_cocci_menhir.ml"
+# 22121 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22105 "parser_cocci_menhir.ml"
+# 22127 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1315 "parser_cocci_menhir.mly"
+# 1324 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3,
                                       P.clt2mcode "]" _4)) )
-# 22114 "parser_cocci_menhir.ml"
+# 22136 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22142,15 +22164,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22146 "parser_cocci_menhir.ml"
+# 22168 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1318 "parser_cocci_menhir.mly"
+# 1327 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) )
-# 22154 "parser_cocci_menhir.ml"
+# 22176 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22182,16 +22204,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 104 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22186 "parser_cocci_menhir.ml"
+# 22208 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1320 "parser_cocci_menhir.mly"
+# 1329 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2,
                                     _3)) )
-# 22195 "parser_cocci_menhir.ml"
+# 22217 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22217,15 +22239,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22221 "parser_cocci_menhir.ml"
+# 22243 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1323 "parser_cocci_menhir.mly"
+# 1332 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) )
-# 22229 "parser_cocci_menhir.ml"
+# 22251 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22251,15 +22273,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22255 "parser_cocci_menhir.ml"
+# 22277 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1325 "parser_cocci_menhir.mly"
+# 1334 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) )
-# 22263 "parser_cocci_menhir.ml"
+# 22285 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22295,23 +22317,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22299 "parser_cocci_menhir.ml"
+# 22321 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22305 "parser_cocci_menhir.ml"
+# 22327 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1327 "parser_cocci_menhir.mly"
+# 1336 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2,
                              _3,
                              P.clt2mcode ")" _4)) )
-# 22315 "parser_cocci_menhir.ml"
+# 22337 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22333,9 +22355,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1313 "parser_cocci_menhir.mly"
+# 1322 "parser_cocci_menhir.mly"
                                                  ( _1 )
-# 22339 "parser_cocci_menhir.ml"
+# 22361 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22371,22 +22393,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22375 "parser_cocci_menhir.ml"
+# 22397 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22381 "parser_cocci_menhir.ml"
+# 22403 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1315 "parser_cocci_menhir.mly"
+# 1324 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3,
                                       P.clt2mcode "]" _4)) )
-# 22390 "parser_cocci_menhir.ml"
+# 22412 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22418,15 +22440,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22422 "parser_cocci_menhir.ml"
+# 22444 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1318 "parser_cocci_menhir.mly"
+# 1327 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) )
-# 22430 "parser_cocci_menhir.ml"
+# 22452 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22458,16 +22480,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 104 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22462 "parser_cocci_menhir.ml"
+# 22484 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1320 "parser_cocci_menhir.mly"
+# 1329 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2,
                                     _3)) )
-# 22471 "parser_cocci_menhir.ml"
+# 22493 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22493,15 +22515,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22497 "parser_cocci_menhir.ml"
+# 22519 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1323 "parser_cocci_menhir.mly"
+# 1332 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) )
-# 22505 "parser_cocci_menhir.ml"
+# 22527 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22527,15 +22549,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22531 "parser_cocci_menhir.ml"
+# 22553 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1325 "parser_cocci_menhir.mly"
+# 1334 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) )
-# 22539 "parser_cocci_menhir.ml"
+# 22561 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22571,23 +22593,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22575 "parser_cocci_menhir.ml"
+# 22597 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22581 "parser_cocci_menhir.ml"
+# 22603 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1327 "parser_cocci_menhir.mly"
+# 1336 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2,
                              _3,
                              P.clt2mcode ")" _4)) )
-# 22591 "parser_cocci_menhir.ml"
+# 22613 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22609,9 +22631,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1313 "parser_cocci_menhir.mly"
+# 1322 "parser_cocci_menhir.mly"
                                                  ( _1 )
-# 22615 "parser_cocci_menhir.ml"
+# 22637 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22647,22 +22669,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22651 "parser_cocci_menhir.ml"
+# 22673 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
 # 102 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22657 "parser_cocci_menhir.ml"
+# 22679 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1315 "parser_cocci_menhir.mly"
+# 1324 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3,
                                       P.clt2mcode "]" _4)) )
-# 22666 "parser_cocci_menhir.ml"
+# 22688 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22694,15 +22716,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22698 "parser_cocci_menhir.ml"
+# 22720 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1318 "parser_cocci_menhir.mly"
+# 1327 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) )
-# 22706 "parser_cocci_menhir.ml"
+# 22728 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22734,16 +22756,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 104 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22738 "parser_cocci_menhir.ml"
+# 22760 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1320 "parser_cocci_menhir.mly"
+# 1329 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2,
                                     _3)) )
-# 22747 "parser_cocci_menhir.ml"
+# 22769 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22769,15 +22791,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22773 "parser_cocci_menhir.ml"
+# 22795 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1323 "parser_cocci_menhir.mly"
+# 1332 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) )
-# 22781 "parser_cocci_menhir.ml"
+# 22803 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22803,15 +22825,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22807 "parser_cocci_menhir.ml"
+# 22829 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1325 "parser_cocci_menhir.mly"
+# 1334 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) )
-# 22815 "parser_cocci_menhir.ml"
+# 22837 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22847,23 +22869,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22851 "parser_cocci_menhir.ml"
+# 22873 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 22857 "parser_cocci_menhir.ml"
+# 22879 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1327 "parser_cocci_menhir.mly"
+# 1336 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2,
                              _3,
                              P.clt2mcode ")" _4)) )
-# 22867 "parser_cocci_menhir.ml"
+# 22889 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22885,9 +22907,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1332 "parser_cocci_menhir.mly"
+# 1341 "parser_cocci_menhir.mly"
                 ( Ast0.wrap(Ast0.Ident(_1)) )
-# 22891 "parser_cocci_menhir.ml"
+# 22913 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22908,15 +22930,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 22912 "parser_cocci_menhir.ml"
+# 22934 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1334 "parser_cocci_menhir.mly"
+# 1343 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
-# 22920 "parser_cocci_menhir.ml"
+# 22942 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22937,15 +22959,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 22941 "parser_cocci_menhir.ml"
+# 22963 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1337 "parser_cocci_menhir.mly"
+# 1346 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) )
-# 22949 "parser_cocci_menhir.ml"
+# 22971 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22966,15 +22988,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 22970 "parser_cocci_menhir.ml"
+# 22992 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1340 "parser_cocci_menhir.mly"
+# 1349 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) )
-# 22978 "parser_cocci_menhir.ml"
+# 23000 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22995,15 +23017,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 22999 "parser_cocci_menhir.ml"
+# 23021 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1343 "parser_cocci_menhir.mly"
+# 1352 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) )
-# 23007 "parser_cocci_menhir.ml"
+# 23029 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23024,16 +23046,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23028 "parser_cocci_menhir.ml"
+# 23050 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1346 "parser_cocci_menhir.mly"
+# 1355 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) )
-# 23037 "parser_cocci_menhir.ml"
+# 23059 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23054,15 +23076,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 63 "parser_cocci_menhir.mly"
        (Parse_aux.expinfo)
-# 23058 "parser_cocci_menhir.ml"
+# 23080 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1350 "parser_cocci_menhir.mly"
+# 1359 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,clt) = _1 in
      Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) )
-# 23066 "parser_cocci_menhir.ml"
+# 23088 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23083,16 +23105,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23087 "parser_cocci_menhir.ml"
+# 23109 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1353 "parser_cocci_menhir.mly"
+# 1362 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) )
-# 23096 "parser_cocci_menhir.ml"
+# 23118 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23113,16 +23135,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23117 "parser_cocci_menhir.ml"
+# 23139 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1357 "parser_cocci_menhir.mly"
+# 1366 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) )
-# 23126 "parser_cocci_menhir.ml"
+# 23148 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23143,16 +23165,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23147 "parser_cocci_menhir.ml"
+# 23169 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1361 "parser_cocci_menhir.mly"
+# 1370 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) )
-# 23156 "parser_cocci_menhir.ml"
+# 23178 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23183,21 +23205,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 23187 "parser_cocci_menhir.ml"
+# 23209 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 23193 "parser_cocci_menhir.ml"
+# 23215 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1365 "parser_cocci_menhir.mly"
+# 1374 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2,
                            P.clt2mcode ")" _3)) )
-# 23201 "parser_cocci_menhir.ml"
+# 23223 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23228,23 +23250,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 23232 "parser_cocci_menhir.ml"
+# 23254 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_eexpr_eexpr_ = Obj.magic _2 in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 23238 "parser_cocci_menhir.ml"
+# 23260 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1368 "parser_cocci_menhir.mly"
+# 1377 "parser_cocci_menhir.mly"
      ( let (mids,code) = _2 in
        Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1,
                               code, mids,
                               P.clt2mcode ")" _3)) )
-# 23248 "parser_cocci_menhir.ml"
+# 23270 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23266,9 +23288,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1372 "parser_cocci_menhir.mly"
+# 1381 "parser_cocci_menhir.mly"
                  ( _1 )
-# 23272 "parser_cocci_menhir.ml"
+# 23294 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23290,9 +23312,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1332 "parser_cocci_menhir.mly"
+# 1341 "parser_cocci_menhir.mly"
                 ( Ast0.wrap(Ast0.Ident(_1)) )
-# 23296 "parser_cocci_menhir.ml"
+# 23318 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23313,15 +23335,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 23317 "parser_cocci_menhir.ml"
+# 23339 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1334 "parser_cocci_menhir.mly"
+# 1343 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
-# 23325 "parser_cocci_menhir.ml"
+# 23347 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23342,15 +23364,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 23346 "parser_cocci_menhir.ml"
+# 23368 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1337 "parser_cocci_menhir.mly"
+# 1346 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) )
-# 23354 "parser_cocci_menhir.ml"
+# 23376 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23371,15 +23393,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 23375 "parser_cocci_menhir.ml"
+# 23397 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1340 "parser_cocci_menhir.mly"
+# 1349 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) )
-# 23383 "parser_cocci_menhir.ml"
+# 23405 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23400,15 +23422,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 23404 "parser_cocci_menhir.ml"
+# 23426 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1343 "parser_cocci_menhir.mly"
+# 1352 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) )
-# 23412 "parser_cocci_menhir.ml"
+# 23434 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23429,16 +23451,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23433 "parser_cocci_menhir.ml"
+# 23455 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1346 "parser_cocci_menhir.mly"
+# 1355 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) )
-# 23442 "parser_cocci_menhir.ml"
+# 23464 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23459,15 +23481,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 63 "parser_cocci_menhir.mly"
        (Parse_aux.expinfo)
-# 23463 "parser_cocci_menhir.ml"
+# 23485 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1350 "parser_cocci_menhir.mly"
+# 1359 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,clt) = _1 in
      Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) )
-# 23471 "parser_cocci_menhir.ml"
+# 23493 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23488,16 +23510,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23492 "parser_cocci_menhir.ml"
+# 23514 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1353 "parser_cocci_menhir.mly"
+# 1362 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) )
-# 23501 "parser_cocci_menhir.ml"
+# 23523 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23518,16 +23540,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23522 "parser_cocci_menhir.ml"
+# 23544 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1357 "parser_cocci_menhir.mly"
+# 1366 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) )
-# 23531 "parser_cocci_menhir.ml"
+# 23553 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23548,16 +23570,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23552 "parser_cocci_menhir.ml"
+# 23574 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1361 "parser_cocci_menhir.mly"
+# 1370 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) )
-# 23561 "parser_cocci_menhir.ml"
+# 23583 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23588,21 +23610,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 23592 "parser_cocci_menhir.ml"
+# 23614 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 23598 "parser_cocci_menhir.ml"
+# 23620 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1365 "parser_cocci_menhir.mly"
+# 1374 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2,
                            P.clt2mcode ")" _3)) )
-# 23606 "parser_cocci_menhir.ml"
+# 23628 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23633,23 +23655,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 23637 "parser_cocci_menhir.ml"
+# 23659 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_eexpr_eexpr_ = Obj.magic _2 in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 23643 "parser_cocci_menhir.ml"
+# 23665 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1368 "parser_cocci_menhir.mly"
+# 1377 "parser_cocci_menhir.mly"
      ( let (mids,code) = _2 in
        Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1,
                               code, mids,
                               P.clt2mcode ")" _3)) )
-# 23653 "parser_cocci_menhir.ml"
+# 23675 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23671,9 +23693,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1372 "parser_cocci_menhir.mly"
+# 1381 "parser_cocci_menhir.mly"
                  ( _1 )
-# 23677 "parser_cocci_menhir.ml"
+# 23699 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23695,9 +23717,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1332 "parser_cocci_menhir.mly"
+# 1341 "parser_cocci_menhir.mly"
                 ( Ast0.wrap(Ast0.Ident(_1)) )
-# 23701 "parser_cocci_menhir.ml"
+# 23723 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23718,15 +23740,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 23722 "parser_cocci_menhir.ml"
+# 23744 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1334 "parser_cocci_menhir.mly"
+# 1343 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
-# 23730 "parser_cocci_menhir.ml"
+# 23752 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23747,15 +23769,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 23751 "parser_cocci_menhir.ml"
+# 23773 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1337 "parser_cocci_menhir.mly"
+# 1346 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) )
-# 23759 "parser_cocci_menhir.ml"
+# 23781 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23776,15 +23798,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 23780 "parser_cocci_menhir.ml"
+# 23802 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1340 "parser_cocci_menhir.mly"
+# 1349 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) )
-# 23788 "parser_cocci_menhir.ml"
+# 23810 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23805,15 +23827,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 23809 "parser_cocci_menhir.ml"
+# 23831 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1343 "parser_cocci_menhir.mly"
+# 1352 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) )
-# 23817 "parser_cocci_menhir.ml"
+# 23839 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23834,16 +23856,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23838 "parser_cocci_menhir.ml"
+# 23860 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1346 "parser_cocci_menhir.mly"
+# 1355 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) )
-# 23847 "parser_cocci_menhir.ml"
+# 23869 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23864,15 +23886,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 63 "parser_cocci_menhir.mly"
        (Parse_aux.expinfo)
-# 23868 "parser_cocci_menhir.ml"
+# 23890 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1350 "parser_cocci_menhir.mly"
+# 1359 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,clt) = _1 in
      Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) )
-# 23876 "parser_cocci_menhir.ml"
+# 23898 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23893,16 +23915,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23897 "parser_cocci_menhir.ml"
+# 23919 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1353 "parser_cocci_menhir.mly"
+# 1362 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) )
-# 23906 "parser_cocci_menhir.ml"
+# 23928 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23923,16 +23945,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23927 "parser_cocci_menhir.ml"
+# 23949 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1357 "parser_cocci_menhir.mly"
+# 1366 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) )
-# 23936 "parser_cocci_menhir.ml"
+# 23958 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23953,16 +23975,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 23957 "parser_cocci_menhir.ml"
+# 23979 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1361 "parser_cocci_menhir.mly"
+# 1370 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) )
-# 23966 "parser_cocci_menhir.ml"
+# 23988 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23993,21 +24015,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 23997 "parser_cocci_menhir.ml"
+# 24019 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 24003 "parser_cocci_menhir.ml"
+# 24025 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1365 "parser_cocci_menhir.mly"
+# 1374 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2,
                            P.clt2mcode ")" _3)) )
-# 24011 "parser_cocci_menhir.ml"
+# 24033 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24038,23 +24060,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 24042 "parser_cocci_menhir.ml"
+# 24064 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_eexpr_eexpr_ = Obj.magic _2 in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 24048 "parser_cocci_menhir.ml"
+# 24070 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1368 "parser_cocci_menhir.mly"
+# 1377 "parser_cocci_menhir.mly"
      ( let (mids,code) = _2 in
        Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1,
                               code, mids,
                               P.clt2mcode ")" _3)) )
-# 24058 "parser_cocci_menhir.ml"
+# 24080 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24076,9 +24098,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1372 "parser_cocci_menhir.mly"
+# 1381 "parser_cocci_menhir.mly"
                  ( _1 )
-# 24082 "parser_cocci_menhir.ml"
+# 24104 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24100,9 +24122,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1332 "parser_cocci_menhir.mly"
+# 1341 "parser_cocci_menhir.mly"
                 ( Ast0.wrap(Ast0.Ident(_1)) )
-# 24106 "parser_cocci_menhir.ml"
+# 24128 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24123,15 +24145,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 24127 "parser_cocci_menhir.ml"
+# 24149 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1334 "parser_cocci_menhir.mly"
+# 1343 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
-# 24135 "parser_cocci_menhir.ml"
+# 24157 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24152,15 +24174,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 24156 "parser_cocci_menhir.ml"
+# 24178 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1337 "parser_cocci_menhir.mly"
+# 1346 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) )
-# 24164 "parser_cocci_menhir.ml"
+# 24186 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24181,15 +24203,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 24185 "parser_cocci_menhir.ml"
+# 24207 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1340 "parser_cocci_menhir.mly"
+# 1349 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) )
-# 24193 "parser_cocci_menhir.ml"
+# 24215 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24210,15 +24232,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 24214 "parser_cocci_menhir.ml"
+# 24236 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1343 "parser_cocci_menhir.mly"
+# 1352 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) )
-# 24222 "parser_cocci_menhir.ml"
+# 24244 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24239,16 +24261,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 24243 "parser_cocci_menhir.ml"
+# 24265 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1346 "parser_cocci_menhir.mly"
+# 1355 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) )
-# 24252 "parser_cocci_menhir.ml"
+# 24274 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24269,15 +24291,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 63 "parser_cocci_menhir.mly"
        (Parse_aux.expinfo)
-# 24273 "parser_cocci_menhir.ml"
+# 24295 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1350 "parser_cocci_menhir.mly"
+# 1359 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,clt) = _1 in
      Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) )
-# 24281 "parser_cocci_menhir.ml"
+# 24303 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24298,16 +24320,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 24302 "parser_cocci_menhir.ml"
+# 24324 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1353 "parser_cocci_menhir.mly"
+# 1362 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) )
-# 24311 "parser_cocci_menhir.ml"
+# 24333 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24328,16 +24350,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 24332 "parser_cocci_menhir.ml"
+# 24354 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1357 "parser_cocci_menhir.mly"
+# 1366 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) )
-# 24341 "parser_cocci_menhir.ml"
+# 24363 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24358,16 +24380,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 67 "parser_cocci_menhir.mly"
        (Parse_aux.typed_info)
-# 24362 "parser_cocci_menhir.ml"
+# 24384 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1361 "parser_cocci_menhir.mly"
+# 1370 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) )
-# 24371 "parser_cocci_menhir.ml"
+# 24393 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24398,21 +24420,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 24402 "parser_cocci_menhir.ml"
+# 24424 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 24408 "parser_cocci_menhir.ml"
+# 24430 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1365 "parser_cocci_menhir.mly"
+# 1374 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2,
                            P.clt2mcode ")" _3)) )
-# 24416 "parser_cocci_menhir.ml"
+# 24438 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24443,23 +24465,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 24447 "parser_cocci_menhir.ml"
+# 24469 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_expr_eexpr_ = Obj.magic _2 in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 24453 "parser_cocci_menhir.ml"
+# 24475 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1368 "parser_cocci_menhir.mly"
+# 1377 "parser_cocci_menhir.mly"
      ( let (mids,code) = _2 in
        Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1,
                               code, mids,
                               P.clt2mcode ")" _3)) )
-# 24463 "parser_cocci_menhir.ml"
+# 24485 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24481,9 +24503,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1372 "parser_cocci_menhir.mly"
+# 1381 "parser_cocci_menhir.mly"
                  ( _1 )
-# 24487 "parser_cocci_menhir.ml"
+# 24509 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24505,7 +24527,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_pure = 
 # 190 "parser_cocci_menhir.mly"
                  ( Ast0.Pure )
-# 24509 "parser_cocci_menhir.ml"
+# 24531 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24527,7 +24549,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_pure = 
 # 191 "parser_cocci_menhir.mly"
                  ( Ast0.Context )
-# 24531 "parser_cocci_menhir.ml"
+# 24553 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24553,7 +24575,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_pure = 
 # 192 "parser_cocci_menhir.mly"
                  ( Ast0.PureContext )
-# 24557 "parser_cocci_menhir.ml"
+# 24579 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24579,7 +24601,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_pure = 
 # 193 "parser_cocci_menhir.mly"
                  ( Ast0.PureContext )
-# 24583 "parser_cocci_menhir.ml"
+# 24605 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24596,7 +24618,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_pure = 
 # 194 "parser_cocci_menhir.mly"
                  ( Ast0.Impure )
-# 24600 "parser_cocci_menhir.ml"
+# 24622 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24617,14 +24639,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 59 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 24621 "parser_cocci_menhir.ml"
+# 24643 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident = 
-# 1386 "parser_cocci_menhir.mly"
+# 1395 "parser_cocci_menhir.mly"
             ( _1 )
-# 24628 "parser_cocci_menhir.ml"
+# 24650 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24646,9 +24668,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_meta_ident = 
-# 1392 "parser_cocci_menhir.mly"
+# 1401 "parser_cocci_menhir.mly"
                                  ( (None,P.id2name _1) )
-# 24652 "parser_cocci_menhir.ml"
+# 24674 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24670,9 +24692,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_meta_ident = 
-# 1393 "parser_cocci_menhir.mly"
+# 1402 "parser_cocci_menhir.mly"
                                  ( _1 )
-# 24676 "parser_cocci_menhir.ml"
+# 24698 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24692,9 +24714,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_meta_ident = 
-# 1394 "parser_cocci_menhir.mly"
+# 1403 "parser_cocci_menhir.mly"
                                  ( (None,"list") )
-# 24698 "parser_cocci_menhir.ml"
+# 24720 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24714,9 +24736,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_meta_ident = 
-# 1395 "parser_cocci_menhir.mly"
+# 1404 "parser_cocci_menhir.mly"
                                  ( (None,"error") )
-# 24720 "parser_cocci_menhir.ml"
+# 24742 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24736,9 +24758,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_meta_ident = 
-# 1396 "parser_cocci_menhir.mly"
+# 1405 "parser_cocci_menhir.mly"
                                  ( (None,"type") )
-# 24742 "parser_cocci_menhir.ml"
+# 24764 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24758,9 +24780,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_meta_ident = 
-# 1397 "parser_cocci_menhir.mly"
+# 1406 "parser_cocci_menhir.mly"
                                  ( (None,"name") )
-# 24764 "parser_cocci_menhir.ml"
+# 24786 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24788,9 +24810,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_l_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_not_eq_not_ceq_ = 
-# 1400 "parser_cocci_menhir.mly"
+# 1413 "parser_cocci_menhir.mly"
                                                     ( (i,l) )
-# 24794 "parser_cocci_menhir.ml"
+# 24816 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24818,9 +24840,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_l_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_not_eq_not_eq_ = 
-# 1400 "parser_cocci_menhir.mly"
+# 1413 "parser_cocci_menhir.mly"
                                                     ( (i,l) )
-# 24824 "parser_cocci_menhir.ml"
+# 24846 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24848,9 +24870,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_l_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_not_eq_not_eqe_ = 
-# 1400 "parser_cocci_menhir.mly"
+# 1413 "parser_cocci_menhir.mly"
                                                     ( (i,l) )
-# 24854 "parser_cocci_menhir.ml"
+# 24876 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24878,9 +24900,71 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_l_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_not_eq_not_pos_ = 
-# 1400 "parser_cocci_menhir.mly"
+# 1413 "parser_cocci_menhir.mly"
                                                     ( (i,l) )
-# 24884 "parser_cocci_menhir.ml"
+# 24906 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          } = _menhir_stack in
+        let _1 : 'tv_pure_ident_or_meta_ident = Obj.magic _1 in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v : 'tv_pure_ident_or_meta_ident_with_seed = 
+# 1409 "parser_cocci_menhir.mly"
+                                ( (_1,None) )
+# 24930 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          } = _menhir_stack in
+        let s : (
+# 87 "parser_cocci_menhir.mly"
+       (string * Data.clt)
+# 24960 "parser_cocci_menhir.ml"
+        ) = Obj.magic s in
+        let _1 : 'tv_pure_ident_or_meta_ident = Obj.magic _1 in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_s_ in
+        let _v : 'tv_pure_ident_or_meta_ident_with_seed = 
+# 1410 "parser_cocci_menhir.mly"
+                                              ( (_1,Some (P.id2name s)) )
+# 24968 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24897,11 +24981,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 131 "parser_cocci_menhir.mly"
       (unit)
-# 24901 "parser_cocci_menhir.ml"
+# 24985 "parser_cocci_menhir.ml"
         ) = 
 # 172 "parser_cocci_menhir.mly"
         ( )
-# 24905 "parser_cocci_menhir.ml"
+# 24989 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24923,9 +25007,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_rule_elem_statement = 
-# 906 "parser_cocci_menhir.mly"
+# 915 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Decl((Ast0.default_info(),Ast0.context_befaft()),_1)) )
-# 24929 "parser_cocci_menhir.ml"
+# 25013 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24951,15 +25035,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 24955 "parser_cocci_menhir.ml"
+# 25039 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_expr = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_rule_elem_statement = 
-# 907 "parser_cocci_menhir.mly"
+# 916 "parser_cocci_menhir.mly"
                ( P.exp_stm _1 _2 )
-# 24963 "parser_cocci_menhir.ml"
+# 25047 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24990,20 +25074,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 24994 "parser_cocci_menhir.ml"
+# 25078 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25000 "parser_cocci_menhir.ml"
+# 25084 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_rule_elem_statement = 
-# 908 "parser_cocci_menhir.mly"
+# 917 "parser_cocci_menhir.mly"
                         ( P.ret_exp _1 _2 _3 )
-# 25007 "parser_cocci_menhir.ml"
+# 25091 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25029,19 +25113,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25033 "parser_cocci_menhir.ml"
+# 25117 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25038 "parser_cocci_menhir.ml"
+# 25122 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_rule_elem_statement = 
-# 909 "parser_cocci_menhir.mly"
+# 918 "parser_cocci_menhir.mly"
                   ( P.ret _1 _2 )
-# 25045 "parser_cocci_menhir.ml"
+# 25129 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25067,19 +25151,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25071 "parser_cocci_menhir.ml"
+# 25155 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25076 "parser_cocci_menhir.ml"
+# 25160 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_rule_elem_statement = 
-# 910 "parser_cocci_menhir.mly"
+# 919 "parser_cocci_menhir.mly"
                  ( P.break _1 _2 )
-# 25083 "parser_cocci_menhir.ml"
+# 25167 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25105,19 +25189,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25109 "parser_cocci_menhir.ml"
+# 25193 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25114 "parser_cocci_menhir.ml"
+# 25198 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_rule_elem_statement = 
-# 911 "parser_cocci_menhir.mly"
+# 920 "parser_cocci_menhir.mly"
                     ( P.cont _1 _2 )
-# 25121 "parser_cocci_menhir.ml"
+# 25205 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25148,24 +25232,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25152 "parser_cocci_menhir.ml"
+# 25236 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_rule_elem_statement_rule_elem_statement_ = Obj.magic _2 in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25158 "parser_cocci_menhir.ml"
+# 25242 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_rule_elem_statement = 
-# 913 "parser_cocci_menhir.mly"
+# 922 "parser_cocci_menhir.mly"
     ( let (mids,code) = _2 in
     Ast0.wrap
       (Ast0.Disj(P.clt2mcode "(" _1,
                 List.map (function x -> Ast0.wrap(Ast0.DOTS([x]))) code,
                 mids, P.clt2mcode ")" _3)) )
-# 25169 "parser_cocci_menhir.ml"
+# 25253 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25221,18 +25305,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 153 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 25225 "parser_cocci_menhir.ml"
+# 25309 "parser_cocci_menhir.ml"
         ) = let nm =
           
 # 39 "standard.mly"
     ( None )
-# 25230 "parser_cocci_menhir.ml"
+# 25314 "parser_cocci_menhir.ml"
           
         in
         
 # 202 "parser_cocci_menhir.mly"
       ( P.make_cocci_rule_name_result nm d i a e ee )
-# 25236 "parser_cocci_menhir.ml"
+# 25320 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25294,19 +25378,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 153 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 25298 "parser_cocci_menhir.ml"
+# 25382 "parser_cocci_menhir.ml"
         ) = let nm =
           let x = x0 in
           
 # 41 "standard.mly"
     ( Some x )
-# 25304 "parser_cocci_menhir.ml"
+# 25388 "parser_cocci_menhir.ml"
           
         in
         
 # 202 "parser_cocci_menhir.mly"
       ( P.make_cocci_rule_name_result nm d i a e ee )
-# 25310 "parser_cocci_menhir.ml"
+# 25394 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25366,11 +25450,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 153 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 25370 "parser_cocci_menhir.ml"
+# 25454 "parser_cocci_menhir.ml"
         ) = 
 # 207 "parser_cocci_menhir.mly"
       ( P.make_generated_rule_name_result None d i a e ee )
-# 25374 "parser_cocci_menhir.ml"
+# 25458 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25412,11 +25496,91 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 153 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 25416 "parser_cocci_menhir.ml"
+# 25500 "parser_cocci_menhir.ml"
         ) = 
 # 209 "parser_cocci_menhir.mly"
       ( P.make_script_rule_name_result lang d )
-# 25420 "parser_cocci_menhir.ml"
+# 25504 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.semv = lang;
+            MenhirLib.EngineTypes.startp = _startpos_lang_;
+            MenhirLib.EngineTypes.endp = _endpos_lang_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          } = _menhir_stack in
+        let lang : 'tv_pure_ident = Obj.magic lang in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v : (
+# 153 "parser_cocci_menhir.mly"
+      (Ast_cocci.rulename)
+# 25540 "parser_cocci_menhir.ml"
+        ) = 
+# 211 "parser_cocci_menhir.mly"
+      ( P.make_initial_script_rule_name_result lang )
+# 25544 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.semv = lang;
+            MenhirLib.EngineTypes.startp = _startpos_lang_;
+            MenhirLib.EngineTypes.endp = _endpos_lang_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          } = _menhir_stack in
+        let lang : 'tv_pure_ident = Obj.magic lang in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v : (
+# 153 "parser_cocci_menhir.mly"
+      (Ast_cocci.rulename)
+# 25580 "parser_cocci_menhir.ml"
+        ) = 
+# 213 "parser_cocci_menhir.mly"
+      ( P.make_final_script_rule_name_result lang )
+# 25584 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25460,7 +25624,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 47 "parser_cocci_menhir.mly"
       (string)
-# 25464 "parser_cocci_menhir.ml"
+# 25628 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let py : 'tv_pure_ident = Obj.magic py in
         let _startpos = _startpos_py_ in
@@ -25468,11 +25632,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : (
 # 159 "parser_cocci_menhir.mly"
        (string * (string * string))
-# 25472 "parser_cocci_menhir.ml"
+# 25636 "parser_cocci_menhir.ml"
         ) = 
-# 1860 "parser_cocci_menhir.mly"
+# 1873 "parser_cocci_menhir.mly"
   ( (P.id2name py, (_3, P.id2name cocci)) )
-# 25476 "parser_cocci_menhir.ml"
+# 25640 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25493,14 +25657,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let x : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 25497 "parser_cocci_menhir.ml"
+# 25661 "parser_cocci_menhir.ml"
         ) = Obj.magic x in
         let _startpos = _startpos_x_ in
         let _endpos = _endpos_x_ in
         let _v : 'tv_separated_nonempty_list_TComma_TString_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 25504 "parser_cocci_menhir.ml"
+# 25668 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25531,14 +25695,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let x : (
 # 87 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 25535 "parser_cocci_menhir.ml"
+# 25699 "parser_cocci_menhir.ml"
         ) = Obj.magic x in
         let _startpos = _startpos_x_ in
         let _endpos = _endpos_xs_ in
         let _v : 'tv_separated_nonempty_list_TComma_TString_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 25542 "parser_cocci_menhir.ml"
+# 25706 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25562,7 +25726,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_any_strict_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 25566 "parser_cocci_menhir.ml"
+# 25730 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25596,7 +25760,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_any_strict_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 25600 "parser_cocci_menhir.ml"
+# 25764 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25620,7 +25784,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_ctype_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 25624 "parser_cocci_menhir.ml"
+# 25788 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25654,7 +25818,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_ctype_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 25658 "parser_cocci_menhir.ml"
+# 25822 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25678,7 +25842,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_d_ident_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 25682 "parser_cocci_menhir.ml"
+# 25846 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25712,7 +25876,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_d_ident_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 25716 "parser_cocci_menhir.ml"
+# 25880 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25736,7 +25900,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_dexpr_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 25740 "parser_cocci_menhir.ml"
+# 25904 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25770,7 +25934,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_dexpr_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 25774 "parser_cocci_menhir.ml"
+# 25938 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25794,7 +25958,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_ident_or_const_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 25798 "parser_cocci_menhir.ml"
+# 25962 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25828,7 +25992,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_ident_or_const_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 25832 "parser_cocci_menhir.ml"
+# 25996 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25852,7 +26016,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_meta_ident_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 25856 "parser_cocci_menhir.ml"
+# 26020 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25886,7 +26050,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_meta_ident_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 25890 "parser_cocci_menhir.ml"
+# 26054 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25910,7 +26074,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 25914 "parser_cocci_menhir.ml"
+# 26078 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25944,7 +26108,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 25948 "parser_cocci_menhir.ml"
+# 26112 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25968,7 +26132,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 25972 "parser_cocci_menhir.ml"
+# 26136 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26002,7 +26166,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 26006 "parser_cocci_menhir.ml"
+# 26170 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26026,7 +26190,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_ceq__ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 26030 "parser_cocci_menhir.ml"
+# 26194 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26060,7 +26224,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_ceq__ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 26064 "parser_cocci_menhir.ml"
+# 26228 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26084,7 +26248,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_eq__ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 26088 "parser_cocci_menhir.ml"
+# 26252 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26118,7 +26282,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_eq__ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 26122 "parser_cocci_menhir.ml"
+# 26286 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26142,7 +26306,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_eqe__ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 26146 "parser_cocci_menhir.ml"
+# 26310 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26176,7 +26340,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_eqe__ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 26180 "parser_cocci_menhir.ml"
+# 26344 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26200,7 +26364,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_pos__ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 26204 "parser_cocci_menhir.ml"
+# 26368 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26234,7 +26398,65 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_not_eq_not_pos__ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 26238 "parser_cocci_menhir.ml"
+# 26402 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          } = _menhir_stack in
+        let x : 'tv_pure_ident_or_meta_ident_with_seed = Obj.magic x in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_seed_ = 
+# 144 "standard.mly"
+    ( [ x ] )
+# 26426 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          } = _menhir_stack in
+        let xs : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_seed_ = Obj.magic xs in
+        let x : 'tv_pure_ident_or_meta_ident_with_seed = Obj.magic x in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_seed_ = 
+# 146 "standard.mly"
+    ( x :: xs )
+# 26460 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26256,9 +26478,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_single_statement = 
-# 921 "parser_cocci_menhir.mly"
+# 930 "parser_cocci_menhir.mly"
                                       ( _1 )
-# 26262 "parser_cocci_menhir.ml"
+# 26484 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26289,24 +26511,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26293 "parser_cocci_menhir.ml"
+# 26515 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_statement_statement_ = Obj.magic _2 in
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26299 "parser_cocci_menhir.ml"
+# 26521 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_single_statement = 
-# 925 "parser_cocci_menhir.mly"
+# 934 "parser_cocci_menhir.mly"
       ( let (mids,code) = _2 in
         Ast0.wrap
          (Ast0.Disj(P.clt2mcode "(" _1,
                     List.map (function x -> Ast0.wrap(Ast0.DOTS([x]))) code,
                     mids, P.clt2mcode ")" _3)) )
-# 26310 "parser_cocci_menhir.ml"
+# 26532 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26328,9 +26550,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_statement = 
-# 848 "parser_cocci_menhir.mly"
+# 857 "parser_cocci_menhir.mly"
            ( _1 )
-# 26334 "parser_cocci_menhir.ml"
+# 26556 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26351,14 +26573,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 64 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 26355 "parser_cocci_menhir.ml"
+# 26577 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_statement = 
-# 850 "parser_cocci_menhir.mly"
+# 859 "parser_cocci_menhir.mly"
     ( P.meta_stm _1 )
-# 26362 "parser_cocci_menhir.ml"
+# 26584 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26384,15 +26606,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26388 "parser_cocci_menhir.ml"
+# 26610 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_expr = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_statement = 
-# 852 "parser_cocci_menhir.mly"
+# 861 "parser_cocci_menhir.mly"
     ( P.exp_stm _1 _2 )
-# 26396 "parser_cocci_menhir.ml"
+# 26618 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26434,25 +26656,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26438 "parser_cocci_menhir.ml"
+# 26660 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26444 "parser_cocci_menhir.ml"
+# 26666 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26449 "parser_cocci_menhir.ml"
+# 26671 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_statement = 
-# 854 "parser_cocci_menhir.mly"
+# 863 "parser_cocci_menhir.mly"
     ( P.ifthen _1 _2 _3 _4 _5 )
-# 26456 "parser_cocci_menhir.ml"
+# 26678 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26504,31 +26726,31 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _6 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26508 "parser_cocci_menhir.ml"
+# 26730 "parser_cocci_menhir.ml"
         ) = Obj.magic _6 in
         let _5 : 'tv_single_statement = Obj.magic _5 in
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26514 "parser_cocci_menhir.ml"
+# 26736 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26520 "parser_cocci_menhir.ml"
+# 26742 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26525 "parser_cocci_menhir.ml"
+# 26747 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : 'tv_statement = 
-# 856 "parser_cocci_menhir.mly"
+# 865 "parser_cocci_menhir.mly"
     ( P.ifthenelse _1 _2 _3 _4 _5 _6 _7 )
-# 26532 "parser_cocci_menhir.ml"
+# 26754 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26590,37 +26812,37 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _8 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26594 "parser_cocci_menhir.ml"
+# 26816 "parser_cocci_menhir.ml"
         ) = Obj.magic _8 in
         let _7 : 'tv_option_eexpr_ = Obj.magic _7 in
         let _6 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26600 "parser_cocci_menhir.ml"
+# 26822 "parser_cocci_menhir.ml"
         ) = Obj.magic _6 in
         let _5 : 'tv_option_eexpr_ = Obj.magic _5 in
         let _4 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26606 "parser_cocci_menhir.ml"
+# 26828 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_option_eexpr_ = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26612 "parser_cocci_menhir.ml"
+# 26834 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26617 "parser_cocci_menhir.ml"
+# 26839 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__9_ in
         let _v : 'tv_statement = 
-# 859 "parser_cocci_menhir.mly"
+# 868 "parser_cocci_menhir.mly"
     ( P.forloop _1 _2 _3 _4 _5 _6 _7 _8 _9 )
-# 26624 "parser_cocci_menhir.ml"
+# 26846 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26662,25 +26884,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26666 "parser_cocci_menhir.ml"
+# 26888 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26672 "parser_cocci_menhir.ml"
+# 26894 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26677 "parser_cocci_menhir.ml"
+# 26899 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_statement = 
-# 861 "parser_cocci_menhir.mly"
+# 870 "parser_cocci_menhir.mly"
     ( P.whileloop _1 _2 _3 _4 _5 )
-# 26684 "parser_cocci_menhir.ml"
+# 26906 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26731,36 +26953,36 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _7 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26735 "parser_cocci_menhir.ml"
+# 26957 "parser_cocci_menhir.ml"
         ) = Obj.magic _7 in
         let _6 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26740 "parser_cocci_menhir.ml"
+# 26962 "parser_cocci_menhir.ml"
         ) = Obj.magic _6 in
         let _5 : 'tv_eexpr = Obj.magic _5 in
         let _4 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26746 "parser_cocci_menhir.ml"
+# 26968 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26751 "parser_cocci_menhir.ml"
+# 26973 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_single_statement = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26757 "parser_cocci_menhir.ml"
+# 26979 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : 'tv_statement = 
-# 863 "parser_cocci_menhir.mly"
+# 872 "parser_cocci_menhir.mly"
     ( P.doloop _1 _2 _3 _4 _5 _6 _7 )
-# 26764 "parser_cocci_menhir.ml"
+# 26986 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26802,21 +27024,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26806 "parser_cocci_menhir.ml"
+# 27028 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26812 "parser_cocci_menhir.ml"
+# 27034 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_iter_ident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_statement = 
-# 865 "parser_cocci_menhir.mly"
+# 874 "parser_cocci_menhir.mly"
     ( P.iterator _1 _2 _3 _4 _5 )
-# 26820 "parser_cocci_menhir.ml"
+# 27042 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26867,36 +27089,36 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _7 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26871 "parser_cocci_menhir.ml"
+# 27093 "parser_cocci_menhir.ml"
         ) = Obj.magic _7 in
         let _6 : 'tv_list_case_line_ = Obj.magic _6 in
         let _5 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26877 "parser_cocci_menhir.ml"
+# 27099 "parser_cocci_menhir.ml"
         ) = Obj.magic _5 in
         let _4 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26882 "parser_cocci_menhir.ml"
+# 27104 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26888 "parser_cocci_menhir.ml"
+# 27110 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26893 "parser_cocci_menhir.ml"
+# 27115 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : 'tv_statement = 
-# 867 "parser_cocci_menhir.mly"
+# 876 "parser_cocci_menhir.mly"
     ( P.switch _1 _2 _3 _4 _5 _6 _7 )
-# 26900 "parser_cocci_menhir.ml"
+# 27122 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26927,20 +27149,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26931 "parser_cocci_menhir.ml"
+# 27153 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26937 "parser_cocci_menhir.ml"
+# 27159 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_statement = 
-# 868 "parser_cocci_menhir.mly"
+# 877 "parser_cocci_menhir.mly"
                         ( P.ret_exp _1 _2 _3 )
-# 26944 "parser_cocci_menhir.ml"
+# 27166 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26966,19 +27188,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26970 "parser_cocci_menhir.ml"
+# 27192 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 57 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26975 "parser_cocci_menhir.ml"
+# 27197 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_statement = 
-# 869 "parser_cocci_menhir.mly"
+# 878 "parser_cocci_menhir.mly"
                   ( P.ret _1 _2 )
-# 26982 "parser_cocci_menhir.ml"
+# 27204 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27004,19 +27226,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27008 "parser_cocci_menhir.ml"
+# 27230 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27013 "parser_cocci_menhir.ml"
+# 27235 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_statement = 
-# 870 "parser_cocci_menhir.mly"
+# 879 "parser_cocci_menhir.mly"
                  ( P.break _1 _2 )
-# 27020 "parser_cocci_menhir.ml"
+# 27242 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27042,19 +27264,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27046 "parser_cocci_menhir.ml"
+# 27268 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27051 "parser_cocci_menhir.ml"
+# 27273 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_statement = 
-# 871 "parser_cocci_menhir.mly"
+# 880 "parser_cocci_menhir.mly"
                     ( P.cont _1 _2 )
-# 27058 "parser_cocci_menhir.ml"
+# 27280 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27080,15 +27302,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27084 "parser_cocci_menhir.ml"
+# 27306 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_ident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_statement = 
-# 872 "parser_cocci_menhir.mly"
+# 881 "parser_cocci_menhir.mly"
                 ( P.label _1 _2 )
-# 27092 "parser_cocci_menhir.ml"
+# 27314 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27119,20 +27341,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27123 "parser_cocci_menhir.ml"
+# 27345 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_ident = Obj.magic _2 in
         let _1 : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27129 "parser_cocci_menhir.ml"
+# 27351 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_statement = 
-# 873 "parser_cocci_menhir.mly"
+# 882 "parser_cocci_menhir.mly"
                       ( P.goto _1 _2 _3 )
-# 27136 "parser_cocci_menhir.ml"
+# 27358 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27163,20 +27385,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27167 "parser_cocci_menhir.ml"
+# 27389 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_fun_start = Obj.magic _2 in
         let _1 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27173 "parser_cocci_menhir.ml"
+# 27395 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_statement = 
-# 875 "parser_cocci_menhir.mly"
+# 884 "parser_cocci_menhir.mly"
     ( P.seq _1 _2 _3 )
-# 27180 "parser_cocci_menhir.ml"
+# 27402 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27203,14 +27425,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27207 "parser_cocci_menhir.ml"
+# 27429 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_w_ in
         let _v : 'tv_stm_dots = 
-# 879 "parser_cocci_menhir.mly"
+# 888 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Dots(P.clt2mcode "..." _1, List.concat w)) )
-# 27214 "parser_cocci_menhir.ml"
+# 27436 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27246,22 +27468,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let c : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27250 "parser_cocci_menhir.ml"
+# 27472 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let b : 'tv_nest_start = Obj.magic b in
         let w : 'tv_list_whenppdecs_ = Obj.magic w in
         let _1 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27257 "parser_cocci_menhir.ml"
+# 27479 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_c_ in
         let _v : 'tv_stm_dots = 
-# 881 "parser_cocci_menhir.mly"
+# 890 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<..." _1, b,
                          P.clt2mcode "...>" c, List.concat w, false)) )
-# 27265 "parser_cocci_menhir.ml"
+# 27487 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27297,22 +27519,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let c : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27301 "parser_cocci_menhir.ml"
+# 27523 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let b : 'tv_nest_start = Obj.magic b in
         let w : 'tv_list_whenppdecs_ = Obj.magic w in
         let _1 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27308 "parser_cocci_menhir.ml"
+# 27530 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_c_ in
         let _v : 'tv_stm_dots = 
-# 884 "parser_cocci_menhir.mly"
+# 893 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<+..." _1, b,
                          P.clt2mcode "...+>" c, List.concat w, true)) )
-# 27316 "parser_cocci_menhir.ml"
+# 27538 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27333,14 +27555,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let s : (
 # 53 "parser_cocci_menhir.mly"
       (Data.clt)
-# 27337 "parser_cocci_menhir.ml"
+# 27559 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_storage = 
-# 806 "parser_cocci_menhir.mly"
+# 815 "parser_cocci_menhir.mly"
                         ( P.clt2mcode Ast.Static s )
-# 27344 "parser_cocci_menhir.ml"
+# 27566 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27361,14 +27583,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let s : (
 # 53 "parser_cocci_menhir.mly"
       (Data.clt)
-# 27365 "parser_cocci_menhir.ml"
+# 27587 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_storage = 
-# 807 "parser_cocci_menhir.mly"
+# 816 "parser_cocci_menhir.mly"
                         ( P.clt2mcode Ast.Auto s )
-# 27372 "parser_cocci_menhir.ml"
+# 27594 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27389,14 +27611,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let s : (
 # 53 "parser_cocci_menhir.mly"
       (Data.clt)
-# 27393 "parser_cocci_menhir.ml"
+# 27615 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_storage = 
-# 808 "parser_cocci_menhir.mly"
+# 817 "parser_cocci_menhir.mly"
                         ( P.clt2mcode Ast.Register s )
-# 27400 "parser_cocci_menhir.ml"
+# 27622 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27417,14 +27639,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let s : (
 # 53 "parser_cocci_menhir.mly"
       (Data.clt)
-# 27421 "parser_cocci_menhir.ml"
+# 27643 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_storage = 
-# 809 "parser_cocci_menhir.mly"
+# 818 "parser_cocci_menhir.mly"
                         ( P.clt2mcode Ast.Extern s )
-# 27428 "parser_cocci_menhir.ml"
+# 27650 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27444,9 +27666,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_struct_decl = 
-# 512 "parser_cocci_menhir.mly"
+# 521 "parser_cocci_menhir.mly"
                ( [] )
-# 27450 "parser_cocci_menhir.ml"
+# 27672 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27477,17 +27699,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27481 "parser_cocci_menhir.ml"
+# 27703 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_pv_ in
         let _v : 'tv_struct_decl = 
-# 514 "parser_cocci_menhir.mly"
+# 523 "parser_cocci_menhir.mly"
   ( let (id,fn) = d in
         [Ast0.wrap(Ast0.UnInit(None,fn t,id,P.clt2mcode ";" pv))] )
-# 27491 "parser_cocci_menhir.ml"
+# 27713 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27548,40 +27770,40 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27552 "parser_cocci_menhir.ml"
+# 27774 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let rp2 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27557 "parser_cocci_menhir.ml"
+# 27779 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27563 "parser_cocci_menhir.ml"
+# 27785 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27568 "parser_cocci_menhir.ml"
+# 27790 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27574 "parser_cocci_menhir.ml"
+# 27796 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27579 "parser_cocci_menhir.ml"
+# 27801 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_fn_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_pv_ in
         let _v : 'tv_struct_decl = 
-# 518 "parser_cocci_menhir.mly"
+# 527 "parser_cocci_menhir.mly"
         ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -27589,7 +27811,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
         [Ast0.wrap(Ast0.UnInit(None,fn t,id,P.clt2mcode ";" pv))] )
-# 27593 "parser_cocci_menhir.ml"
+# 27815 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27620,7 +27842,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27624 "parser_cocci_menhir.ml"
+# 27846 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -27630,15 +27852,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 27634 "parser_cocci_menhir.ml"
+# 27856 "parser_cocci_menhir.ml"
           
         in
         
-# 526 "parser_cocci_menhir.mly"
+# 535 "parser_cocci_menhir.mly"
   ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
         [Ast0.wrap(Ast0.UnInit(None,fn idtype,id,P.clt2mcode ";" pv))] )
-# 27642 "parser_cocci_menhir.ml"
+# 27864 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27674,7 +27896,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let pv : (
 # 107 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27678 "parser_cocci_menhir.ml"
+# 27900 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident = Obj.magic i in
@@ -27686,15 +27908,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 27690 "parser_cocci_menhir.ml"
+# 27912 "parser_cocci_menhir.ml"
           
         in
         
-# 526 "parser_cocci_menhir.mly"
+# 535 "parser_cocci_menhir.mly"
   ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
         [Ast0.wrap(Ast0.UnInit(None,fn idtype,id,P.clt2mcode ";" pv))] )
-# 27698 "parser_cocci_menhir.ml"
+# 27920 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27716,9 +27938,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_struct_decl_list = 
-# 531 "parser_cocci_menhir.mly"
+# 540 "parser_cocci_menhir.mly"
                           ( Ast0.wrap(Ast0.DOTS(_1)) )
-# 27722 "parser_cocci_menhir.ml"
+# 27944 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27740,9 +27962,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_struct_decl_list_start = 
-# 534 "parser_cocci_menhir.mly"
+# 543 "parser_cocci_menhir.mly"
                                      ( _1 )
-# 27746 "parser_cocci_menhir.ml"
+# 27968 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27770,9 +27992,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_struct_decl_list_start = 
-# 535 "parser_cocci_menhir.mly"
+# 544 "parser_cocci_menhir.mly"
                                      ( _1@_2 )
-# 27776 "parser_cocci_menhir.ml"
+# 27998 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27800,9 +28022,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_struct_decl_list_start = 
-# 537 "parser_cocci_menhir.mly"
+# 546 "parser_cocci_menhir.mly"
     ( (P.mkddots "..." d)::r )
-# 27806 "parser_cocci_menhir.ml"
+# 28028 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27823,14 +28045,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let s : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 27827 "parser_cocci_menhir.ml"
+# 28049 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_struct_or_union = 
-# 508 "parser_cocci_menhir.mly"
+# 517 "parser_cocci_menhir.mly"
                  ( P.clt2mcode Ast.Struct s )
-# 27834 "parser_cocci_menhir.ml"
+# 28056 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27851,14 +28073,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let u : (
 # 50 "parser_cocci_menhir.mly"
       (Data.clt)
-# 27855 "parser_cocci_menhir.ml"
+# 28077 "parser_cocci_menhir.ml"
         ) = Obj.magic u in
         let _startpos = _startpos_u_ in
         let _endpos = _endpos_u_ in
         let _v : 'tv_struct_or_union = 
-# 509 "parser_cocci_menhir.mly"
+# 518 "parser_cocci_menhir.mly"
                  ( P.clt2mcode Ast.Union u )
-# 27862 "parser_cocci_menhir.ml"
+# 28084 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27880,9 +28102,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_top_eexpr = 
-# 1200 "parser_cocci_menhir.mly"
+# 1209 "parser_cocci_menhir.mly"
         ( Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Exp(_1)))) )
-# 27886 "parser_cocci_menhir.ml"
+# 28108 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27913,20 +28135,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _3 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27917 "parser_cocci_menhir.ml"
+# 28139 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_initialize_list = Obj.magic _2 in
         let _1 : (
 # 101 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27923 "parser_cocci_menhir.ml"
+# 28145 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_top_init = 
-# 1638 "parser_cocci_menhir.mly"
+# 1651 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.InitList(P.clt2mcode "{" _1,_2,P.clt2mcode "}" _3)) )
-# 27930 "parser_cocci_menhir.ml"
+# 28152 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27941,9 +28163,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_toplevel_after_dots = 
-# 1626 "parser_cocci_menhir.mly"
+# 1639 "parser_cocci_menhir.mly"
                                      ([])
-# 27947 "parser_cocci_menhir.ml"
+# 28169 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27969,9 +28191,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots = 
-# 1627 "parser_cocci_menhir.mly"
+# 1640 "parser_cocci_menhir.mly"
                                      (_2)
-# 27975 "parser_cocci_menhir.ml"
+# 28197 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27999,9 +28221,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots = 
-# 1628 "parser_cocci_menhir.mly"
+# 1641 "parser_cocci_menhir.mly"
                                      ((Ast0.wrap(Ast0.Exp(_1)))::_2)
-# 28005 "parser_cocci_menhir.ml"
+# 28227 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28029,9 +28251,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots = 
-# 1629 "parser_cocci_menhir.mly"
+# 1642 "parser_cocci_menhir.mly"
                                           (_1@_2)
-# 28035 "parser_cocci_menhir.ml"
+# 28257 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28057,9 +28279,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots_init = 
-# 1617 "parser_cocci_menhir.mly"
+# 1630 "parser_cocci_menhir.mly"
                                      (_2)
-# 28063 "parser_cocci_menhir.ml"
+# 28285 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28087,9 +28309,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots_init = 
-# 1618 "parser_cocci_menhir.mly"
+# 1631 "parser_cocci_menhir.mly"
                                      ((Ast0.wrap(Ast0.Exp(_1)))::_2)
-# 28093 "parser_cocci_menhir.ml"
+# 28315 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28117,9 +28339,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots_init = 
-# 1619 "parser_cocci_menhir.mly"
+# 1632 "parser_cocci_menhir.mly"
                                           (_1@_2)
-# 28123 "parser_cocci_menhir.ml"
+# 28345 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28134,9 +28356,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_toplevel_after_exp = 
-# 1622 "parser_cocci_menhir.mly"
+# 1635 "parser_cocci_menhir.mly"
                                      ([])
-# 28140 "parser_cocci_menhir.ml"
+# 28362 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28164,9 +28386,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_exp = 
-# 1623 "parser_cocci_menhir.mly"
+# 1636 "parser_cocci_menhir.mly"
                                      (_1::_2)
-# 28170 "parser_cocci_menhir.ml"
+# 28392 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28181,9 +28403,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_toplevel_after_stm = 
-# 1632 "parser_cocci_menhir.mly"
+# 1645 "parser_cocci_menhir.mly"
                                      ([])
-# 28187 "parser_cocci_menhir.ml"
+# 28409 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28211,9 +28433,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_stm = 
-# 1633 "parser_cocci_menhir.mly"
+# 1646 "parser_cocci_menhir.mly"
                                      (_1::_2)
-# 28217 "parser_cocci_menhir.ml"
+# 28439 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28241,9 +28463,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_stm = 
-# 1634 "parser_cocci_menhir.mly"
+# 1647 "parser_cocci_menhir.mly"
                                      (_1@_2)
-# 28247 "parser_cocci_menhir.ml"
+# 28469 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28271,9 +28493,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_seq_start_toplevel_after_dots_ = 
-# 1612 "parser_cocci_menhir.mly"
+# 1625 "parser_cocci_menhir.mly"
                                      ( _1::_2 )
-# 28277 "parser_cocci_menhir.ml"
+# 28499 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28301,9 +28523,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_seq_start_toplevel_after_dots_ = 
-# 1613 "parser_cocci_menhir.mly"
+# 1626 "parser_cocci_menhir.mly"
                                      ( (Ast0.wrap(Ast0.Exp(_1)))::_2 )
-# 28307 "parser_cocci_menhir.ml"
+# 28529 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28331,9 +28553,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_seq_start_toplevel_after_dots_ = 
-# 1614 "parser_cocci_menhir.mly"
+# 1627 "parser_cocci_menhir.mly"
                                           ( _1@_2 )
-# 28337 "parser_cocci_menhir.ml"
+# 28559 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28366,7 +28588,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let a0 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28370 "parser_cocci_menhir.ml"
+# 28592 "parser_cocci_menhir.ml"
         ) = Obj.magic a0 in
         let _startpos = _startpos_a0_ in
         let _endpos = _endpos_b_ in
@@ -28374,15 +28596,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let w = w0 in
           let a = a0 in
           
-# 889 "parser_cocci_menhir.mly"
+# 898 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Dots(P.clt2mcode "..." a, List.concat w)) )
-# 28380 "parser_cocci_menhir.ml"
+# 28602 "parser_cocci_menhir.ml"
           
         in
         
-# 1605 "parser_cocci_menhir.mly"
+# 1618 "parser_cocci_menhir.mly"
                                              ( a::b )
-# 28386 "parser_cocci_menhir.ml"
+# 28608 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28424,14 +28646,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let c0 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28428 "parser_cocci_menhir.ml"
+# 28650 "parser_cocci_menhir.ml"
         ) = Obj.magic c0 in
         let b0 : 'tv_nest_start = Obj.magic b0 in
         let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in
         let a0 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28435 "parser_cocci_menhir.ml"
+# 28657 "parser_cocci_menhir.ml"
         ) = Obj.magic a0 in
         let _startpos = _startpos_a0_ in
         let _endpos = _endpos_b_ in
@@ -28441,16 +28663,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let w = w0 in
           let a = a0 in
           
-# 893 "parser_cocci_menhir.mly"
+# 902 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<..." a, b,
                          P.clt2mcode "...>" c, List.concat w, false)) )
-# 28448 "parser_cocci_menhir.ml"
+# 28670 "parser_cocci_menhir.ml"
           
         in
         
-# 1606 "parser_cocci_menhir.mly"
+# 1619 "parser_cocci_menhir.mly"
                                               ( a::b )
-# 28454 "parser_cocci_menhir.ml"
+# 28676 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28492,14 +28714,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let c0 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28496 "parser_cocci_menhir.ml"
+# 28718 "parser_cocci_menhir.ml"
         ) = Obj.magic c0 in
         let b0 : 'tv_nest_start = Obj.magic b0 in
         let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in
         let a0 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28503 "parser_cocci_menhir.ml"
+# 28725 "parser_cocci_menhir.ml"
         ) = Obj.magic a0 in
         let _startpos = _startpos_a0_ in
         let _endpos = _endpos_b_ in
@@ -28509,16 +28731,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let w = w0 in
           let a = a0 in
           
-# 896 "parser_cocci_menhir.mly"
+# 905 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<+..." a, b,
                          P.clt2mcode "...+>" c, List.concat w, true)) )
-# 28516 "parser_cocci_menhir.ml"
+# 28738 "parser_cocci_menhir.ml"
           
         in
         
-# 1606 "parser_cocci_menhir.mly"
+# 1619 "parser_cocci_menhir.mly"
                                               ( a::b )
-# 28522 "parser_cocci_menhir.ml"
+# 28744 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28554,14 +28776,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let c0 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28558 "parser_cocci_menhir.ml"
+# 28780 "parser_cocci_menhir.ml"
         ) = Obj.magic c0 in
         let b0 : 'tv_nest_start = Obj.magic b0 in
         let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in
         let a0 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28565 "parser_cocci_menhir.ml"
+# 28787 "parser_cocci_menhir.ml"
         ) = Obj.magic a0 in
         let _startpos = _startpos_a0_ in
         let _endpos = _endpos_c0_ in
@@ -28571,16 +28793,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let w = w0 in
           let a = a0 in
           
-# 893 "parser_cocci_menhir.mly"
+# 902 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<..." a, b,
                          P.clt2mcode "...>" c, List.concat w, false)) )
-# 28578 "parser_cocci_menhir.ml"
+# 28800 "parser_cocci_menhir.ml"
           
         in
         
-# 1607 "parser_cocci_menhir.mly"
+# 1620 "parser_cocci_menhir.mly"
                                        ( [a] )
-# 28584 "parser_cocci_menhir.ml"
+# 28806 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28616,14 +28838,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let c0 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28620 "parser_cocci_menhir.ml"
+# 28842 "parser_cocci_menhir.ml"
         ) = Obj.magic c0 in
         let b0 : 'tv_nest_start = Obj.magic b0 in
         let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in
         let a0 : (
 # 73 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28627 "parser_cocci_menhir.ml"
+# 28849 "parser_cocci_menhir.ml"
         ) = Obj.magic a0 in
         let _startpos = _startpos_a0_ in
         let _endpos = _endpos_c0_ in
@@ -28633,16 +28855,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let w = w0 in
           let a = a0 in
           
-# 896 "parser_cocci_menhir.mly"
+# 905 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<+..." a, b,
                          P.clt2mcode "...+>" c, List.concat w, true)) )
-# 28640 "parser_cocci_menhir.ml"
+# 28862 "parser_cocci_menhir.ml"
           
         in
         
-# 1607 "parser_cocci_menhir.mly"
+# 1620 "parser_cocci_menhir.mly"
                                        ( [a] )
-# 28646 "parser_cocci_menhir.ml"
+# 28868 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28670,9 +28892,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_seq_startne_toplevel_after_dots_init_ = 
-# 1608 "parser_cocci_menhir.mly"
+# 1621 "parser_cocci_menhir.mly"
                                      ( (Ast0.wrap(Ast0.Exp(_1)))::_2 )
-# 28676 "parser_cocci_menhir.ml"
+# 28898 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28700,9 +28922,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_seq_startne_toplevel_after_dots_init_ = 
-# 1609 "parser_cocci_menhir.mly"
+# 1622 "parser_cocci_menhir.mly"
                                           ( _1@_2 )
-# 28706 "parser_cocci_menhir.ml"
+# 28928 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28724,9 +28946,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_typedef_ident = 
-# 1517 "parser_cocci_menhir.mly"
+# 1530 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.TypeName(P.id2mcode _1)) )
-# 28730 "parser_cocci_menhir.ml"
+# 28952 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28747,15 +28969,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 64 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 28751 "parser_cocci_menhir.ml"
+# 28973 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_typedef_ident = 
-# 1519 "parser_cocci_menhir.mly"
+# 1532 "parser_cocci_menhir.mly"
          ( let (nm,pure,clt) = _1 in
         Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
-# 28759 "parser_cocci_menhir.ml"
+# 28981 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28777,9 +28999,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1289 "parser_cocci_menhir.mly"
+# 1298 "parser_cocci_menhir.mly"
                                          ( _1 )
-# 28783 "parser_cocci_menhir.ml"
+# 29005 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28806,14 +29028,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28810 "parser_cocci_menhir.ml"
+# 29032 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1291 "parser_cocci_menhir.mly"
+# 1300 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) )
-# 28817 "parser_cocci_menhir.ml"
+# 29039 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28840,14 +29062,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28844 "parser_cocci_menhir.ml"
+# 29066 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1293 "parser_cocci_menhir.mly"
+# 1302 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) )
-# 28851 "parser_cocci_menhir.ml"
+# 29073 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28875,9 +29097,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1295 "parser_cocci_menhir.mly"
+# 1304 "parser_cocci_menhir.mly"
       ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 28881 "parser_cocci_menhir.ml"
+# 29103 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28904,15 +29126,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28908 "parser_cocci_menhir.ml"
+# 29130 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1297 "parser_cocci_menhir.mly"
+# 1306 "parser_cocci_menhir.mly"
       ( let mcode = P.clt2mcode Ast.Not _1 in
       Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 28916 "parser_cocci_menhir.ml"
+# 29138 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28939,14 +29161,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28943 "parser_cocci_menhir.ml"
+# 29165 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1300 "parser_cocci_menhir.mly"
+# 1309 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) )
-# 28950 "parser_cocci_menhir.ml"
+# 29172 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28982,27 +29204,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28986 "parser_cocci_menhir.ml"
+# 29208 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28992 "parser_cocci_menhir.ml"
+# 29214 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let s : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28997 "parser_cocci_menhir.ml"
+# 29219 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1302 "parser_cocci_menhir.mly"
+# 1311 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s,
                                    P.clt2mcode "(" lp,t,
                                    P.clt2mcode ")" rp)) )
-# 29006 "parser_cocci_menhir.ml"
+# 29228 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29024,9 +29246,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1289 "parser_cocci_menhir.mly"
+# 1298 "parser_cocci_menhir.mly"
                                          ( _1 )
-# 29030 "parser_cocci_menhir.ml"
+# 29252 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29053,14 +29275,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29057 "parser_cocci_menhir.ml"
+# 29279 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1291 "parser_cocci_menhir.mly"
+# 1300 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) )
-# 29064 "parser_cocci_menhir.ml"
+# 29286 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29087,14 +29309,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29091 "parser_cocci_menhir.ml"
+# 29313 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1293 "parser_cocci_menhir.mly"
+# 1302 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) )
-# 29098 "parser_cocci_menhir.ml"
+# 29320 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29122,9 +29344,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1295 "parser_cocci_menhir.mly"
+# 1304 "parser_cocci_menhir.mly"
       ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 29128 "parser_cocci_menhir.ml"
+# 29350 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29151,15 +29373,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29155 "parser_cocci_menhir.ml"
+# 29377 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1297 "parser_cocci_menhir.mly"
+# 1306 "parser_cocci_menhir.mly"
       ( let mcode = P.clt2mcode Ast.Not _1 in
       Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 29163 "parser_cocci_menhir.ml"
+# 29385 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29186,14 +29408,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29190 "parser_cocci_menhir.ml"
+# 29412 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1300 "parser_cocci_menhir.mly"
+# 1309 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) )
-# 29197 "parser_cocci_menhir.ml"
+# 29419 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29229,27 +29451,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29233 "parser_cocci_menhir.ml"
+# 29455 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29239 "parser_cocci_menhir.ml"
+# 29461 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let s : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29244 "parser_cocci_menhir.ml"
+# 29466 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1302 "parser_cocci_menhir.mly"
+# 1311 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s,
                                    P.clt2mcode "(" lp,t,
                                    P.clt2mcode ")" rp)) )
-# 29253 "parser_cocci_menhir.ml"
+# 29475 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29271,9 +29493,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1289 "parser_cocci_menhir.mly"
+# 1298 "parser_cocci_menhir.mly"
                                          ( _1 )
-# 29277 "parser_cocci_menhir.ml"
+# 29499 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29300,14 +29522,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29304 "parser_cocci_menhir.ml"
+# 29526 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1291 "parser_cocci_menhir.mly"
+# 1300 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) )
-# 29311 "parser_cocci_menhir.ml"
+# 29533 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29334,14 +29556,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29338 "parser_cocci_menhir.ml"
+# 29560 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1293 "parser_cocci_menhir.mly"
+# 1302 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) )
-# 29345 "parser_cocci_menhir.ml"
+# 29567 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29369,9 +29591,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1295 "parser_cocci_menhir.mly"
+# 1304 "parser_cocci_menhir.mly"
       ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 29375 "parser_cocci_menhir.ml"
+# 29597 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29398,15 +29620,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29402 "parser_cocci_menhir.ml"
+# 29624 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1297 "parser_cocci_menhir.mly"
+# 1306 "parser_cocci_menhir.mly"
       ( let mcode = P.clt2mcode Ast.Not _1 in
       Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 29410 "parser_cocci_menhir.ml"
+# 29632 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29433,14 +29655,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29437 "parser_cocci_menhir.ml"
+# 29659 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1300 "parser_cocci_menhir.mly"
+# 1309 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) )
-# 29444 "parser_cocci_menhir.ml"
+# 29666 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29476,27 +29698,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29480 "parser_cocci_menhir.ml"
+# 29702 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29486 "parser_cocci_menhir.ml"
+# 29708 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let s : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29491 "parser_cocci_menhir.ml"
+# 29713 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1302 "parser_cocci_menhir.mly"
+# 1311 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s,
                                    P.clt2mcode "(" lp,t,
                                    P.clt2mcode ")" rp)) )
-# 29500 "parser_cocci_menhir.ml"
+# 29722 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29518,9 +29740,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1289 "parser_cocci_menhir.mly"
+# 1298 "parser_cocci_menhir.mly"
                                          ( _1 )
-# 29524 "parser_cocci_menhir.ml"
+# 29746 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29547,14 +29769,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29551 "parser_cocci_menhir.ml"
+# 29773 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1291 "parser_cocci_menhir.mly"
+# 1300 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) )
-# 29558 "parser_cocci_menhir.ml"
+# 29780 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29581,14 +29803,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 85 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29585 "parser_cocci_menhir.ml"
+# 29807 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1293 "parser_cocci_menhir.mly"
+# 1302 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) )
-# 29592 "parser_cocci_menhir.ml"
+# 29814 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29616,9 +29838,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1295 "parser_cocci_menhir.mly"
+# 1304 "parser_cocci_menhir.mly"
       ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 29622 "parser_cocci_menhir.ml"
+# 29844 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29645,15 +29867,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29649 "parser_cocci_menhir.ml"
+# 29871 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1297 "parser_cocci_menhir.mly"
+# 1306 "parser_cocci_menhir.mly"
       ( let mcode = P.clt2mcode Ast.Not _1 in
       Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 29657 "parser_cocci_menhir.ml"
+# 29879 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29680,14 +29902,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29684 "parser_cocci_menhir.ml"
+# 29906 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1300 "parser_cocci_menhir.mly"
+# 1309 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) )
-# 29691 "parser_cocci_menhir.ml"
+# 29913 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29723,27 +29945,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let rp : (
 # 77 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29727 "parser_cocci_menhir.ml"
+# 29949 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
 # 76 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29733 "parser_cocci_menhir.ml"
+# 29955 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let s : (
 # 58 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29738 "parser_cocci_menhir.ml"
+# 29960 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1302 "parser_cocci_menhir.mly"
+# 1311 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s,
                                    P.clt2mcode "(" lp,t,
                                    P.clt2mcode ")" rp)) )
-# 29747 "parser_cocci_menhir.ml"
+# 29969 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29764,14 +29986,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 93 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29768 "parser_cocci_menhir.ml"
+# 29990 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_op = 
-# 1306 "parser_cocci_menhir.mly"
+# 1315 "parser_cocci_menhir.mly"
                   ( P.clt2mcode Ast.GetRef _1 )
-# 29775 "parser_cocci_menhir.ml"
+# 29997 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29792,14 +30014,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29796 "parser_cocci_menhir.ml"
+# 30018 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_op = 
-# 1307 "parser_cocci_menhir.mly"
+# 1316 "parser_cocci_menhir.mly"
            ( P.clt2mcode Ast.DeRef _1 )
-# 29803 "parser_cocci_menhir.ml"
+# 30025 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29820,14 +30042,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 98 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29824 "parser_cocci_menhir.ml"
+# 30046 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_op = 
-# 1308 "parser_cocci_menhir.mly"
+# 1317 "parser_cocci_menhir.mly"
            ( P.clt2mcode Ast.UnPlus _1 )
-# 29831 "parser_cocci_menhir.ml"
+# 30053 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29848,14 +30070,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 98 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29852 "parser_cocci_menhir.ml"
+# 30074 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_op = 
-# 1309 "parser_cocci_menhir.mly"
+# 1318 "parser_cocci_menhir.mly"
            ( P.clt2mcode Ast.UnMinus _1 )
-# 29859 "parser_cocci_menhir.ml"
+# 30081 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29876,14 +30098,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _1 : (
 # 99 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29880 "parser_cocci_menhir.ml"
+# 30102 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_op = 
-# 1310 "parser_cocci_menhir.mly"
+# 1319 "parser_cocci_menhir.mly"
            ( P.clt2mcode Ast.Tilde _1 )
-# 29887 "parser_cocci_menhir.ml"
+# 30109 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29911,9 +30133,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_when_start = 
-# 1731 "parser_cocci_menhir.mly"
+# 1744 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.DOTS((Ast0.wrap(Ast0.Exp(_1)))::_2)) )
-# 29917 "parser_cocci_menhir.ml"
+# 30139 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29941,9 +30163,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_when_start = 
-# 1733 "parser_cocci_menhir.mly"
+# 1746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.DOTS(_1@_2)) )
-# 29947 "parser_cocci_menhir.ml"
+# 30169 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29965,9 +30187,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_w_ in
         let _endpos = _endpos_w_ in
         let _v : 'tv_whenppdecs = 
-# 900 "parser_cocci_menhir.mly"
+# 909 "parser_cocci_menhir.mly"
     ( w )
-# 29971 "parser_cocci_menhir.ml"
+# 30193 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30001,9 +30223,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_whens_when_start_rule_elem_statement_ = 
-# 1799 "parser_cocci_menhir.mly"
+# 1812 "parser_cocci_menhir.mly"
                                          ( [Ast0.WhenNot w] )
-# 30007 "parser_cocci_menhir.ml"
+# 30229 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30037,9 +30259,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_whens_when_start_rule_elem_statement_ = 
-# 1800 "parser_cocci_menhir.mly"
+# 1813 "parser_cocci_menhir.mly"
                                              ( [Ast0.WhenAlways w] )
-# 30043 "parser_cocci_menhir.ml"
+# 30265 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30069,9 +30291,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_whens_when_start_rule_elem_statement_ = 
-# 1802 "parser_cocci_menhir.mly"
+# 1815 "parser_cocci_menhir.mly"
       ( List.map (function x -> Ast0.WhenModifier(x)) _2 )
-# 30075 "parser_cocci_menhir.ml"
+# 30297 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30105,9 +30327,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_whens_when_start_rule_elem_statement_ = 
-# 1803 "parser_cocci_menhir.mly"
+# 1816 "parser_cocci_menhir.mly"
                                         ( [Ast0.WhenNotTrue e] )
-# 30111 "parser_cocci_menhir.ml"
+# 30333 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30141,9 +30363,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_whens_when_start_rule_elem_statement_ = 
-# 1804 "parser_cocci_menhir.mly"
+# 1817 "parser_cocci_menhir.mly"
                                          ( [Ast0.WhenNotFalse e] )
-# 30147 "parser_cocci_menhir.ml"
+# 30369 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30164,82 +30386,82 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
 
 let rec script_meta_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1534 lexer lexbuf) : (
+    (Obj.magic (MenhirInterpreter.entry 1549 lexer lexbuf) : (
 # 159 "parser_cocci_menhir.mly"
        (string * (string * string))
-# 30171 "parser_cocci_menhir.ml"
+# 30393 "parser_cocci_menhir.ml"
     ))
 
 and rule_name =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1470 lexer lexbuf) : (
+    (Obj.magic (MenhirInterpreter.entry 1477 lexer lexbuf) : (
 # 153 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 30179 "parser_cocci_menhir.ml"
+# 30401 "parser_cocci_menhir.ml"
     ))
 
 and reinit =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1468 lexer lexbuf) : (
+    (Obj.magic (MenhirInterpreter.entry 1475 lexer lexbuf) : (
 # 131 "parser_cocci_menhir.mly"
       (unit)
-# 30187 "parser_cocci_menhir.ml"
+# 30409 "parser_cocci_menhir.ml"
     ))
 
 and plus_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1432 lexer lexbuf) : (
+    (Obj.magic (MenhirInterpreter.entry 1439 lexer lexbuf) : (
 # 140 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 30195 "parser_cocci_menhir.ml"
+# 30417 "parser_cocci_menhir.ml"
     ))
 
 and plus_exp_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1423 lexer lexbuf) : (
+    (Obj.magic (MenhirInterpreter.entry 1430 lexer lexbuf) : (
 # 143 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 30203 "parser_cocci_menhir.ml"
+# 30425 "parser_cocci_menhir.ml"
     ))
 
 and never_used =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1417 lexer lexbuf) : (
+    (Obj.magic (MenhirInterpreter.entry 1424 lexer lexbuf) : (
 # 168 "parser_cocci_menhir.mly"
       (unit)
-# 30211 "parser_cocci_menhir.ml"
+# 30433 "parser_cocci_menhir.ml"
     ))
 
 and minus_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1331 lexer lexbuf) : (
+    (Obj.magic (MenhirInterpreter.entry 1338 lexer lexbuf) : (
 # 134 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 30219 "parser_cocci_menhir.ml"
+# 30441 "parser_cocci_menhir.ml"
     ))
 
 and minus_exp_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1307 lexer lexbuf) : (
+    (Obj.magic (MenhirInterpreter.entry 1314 lexer lexbuf) : (
 # 137 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 30227 "parser_cocci_menhir.ml"
+# 30449 "parser_cocci_menhir.ml"
     ))
 
 and meta_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1304 lexer lexbuf) : (
+    (Obj.magic (MenhirInterpreter.entry 1311 lexer lexbuf) : (
 # 157 "parser_cocci_menhir.mly"
       ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list)
-# 30235 "parser_cocci_menhir.ml"
+# 30457 "parser_cocci_menhir.ml"
     ))
 
 and iso_rule_name =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1300 lexer lexbuf) : (
+    (Obj.magic (MenhirInterpreter.entry 1307 lexer lexbuf) : (
 # 149 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 30243 "parser_cocci_menhir.ml"
+# 30465 "parser_cocci_menhir.ml"
     ))
 
 and iso_meta_main =
@@ -30247,7 +30469,7 @@ and iso_meta_main =
     (Obj.magic (MenhirInterpreter.entry 1104 lexer lexbuf) : (
 # 165 "parser_cocci_menhir.mly"
       ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list)
-# 30251 "parser_cocci_menhir.ml"
+# 30473 "parser_cocci_menhir.ml"
     ))
 
 and iso_main =
@@ -30255,7 +30477,7 @@ and iso_main =
     (Obj.magic (MenhirInterpreter.entry 10 lexer lexbuf) : (
 # 162 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 30259 "parser_cocci_menhir.ml"
+# 30481 "parser_cocci_menhir.ml"
     ))
 
 and include_main =
@@ -30263,7 +30485,7 @@ and include_main =
     (Obj.magic (MenhirInterpreter.entry 0 lexer lexbuf) : (
 # 146 "parser_cocci_menhir.mly"
       ((string,string) Common.either list)
-# 30267 "parser_cocci_menhir.ml"
+# 30489 "parser_cocci_menhir.ml"
     ))
 
 
index c93d0eb..ea76966 100644 (file)
@@ -113,6 +113,7 @@ type token =
   | TIso
   | TInvalid
   | TInt of (string * Data.clt)
+  | TInitialize
   | TInitialiser
   | TIncludeNL of (string * Data.clt)
   | TIncludeL of (string * Data.clt)
@@ -129,6 +130,7 @@ type token =
   | TForall
   | TFor of (Data.clt)
   | TFloat of (string * Data.clt)
+  | TFinalize
   | TExtends
   | TExpression
   | TExists
index a72182a..151401b 100644 (file)
@@ -43,7 +43,7 @@ module P = Parse_aux
 %token TPure TContext TGenerated
 %token TTypedef TDeclarer TIterator TName TPosition TPosAny
 %token TUsing TDisable TExtends TDepends TOn TEver TNever TExists TForall
-%token TScript TReverse TNothing
+%token TScript TInitialize TFinalize TReverse TNothing
 %token<string> TRuleName
 
 %token<Data.clt> Tchar Tshort Tint Tdouble Tfloat Tlong
@@ -207,6 +207,10 @@ rule_name:
       { P.make_generated_rule_name_result None d i a e ee }
   | TScript TDotDot lang=pure_ident d=depends TArob
       { P.make_script_rule_name_result lang d }
+  | TInitialize TDotDot lang=pure_ident TArob
+      { P.make_initial_script_rule_name_result lang }
+  | TFinalize TDotDot lang=pure_ident TArob
+      { P.make_final_script_rule_name_result lang }
 
 extends:
   /* empty */                                     { () }
@@ -257,6 +261,9 @@ metadec:
   ar=arity ispure=pure
   kindfn=metakind ids=comma_list(pure_ident_or_meta_ident) TMPtVirg
     { P.create_metadec ar ispure kindfn ids }
+| kindfn=metakind_fresh ids=comma_list(pure_ident_or_meta_ident_with_seed)
+    TMPtVirg
+    { P.create_fresh_metadec kindfn ids }
 | ar=arity ispure=pure
   kindfn=metakind_atomic
   ids=comma_list(pure_ident_or_meta_ident_with_not_eq(not_eq)) TMPtVirg
@@ -300,12 +307,14 @@ metadec:
          !Data.add_explist_meta name (Some lenname) pure; tok)
        id ids }
 
-%inline metakind:
+%inline metakind_fresh:
   TFresh TIdentifier
-    { (fun arity name pure check_meta ->
-      let tok = check_meta(Ast.MetaFreshIdDecl(arity,name)) in
-      !Data.add_id_meta name [] pure; tok) }
-| TParameter
+    { (fun name check_meta seed ->
+      let tok = check_meta(Ast.MetaFreshIdDecl(name,seed)) in
+      !Data.add_fresh_id_meta name; tok) }
+
+%inline metakind:
+  TParameter
     { (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaParamDecl(arity,name)) in
       !Data.add_param_meta name pure; tok) }
@@ -1396,6 +1405,10 @@ pure_ident_or_meta_ident:
      | TType                     { (None,"type") }
      | TName                     { (None,"name") }
 
+pure_ident_or_meta_ident_with_seed:
+       pure_ident_or_meta_ident { ($1,None) }
+     | pure_ident_or_meta_ident TEq s=TString { ($1,Some (P.id2name s)) }
+
 pure_ident_or_meta_ident_with_not_eq(not_eq):
        i=pure_ident_or_meta_ident l=loption(not_eq) { (i,l) }
 
index 9476554..cc133bd 100644 (file)
@@ -815,36 +815,54 @@ let rec dep in_and = function
 
 let unparse z =
   match z with
-    Ast.ScriptRule (lang,deps,bindings,code) ->
-    print_string "@@";
-    force_newline();
-    print_string ("script:" ^ lang);
-    (match deps with
-      Ast.NoDep -> ()
-    | _ -> print_string " depends on "; dep true deps);
-    force_newline();
-    print_string "@@";
-    force_newline();
-    print_string code;
-    force_newline()
+    Ast.InitialScriptRule (lang,code) ->
+      print_string "@@";
+      force_newline();
+      print_string ("initialize:" ^ lang);
+      force_newline();
+      print_string "@@";
+      force_newline();
+      print_string code;
+      force_newline()
+  | Ast.FinalScriptRule (lang,code) ->
+      print_string "@@";
+      force_newline();
+      print_string ("finalize:" ^ lang);
+      force_newline();
+      print_string "@@";
+      force_newline();
+      print_string code;
+      force_newline()
+  | Ast.ScriptRule (lang,deps,bindings,code) ->
+      print_string "@@";
+      force_newline();
+      print_string ("script:" ^ lang);
+      (match deps with
+       Ast.NoDep -> ()
+      | _ -> print_string " depends on "; dep true deps);
+      force_newline();
+      print_string "@@";
+      force_newline();
+      print_string code;
+      force_newline()
   | Ast.CocciRule (nm, (deps, drops, exists), x, _, _) ->
-    print_string "@@";
-    force_newline();
-    print_string nm;
-    (match deps with
-      Ast.NoDep -> ()
-    | _ -> print_string " depends on "; dep true deps);
+      print_string "@@";
+      force_newline();
+      print_string nm;
+      (match deps with
+       Ast.NoDep -> ()
+      | _ -> print_string " depends on "; dep true deps);
     (*
     print_string "line ";
     print_int (Ast.get_line (List.hd x));
     *)
-    force_newline();
-    print_string "@@";
-    print_newlines_disj := true;
-    force_newline();
-    force_newline();
-    rule x;
-    force_newline()
+      force_newline();
+      print_string "@@";
+      print_newlines_disj := true;
+      force_newline();
+      force_newline();
+      rule x;
+      force_newline()
 
 let rule_elem_to_string x =
   print_newlines_disj := true;
index 20a9939..f7029ba 100644 (file)
@@ -23,6 +23,7 @@
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 
 (* find assignments that can match an initialization *)
 
@@ -103,16 +104,11 @@ let rec exp mc e1 =
   | _ -> e1
 
 let simple_assignments l =
-  let mcode x = x in
-  let donothing r k e = k e in
   let statement r k e =
     match Ast0.unwrap e with
       Ast0.Exp(e1) -> Ast0.rewrap e (Ast0.Exp(exp (Ast0.get_mcodekind e) e1))
     | _ -> k e in
   let fn =
     V0.rebuilder
-      mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-      donothing donothing donothing donothing donothing donothing
-      donothing donothing donothing donothing donothing donothing statement
-      donothing donothing in
-  List.map fn.V0.rebuilder_top_level l
+      {V0.rebuilder_functions with VT0.rebuilder_stmtfn = statement} in
+  List.map fn.VT0.rebuilder_rec_top_level l
index d768632..4209f2f 100644 (file)
@@ -26,6 +26,7 @@ may need a special treatment if they are if branches *)
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 
 (* --------------------------------------------------------------------- *)
 (* --------------------------------------------------------------------- *)
@@ -311,7 +312,7 @@ let rec adding_something s =
       let (text,tinfo1,tinfo2) = !mc in
       (match text with Ast.NOTHING -> false | _ -> true)
   | Ast0.MIXED(_) ->
-      not(contains_only_minus.V0.combiner_statement s) (*&&
+      not(contains_only_minus.VT0.combiner_rec_statement s) (*&&
       (left_statement s) or (right_statement s)*)
   | _ -> failwith "unexpected plus code"
 
@@ -339,31 +340,31 @@ and contains_only_minus =
     mcodekind (Ast0.get_mcodekind e) &&
     match Ast0.unwrap e with
       Ast0.DisjExpr(starter,expr_list,mids,ender) ->
-       List.for_all r.V0.combiner_expression expr_list
+       List.for_all r.VT0.combiner_rec_expression expr_list
     | _ -> k e in
 
   let declaration r k e =
     mcodekind (Ast0.get_mcodekind e) &&
     match Ast0.unwrap e with
       Ast0.DisjDecl(starter,decls,mids,ender) ->
-       List.for_all r.V0.combiner_declaration decls
+       List.for_all r.VT0.combiner_rec_declaration decls
     | _ -> k e in
 
   let typeC r k e =
     mcodekind (Ast0.get_mcodekind e) &&
     match Ast0.unwrap e with
       Ast0.DisjType(starter,types,mids,ender) ->
-       List.for_all r.V0.combiner_typeC types
+       List.for_all r.VT0.combiner_rec_typeC types
     | _ -> k e in
 
   let statement r k e =
     mcodekind (Ast0.get_mcodekind e) &&
     match Ast0.unwrap e with
       Ast0.Disj(starter,statement_dots_list,mids,ender) ->
-       List.for_all r.V0.combiner_statement_dots statement_dots_list
+       List.for_all r.VT0.combiner_rec_statement_dots statement_dots_list
     | _ -> k e in
 
-  V0.combiner bind option_default
+  V0.flat_combiner bind option_default
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
     dots dots dots dots dots dots
     donothing expression typeC donothing donothing declaration
@@ -387,7 +388,8 @@ branch, so the braces get added in oddly.
 *)
 
 let add_braces orig_s =
-  let s = (Iso_pattern.rebuild_mcode None).V0.rebuilder_statement orig_s in
+  let s =
+    (Iso_pattern.rebuild_mcode None).VT0.rebuilder_rec_statement orig_s in
   let new_mcodekind =
     match Ast0.get_mcodekind s with
       Ast0.MINUS(mc) ->
index d73988c..9dede4f 100644 (file)
@@ -23,6 +23,7 @@
 module Ast = Ast_cocci
 module Ast0 = Ast0_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 
 (* call set_test_pos on test expressions *)
 
@@ -42,9 +43,6 @@ let rec process_exp e =
   | _ -> e
 
 let set_test_poss =
-  let donothing r k e = k e in
-  let mcode x = x in
-
   let expression r k e =
     let e = k e in
     match Ast0.unwrap e with
@@ -87,12 +85,10 @@ let set_test_poss =
     | _ -> s in
 
   V0.rebuilder
-      mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-      donothing donothing donothing donothing donothing donothing
-      donothing expression donothing donothing donothing donothing statement
-      donothing donothing
+    {V0.rebuilder_functions with
+      VT0.rebuilder_exprfn = expression; VT0.rebuilder_stmtfn = statement}
 
-let process = List.map set_test_poss.V0.rebuilder_top_level
+let process = List.map set_test_poss.VT0.rebuilder_rec_top_level
 
-let process_anything = set_test_poss.V0.rebuilder_anything
+let process_anything = set_test_poss.VT0.rebuilder_rec_anything
 
index ea30ec3..d98ed7b 100644 (file)
@@ -24,6 +24,7 @@ module T = Type_cocci
 module Ast = Ast_cocci
 module Ast0 = Ast0_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 
 (* Type inference:
 Just propagates information based on declarations.  Could try to infer
@@ -93,8 +94,6 @@ let rec propagate_types env =
   let option_default = None in
   let bind x y = option_default in (* no generic way of combining types *)
 
-  let mcode x = option_default in
-
   let ident r k i =
     match Ast0.unwrap i with
       Ast0.Id(id) ->
@@ -248,22 +247,20 @@ let rec propagate_types env =
              List.iter (function e -> Ast0.set_type e (Some t)) exp_list;
              Some t)
       | Ast0.NestExpr(starter,expr_dots,ender,None,multi) ->
-         let _ = r.V0.combiner_expression_dots expr_dots in None
+         let _ = r.VT0.combiner_rec_expression_dots expr_dots in None
       | Ast0.NestExpr(starter,expr_dots,ender,Some e,multi) ->
-         let _ = r.V0.combiner_expression_dots expr_dots in
-         let _ = r.V0.combiner_expression e in None
+         let _ = r.VT0.combiner_rec_expression_dots expr_dots in
+         let _ = r.VT0.combiner_rec_expression e in None
       | Ast0.Edots(_,None) | Ast0.Ecircles(_,None) | Ast0.Estars(_,None) ->
          None
       | Ast0.Edots(_,Some e) | Ast0.Ecircles(_,Some e)
       | Ast0.Estars(_,Some e) ->
-         let _ = r.V0.combiner_expression e in None
+         let _ = r.VT0.combiner_rec_expression e in None
       | Ast0.OptExp(exp) -> Ast0.get_type exp
       | Ast0.UniqueExp(exp) -> Ast0.get_type exp in
     Ast0.set_type e ty;
     ty in
 
-  let donothing r k e = k e in
-
   let rec strip id =
     match Ast0.unwrap id with
       Ast0.Id(name)              -> Id(Ast0.unwrap_mcode name)
@@ -292,7 +289,7 @@ let rec propagate_types env =
              match Ast0.unwrap decl with
                Ast0.Init(_,ty,id,_,exp,_) ->
                  let _ =
-                   (propagate_types acc).V0.combiner_initialiser exp in
+                   (propagate_types acc).VT0.combiner_rec_initialiser exp in
                  [(strip id,Ast0.ast0_type_to_type ty)]
              | Ast0.UnInit(_,ty,id,_) ->
                  [(strip id,Ast0.ast0_type_to_type ty)]
@@ -310,8 +307,8 @@ let rec propagate_types env =
        | Ast0.Dots(_,wc) ->
            (* why is this case here?  why is there none for nests? *)
            List.iter
-             (process_whencode r.V0.combiner_statement_dots
-                r.V0.combiner_statement r.V0.combiner_expression)
+             (process_whencode r.VT0.combiner_rec_statement_dots
+                r.VT0.combiner_rec_statement r.VT0.combiner_rec_expression)
              wc;
            process_statement_list r acc ss
        | Ast0.Disj(_,statement_dots_list,_,_) ->
@@ -322,7 +319,7 @@ let rec propagate_types env =
                   statement_dots_list) in
            process_statement_list r new_acc ss
        | _ ->
-           let _ = (propagate_types acc).V0.combiner_statement s in
+           let _ = (propagate_types acc).VT0.combiner_rec_statement s in
            process_statement_list r acc ss) in
 
   let statement_dots r k d =
@@ -339,7 +336,7 @@ let rec propagate_types env =
          | Ast0.OptParam(param) -> get_binding param
          | _ -> [] in
        let fenv = List.concat (List.map get_binding (Ast0.undots params)) in
-       (propagate_types (fenv@env)).V0.combiner_statement_dots body
+       (propagate_types (fenv@env)).VT0.combiner_rec_statement_dots body
     | Ast0.IfThen(_,_,exp,_,_,_) | Ast0.IfThenElse(_,_,exp,_,_,_,_,_)
     | Ast0.While(_,_,exp,_,_,_) | Ast0.Do(_,_,_,_,exp,_,_)
     | Ast0.For(_,_,_,_,Some exp,_,_,_,_,_) | Ast0.Switch(_,_,exp,_,_,_,_) ->
@@ -373,13 +370,15 @@ let rec propagate_types env =
     | Ast0.OptCase(case) -> k c in
 
   V0.combiner bind option_default
-    mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-    donothing donothing donothing statement_dots donothing donothing
-    ident expression donothing donothing donothing donothing statement
-    case_line donothing
+    {V0.combiner_functions with
+      VT0.combiner_dotsstmtfn = statement_dots;
+      VT0.combiner_identfn = ident;
+      VT0.combiner_exprfn = expression;
+      VT0.combiner_stmtfn = statement;
+      VT0.combiner_casefn = case_line}
 
 let type_infer code =
   let prop = propagate_types [(Id("NULL"),T.Pointer(T.Unknown))] in
-  let fn = prop.V0.combiner_top_level in
+  let fn = prop.VT0.combiner_rec_top_level in
   let _ = List.map fn code in
   ()
index a58ffef..4002eb9 100644 (file)
@@ -24,6 +24,7 @@
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
 module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
 
 let set_minus s minus = List.filter (function n -> not (List.mem n minus)) s
 
@@ -45,8 +46,6 @@ let plus_checker (nm,_,_,mc,_) =
 let get_free checker t =
   let bind x y = x @ y in
   let option_default = [] in
-  let donothing r k e = k e in
-  let mcode _ = option_default in
 
   (* considers a single list *)
   let collect_unitary_nonunitary free_usage =
@@ -95,14 +94,14 @@ let get_free checker t =
       Ast0.MetaErr(name,_,_) | Ast0.MetaExpr(name,_,_,_,_)
     | Ast0.MetaExprList(name,_,_) -> checker name
     | Ast0.DisjExpr(starter,expr_list,mids,ender) ->
-       detect_unitary_frees(List.map r.V0.combiner_expression expr_list)
+       detect_unitary_frees(List.map r.VT0.combiner_rec_expression expr_list)
     | _ -> k e in
 
   let typeC r k t =
     match Ast0.unwrap t with
       Ast0.MetaType(name,_) -> checker name
     | Ast0.DisjType(starter,types,mids,ender) ->
-       detect_unitary_frees(List.map r.V0.combiner_typeC types)
+       detect_unitary_frees(List.map r.VT0.combiner_rec_typeC types)
     | _ -> k t in
 
   let parameter r k p =
@@ -113,45 +112,49 @@ let get_free checker t =
   let declaration r k d =
     match Ast0.unwrap d with
       Ast0.DisjDecl(starter,decls,mids,ender) ->
-       detect_unitary_frees(List.map r.V0.combiner_declaration decls)
+       detect_unitary_frees(List.map r.VT0.combiner_rec_declaration decls)
     | _ -> k d in
 
   let statement r k s =
     match Ast0.unwrap s with
       Ast0.MetaStmt(name,_) | Ast0.MetaStmtList(name,_) -> checker name
     | Ast0.Disj(starter,stmt_list,mids,ender) ->
-       detect_unitary_frees(List.map r.V0.combiner_statement_dots stmt_list)
+       detect_unitary_frees
+         (List.map r.VT0.combiner_rec_statement_dots stmt_list)
     | Ast0.Nest(starter,stmt_dots,ender,whn,multi) ->
-       bind (r.V0.combiner_statement_dots stmt_dots)
+       bind (r.VT0.combiner_rec_statement_dots stmt_dots)
          (detect_unitary_frees
             (List.map
-               (whencode r.V0.combiner_statement_dots r.V0.combiner_statement
-                   r.V0.combiner_expression)
+               (whencode
+                  r.VT0.combiner_rec_statement_dots 
+                  r.VT0.combiner_rec_statement
+                   r.VT0.combiner_rec_expression)
                whn))
     | Ast0.Dots(d,whn) | Ast0.Circles(d,whn) | Ast0.Stars(d,whn) ->
        detect_unitary_frees
          (List.map
-            (whencode r.V0.combiner_statement_dots r.V0.combiner_statement
-               r.V0.combiner_expression)
+            (whencode
+               r.VT0.combiner_rec_statement_dots r.VT0.combiner_rec_statement
+               r.VT0.combiner_rec_expression)
             whn)
     | _ -> k s in
 
   let res = V0.combiner bind option_default
-      mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-      donothing donothing donothing donothing donothing donothing
-      ident expression typeC donothing parameter declaration statement
-      donothing donothing in
+      {V0.combiner_functions with
+       VT0.combiner_identfn = ident;
+       VT0.combiner_exprfn = expression;
+       VT0.combiner_tyfn = typeC;
+       VT0.combiner_paramfn = parameter;
+       VT0.combiner_declfn = declaration;
+       VT0.combiner_stmtfn = statement} in
 
   collect_unitary_nonunitary
-    (List.concat (List.map res.V0.combiner_top_level t))
+    (List.concat (List.map res.VT0.combiner_rec_top_level t))
 
 (* ----------------------------------------------------------------------- *)
 (* update the variables that are unitary *)
 
 let update_unitary unitary =
-  let donothing r k e = k e in
-  let mcode x = x in
-
   let is_unitary name =
     match (List.mem (Ast0.unwrap_mcode name) unitary,
           !Flag.sgrep_mode2, Ast0.get_mcode_mcodekind name) with
@@ -203,12 +206,14 @@ let update_unitary unitary =
     | _ -> k s in
 
   let res = V0.rebuilder
-      mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-      donothing donothing donothing donothing donothing donothing
-      ident expression typeC donothing parameter donothing statement
-      donothing donothing in
+      {V0.rebuilder_functions with
+       VT0.rebuilder_identfn = ident;
+       VT0.rebuilder_exprfn = expression;
+       VT0.rebuilder_tyfn = typeC;
+       VT0.rebuilder_paramfn = parameter;
+       VT0.rebuilder_stmtfn = statement} in
 
-  List.map res.V0.rebuilder_top_level
+  List.map res.VT0.rebuilder_rec_top_level
 
 (* ----------------------------------------------------------------------- *)
 
@@ -229,7 +234,8 @@ let do_unitary rules =
       [] -> ([],[])
     | (r::rules) ->
       match r with
-        Ast0.ScriptRule (a,b,c,d) ->
+        Ast0.ScriptRule (_,_,_,_)
+      | Ast0.InitialScriptRule (_,_) | Ast0.FinalScriptRule (_,_) ->
           let (x,rules) = loop rules in
           (x, r::rules)
       | Ast0.CocciRule ((minus,metavars,chosen_isos),((plus,_) as plusz),rt) ->
index 6836dda..d01dc06 100644 (file)
@@ -20,6 +20,7 @@
 *)
 
 
+module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
 
 (* --------------------------------------------------------------------- *)
dissimilarity index 81%
index 16ae0a1..2938d41 100644 (file)
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-module Ast = Ast_cocci
-module Ast0 = Ast0_cocci
-
-(* --------------------------------------------------------------------- *)
-(* Generic traversal: combiner *)
-(* parameters:
-   combining function
-   treatment of: mcode, identifiers, expressions, typeCs, types,
-   declarations, statements, toplevels
-   default value for options *)
-
-type 'a combiner =
-    {combiner_ident : Ast0.ident -> 'a;
-      combiner_expression : Ast0.expression -> 'a;
-      combiner_typeC : Ast0.typeC -> 'a;
-      combiner_declaration : Ast0.declaration -> 'a;
-      combiner_initialiser : Ast0.initialiser -> 'a;
-      combiner_initialiser_list : Ast0.initialiser_list -> 'a;
-      combiner_parameter : Ast0.parameterTypeDef -> 'a;
-      combiner_parameter_list : Ast0.parameter_list -> 'a;
-      combiner_statement : Ast0.statement -> 'a;
-      combiner_case_line : Ast0.case_line -> 'a;
-      combiner_top_level : Ast0.top_level -> 'a;
-      combiner_expression_dots :
-         Ast0.expression Ast0.dots -> 'a;
-      combiner_statement_dots :
-             Ast0.statement Ast0.dots -> 'a;
-      combiner_declaration_dots :
-                 Ast0.declaration Ast0.dots -> 'a;
-      combiner_case_line_dots :
-                 Ast0.case_line Ast0.dots -> 'a;
-      combiner_anything : Ast0.anything -> 'a}
-
-
-type ('mc,'a) cmcode = 'mc Ast0.mcode -> 'a
-type ('cd,'a) ccode = 'a combiner -> ('cd -> 'a) -> 'cd -> 'a
-
-let combiner bind option_default
-    meta_mcode string_mcode const_mcode assign_mcode fix_mcode unary_mcode
-    binary_mcode cv_mcode sign_mcode struct_mcode storage_mcode
-    inc_mcode
-    dotsexprfn dotsinitfn dotsparamfn dotsstmtfn dotsdeclfn dotscasefn
-    identfn exprfn
-    tyfn initfn paramfn declfn stmtfn casefn topfn =
-  let multibind l =
-    let rec loop = function
-       [] -> option_default
-      |        [x] -> x
-      |        x::xs -> bind x (loop xs) in
-    loop l in
-  let get_option f = function
-      Some x -> f x
-    | None -> option_default in
-  let rec expression_dots d =
-    let k d =
-      match Ast0.unwrap d with
-       Ast0.DOTS(l) | Ast0.CIRCLES(l) | Ast0.STARS(l) ->
-         multibind (List.map expression l) in
-    dotsexprfn all_functions k d
-  and initialiser_dots d =
-    let k d =
-      match Ast0.unwrap d with
-       Ast0.DOTS(l) | Ast0.CIRCLES(l) | Ast0.STARS(l) ->
-         multibind (List.map initialiser l) in
-    dotsinitfn all_functions k d
-  and parameter_dots d =
-    let k d =
-      match Ast0.unwrap d with
-       Ast0.DOTS(l) | Ast0.CIRCLES(l) | Ast0.STARS(l) ->
-         multibind (List.map parameterTypeDef l) in
-    dotsparamfn all_functions k d
-  and statement_dots d =
-    let k d =
-      match Ast0.unwrap d with
-       Ast0.DOTS(l) | Ast0.CIRCLES(l) | Ast0.STARS(l) ->
-         multibind (List.map statement l) in
-    dotsstmtfn all_functions k d
-  and declaration_dots d =
-    let k d =
-      match Ast0.unwrap d with
-       Ast0.DOTS(l) | Ast0.CIRCLES(l) | Ast0.STARS(l) ->
-         multibind (List.map declaration l) in
-    dotsdeclfn all_functions k d
-  and case_line_dots d =
-    let k d =
-      match Ast0.unwrap d with
-       Ast0.DOTS(l) | Ast0.CIRCLES(l) | Ast0.STARS(l) ->
-         multibind (List.map case_line l) in
-    dotscasefn all_functions k d
-  and ident i =
-    let k i =
-      match Ast0.unwrap i with
-       Ast0.Id(name) -> string_mcode name
-      | Ast0.MetaId(name,_,_) -> meta_mcode name
-      | Ast0.MetaFunc(name,_,_) -> meta_mcode name
-      | Ast0.MetaLocalFunc(name,_,_) -> meta_mcode name
-      | Ast0.OptIdent(id) -> ident id
-      | Ast0.UniqueIdent(id) -> ident id in
-  identfn all_functions k i
-  and expression e =
-    let k e =
-      match Ast0.unwrap e with
-       Ast0.Ident(id) -> ident id
-      | Ast0.Constant(const) -> const_mcode const
-      | Ast0.FunCall(fn,lp,args,rp) ->
-         multibind
-           [expression fn; string_mcode lp; expression_dots args;
-             string_mcode rp]
-      | Ast0.Assignment(left,op,right,_) ->
-         multibind [expression left; assign_mcode op; expression right]
-      | Ast0.CondExpr(exp1,why,exp2,colon,exp3) ->
-         multibind
-           [expression exp1; string_mcode why; get_option expression exp2;
-             string_mcode colon; expression exp3]
-      | Ast0.Postfix(exp,op) -> bind (expression exp) (fix_mcode op)
-      | Ast0.Infix(exp,op) -> bind (fix_mcode op) (expression exp)
-      | Ast0.Unary(exp,op) -> bind (unary_mcode op) (expression exp)
-      | Ast0.Binary(left,op,right) ->
-         multibind [expression left; binary_mcode op; expression right]
-      | Ast0.Nested(left,op,right) ->
-         multibind [expression left; binary_mcode op; expression right]
-      | Ast0.Paren(lp,exp,rp) ->
-         multibind [string_mcode lp; expression exp; string_mcode rp]
-      | Ast0.ArrayAccess(exp1,lb,exp2,rb) ->
-         multibind
-           [expression exp1; string_mcode lb; expression exp2;
-             string_mcode rb]
-      | Ast0.RecordAccess(exp,pt,field) ->
-         multibind [expression exp; string_mcode pt; ident field]
-      | Ast0.RecordPtAccess(exp,ar,field) ->
-         multibind [expression exp; string_mcode ar; ident field]
-      | Ast0.Cast(lp,ty,rp,exp) ->
-         multibind
-           [string_mcode lp; typeC ty; string_mcode rp; expression exp]
-      | Ast0.SizeOfExpr(szf,exp) ->
-         multibind [string_mcode szf; expression exp]
-      | Ast0.SizeOfType(szf,lp,ty,rp) ->
-         multibind
-           [string_mcode szf; string_mcode lp; typeC ty; string_mcode rp]
-      | Ast0.TypeExp(ty) -> typeC ty
-      | Ast0.MetaErr(name,_,_)
-      | Ast0.MetaExpr(name,_,_,_,_)
-      | Ast0.MetaExprList(name,_,_) -> meta_mcode name
-      | Ast0.EComma(cm) -> string_mcode cm
-      | Ast0.DisjExpr(starter,expr_list,mids,ender) ->
-         (match expr_list with
-           [] -> failwith "bad disjunction"
-         | x::xs ->
-             bind (string_mcode starter)
-               (bind (expression x)
-                  (bind
-                     (multibind
-                        (List.map2
-                           (function mid ->
-                             function x ->
-                               bind (string_mcode mid) (expression x))
-                           mids xs))
-                     (string_mcode ender))))
-      | Ast0.NestExpr(starter,expr_dots,ender,whencode,multi) ->
-         bind (string_mcode starter)
-           (bind (expression_dots expr_dots)
-              (bind (string_mcode ender) (get_option expression whencode)))
-      | Ast0.Edots(dots,whencode) | Ast0.Ecircles(dots,whencode)
-      | Ast0.Estars(dots,whencode) ->
-         bind (string_mcode dots) (get_option expression whencode)
-      | Ast0.OptExp(exp) -> expression exp
-      | Ast0.UniqueExp(exp) -> expression exp in
-    exprfn all_functions k e
-  and function_pointer (ty,lp1,star,rp1,lp2,params,rp2) extra =
-    (* have to put the treatment of the identifier into the right position *)
-    multibind
-      ([typeC ty; string_mcode lp1; string_mcode star] @ extra @
-       [string_mcode rp1;
-        string_mcode lp2; parameter_dots params; string_mcode rp2])
-  and function_type (ty,lp1,params,rp1) extra =
-    (* have to put the treatment of the identifier into the right position *)
-    multibind ([get_option typeC ty] @ extra @
-              [string_mcode lp1; parameter_dots params; string_mcode rp1])
-  and array_type (ty,lb,size,rb) extra =
-    multibind
-      ([typeC ty] @ extra @
-       [string_mcode lb; get_option expression size; string_mcode rb])
-  and typeC t =
-    let k t =
-      match Ast0.unwrap t with
-       Ast0.ConstVol(cv,ty) -> bind (cv_mcode cv) (typeC ty)
-      |        Ast0.BaseType(ty,strings) -> multibind (List.map string_mcode strings)
-      |        Ast0.Signed(sign,ty) -> bind (sign_mcode sign) (get_option typeC ty)
-      | Ast0.Pointer(ty,star) -> bind (typeC ty) (string_mcode star)
-      | Ast0.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) ->
-         function_pointer (ty,lp1,star,rp1,lp2,params,rp2) []
-      | Ast0.FunctionType(ty,lp1,params,rp1) ->
-         function_type (ty,lp1,params,rp1) []
-      | Ast0.Array(ty,lb,size,rb) ->
-         array_type (ty,lb,size,rb) []
-      | Ast0.EnumName(kind,name) -> bind (string_mcode kind) (ident name)
-      | Ast0.StructUnionName(kind,name) ->
-         bind (struct_mcode kind) (get_option ident name)
-      | Ast0.StructUnionDef(ty,lb,decls,rb) ->
-         multibind
-           [typeC ty;string_mcode lb;declaration_dots decls;string_mcode rb]
-      | Ast0.TypeName(name) -> string_mcode name
-      | Ast0.MetaType(name,_) -> meta_mcode name
-      |        Ast0.DisjType(starter,types,mids,ender) ->
-         (match types with
-           [] -> failwith "bad disjunction"
-         | x::xs ->
-             bind (string_mcode starter)
-               (bind (typeC x)
-                  (bind
-                     (multibind
-                        (List.map2
-                           (function mid ->
-                             function x ->
-                               bind (string_mcode mid) (typeC x))
-                           mids xs))
-                     (string_mcode ender))))
-      | Ast0.OptType(ty) -> typeC ty
-      | Ast0.UniqueType(ty) -> typeC ty in
-    tyfn all_functions k t
-  and named_type ty id =
-    match Ast0.unwrap ty with
-      Ast0.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) ->
-       function_pointer (ty,lp1,star,rp1,lp2,params,rp2) [ident id]
-    | Ast0.FunctionType(ty,lp1,params,rp1) ->
-       function_type (ty,lp1,params,rp1) [ident id]
-    | Ast0.Array(ty,lb,size,rb) ->
-       array_type (ty,lb,size,rb) [ident id]
-    | _ -> bind (typeC ty) (ident id)
-  and declaration d =
-    let k d =
-      match Ast0.unwrap d with
-       Ast0.Init(stg,ty,id,eq,ini,sem) ->
-         bind (get_option storage_mcode stg)
-           (bind (named_type ty id)
-              (multibind
-                 [string_mcode eq; initialiser ini; string_mcode sem]))
-      | Ast0.UnInit(stg,ty,id,sem) ->
-         bind (get_option storage_mcode stg)
-           (bind (named_type ty id) (string_mcode sem))
-      | Ast0.MacroDecl(name,lp,args,rp,sem) ->
-         multibind
-           [ident name; string_mcode lp; expression_dots args;
-             string_mcode rp; string_mcode sem]
-      | Ast0.TyDecl(ty,sem) -> bind (typeC ty) (string_mcode sem)
-      | Ast0.Typedef(stg,ty,id,sem) ->
-         bind (string_mcode stg)
-           (bind (typeC ty) (bind (typeC id) (string_mcode sem)))
-      |        Ast0.DisjDecl(starter,decls,mids,ender) ->
-         (match decls with
-           [] -> failwith "bad disjunction"
-         | x::xs ->
-             bind (string_mcode starter)
-               (bind (declaration x)
-                  (bind
-                     (multibind
-                        (List.map2
-                           (function mid ->
-                             function x ->
-                               bind (string_mcode mid) (declaration x))
-                           mids xs))
-                     (string_mcode ender))))
-      |        Ast0.Ddots(dots,whencode) ->
-         bind (string_mcode dots) (get_option declaration whencode)
-      | Ast0.OptDecl(decl) -> declaration decl
-      | Ast0.UniqueDecl(decl) -> declaration decl in
-    declfn all_functions k d
-  and initialiser i =
-    let k i =
-      match Ast0.unwrap i with
-       Ast0.MetaInit(name,_) -> meta_mcode name
-      |        Ast0.InitExpr(exp) -> expression exp
-      | Ast0.InitList(lb,initlist,rb) ->
-         multibind
-           [string_mcode lb; initialiser_dots initlist; string_mcode rb]
-      | Ast0.InitGccExt(designators,eq,ini) ->
-         multibind
-           ((List.map designator designators) @
-            [string_mcode eq; initialiser ini])
-      | Ast0.InitGccName(name,eq,ini) ->
-         multibind [ident name; string_mcode eq; initialiser ini]
-      | Ast0.IComma(cm) -> string_mcode cm
-      | Ast0.Idots(dots,whencode) ->
-         bind (string_mcode dots) (get_option initialiser whencode)
-      | Ast0.OptIni(i) -> initialiser i
-      | Ast0.UniqueIni(i) -> initialiser i in
-    initfn all_functions k i
-
-  and designator = function
-      Ast0.DesignatorField(dot,id) -> bind (string_mcode dot) (ident id)
-    | Ast0.DesignatorIndex(lb,exp,rb) ->
-       bind (string_mcode lb) (bind (expression exp) (string_mcode rb))
-    | Ast0.DesignatorRange(lb,min,dots,max,rb) ->
-       multibind
-         [string_mcode lb; expression min; string_mcode dots;
-           expression max; string_mcode rb]
-
-  and parameterTypeDef p =
-    let k p =
-      match Ast0.unwrap p with
-       Ast0.VoidParam(ty) -> typeC ty
-      | Ast0.Param(ty,Some id) -> named_type ty id
-      | Ast0.Param(ty,None) -> typeC ty
-      | Ast0.MetaParam(name,_) -> meta_mcode name
-      | Ast0.MetaParamList(name,_,_) -> meta_mcode name
-      | Ast0.PComma(cm) -> string_mcode cm
-      | Ast0.Pdots(dots) -> string_mcode dots
-      | Ast0.Pcircles(dots) -> string_mcode dots
-      | Ast0.OptParam(param) -> parameterTypeDef param
-      | Ast0.UniqueParam(param) -> parameterTypeDef param in
-    paramfn all_functions k p
-
-  (* discard the result, because the statement is assumed to be already
-     represented elsewhere in the code *)
-  and process_bef_aft s =
-    match Ast0.get_dots_bef_aft s with
-      Ast0.NoDots -> ()
-    | Ast0.DroppingBetweenDots(stm) -> let _ = statement stm in ()
-    | Ast0.AddingBetweenDots(stm) -> let _ = statement stm in ()
-
-  and statement s =
-    process_bef_aft s;
-    let k s =
-      match Ast0.unwrap s with
-       Ast0.FunDecl(_,fi,name,lp,params,rp,lbrace,body,rbrace) ->
-         multibind
-           ((List.map fninfo fi) @
-            [ident name; string_mcode lp;
-              parameter_dots params; string_mcode rp; string_mcode lbrace;
-              statement_dots body; string_mcode rbrace])
-      | Ast0.Decl(_,decl) -> declaration decl
-      | Ast0.Seq(lbrace,body,rbrace) ->
-         multibind
-           [string_mcode lbrace; statement_dots body; string_mcode rbrace]
-      | Ast0.ExprStatement(exp,sem) ->
-         bind (expression exp) (string_mcode sem)
-      | Ast0.IfThen(iff,lp,exp,rp,branch1,_) ->
-         multibind
-           [string_mcode iff; string_mcode lp; expression exp;
-             string_mcode rp; statement branch1]
-      | Ast0.IfThenElse(iff,lp,exp,rp,branch1,els,branch2,_) ->
-         multibind
-           [string_mcode iff; string_mcode lp; expression exp;
-             string_mcode rp; statement branch1; string_mcode els;
-             statement branch2]
-      | Ast0.While(whl,lp,exp,rp,body,_) ->
-         multibind
-           [string_mcode whl; string_mcode lp; expression exp;
-             string_mcode rp; statement body]
-      | Ast0.Do(d,body,whl,lp,exp,rp,sem) ->
-         multibind
-           [string_mcode d; statement body; string_mcode whl;
-             string_mcode lp; expression exp; string_mcode rp;
-             string_mcode sem]
-      | Ast0.For(fr,lp,e1,sem1,e2,sem2,e3,rp,body,_) ->
-         multibind
-           [string_mcode fr; string_mcode lp; get_option expression e1;
-             string_mcode sem1; get_option expression e2; string_mcode sem2;
-             get_option expression e3;
-             string_mcode rp; statement body]
-      | Ast0.Iterator(nm,lp,args,rp,body,_) ->
-         multibind
-           [ident nm; string_mcode lp; expression_dots args;
-             string_mcode rp; statement body]
-      |        Ast0.Switch(switch,lp,exp,rp,lb,cases,rb) ->
-         multibind
-           [string_mcode switch; string_mcode lp; expression exp;
-             string_mcode rp; string_mcode lb; case_line_dots cases;
-             string_mcode rb]
-      | Ast0.Break(br,sem) -> bind (string_mcode br) (string_mcode sem)
-      | Ast0.Continue(cont,sem) -> bind (string_mcode cont) (string_mcode sem)
-      |        Ast0.Label(l,dd) -> bind (ident l) (string_mcode dd)
-      |        Ast0.Goto(goto,l,sem) ->
-         bind (string_mcode goto) (bind (ident l) (string_mcode sem))
-      | Ast0.Return(ret,sem) -> bind (string_mcode ret) (string_mcode sem)
-      | Ast0.ReturnExpr(ret,exp,sem) ->
-         multibind [string_mcode ret; expression exp; string_mcode sem]
-      | Ast0.MetaStmt(name,_) -> meta_mcode name
-      | Ast0.MetaStmtList(name,_) -> meta_mcode name
-      | Ast0.Disj(starter,statement_dots_list,mids,ender) ->
-         (match statement_dots_list with
-           [] -> failwith "bad disjunction"
-         | x::xs ->
-             bind (string_mcode starter)
-               (bind (statement_dots x)
-                  (bind
-                     (multibind
-                        (List.map2
-                           (function mid ->
-                             function x ->
-                               bind (string_mcode mid) (statement_dots x))
-                           mids xs))
-                     (string_mcode ender))))
-      | Ast0.Nest(starter,stmt_dots,ender,whn,multi) ->
-         bind (string_mcode starter)
-           (bind (statement_dots stmt_dots)
-              (bind (string_mcode ender)
-                 (multibind
-                    (List.map (whencode statement_dots statement) whn))))
-      | Ast0.Exp(exp) -> expression exp
-      | Ast0.TopExp(exp) -> expression exp
-      | Ast0.Ty(ty) -> typeC ty
-      | Ast0.TopInit(init) -> initialiser init
-      | Ast0.Dots(d,whn) | Ast0.Circles(d,whn) | Ast0.Stars(d,whn) ->
-         bind (string_mcode d)
-           (multibind (List.map (whencode statement_dots statement) whn))
-      | Ast0.Include(inc,name) -> bind (string_mcode inc) (inc_mcode name)
-      | Ast0.Define(def,id,params,body) ->
-         multibind [string_mcode def; ident id; define_parameters params;
-                     statement_dots body]
-      | Ast0.OptStm(re) -> statement re
-      | Ast0.UniqueStm(re) -> statement re in
-    stmtfn all_functions k s
-
-  (* not parameterizable for now... *)
-  and define_parameters p =
-    let k p =
-      match Ast0.unwrap p with
-       Ast0.NoParams -> option_default
-      | Ast0.DParams(lp,params,rp) ->
-         multibind
-           [string_mcode lp; define_param_dots params; string_mcode rp] in
-    k p
-
-  and define_param_dots d =
-    let k d =
-      match Ast0.unwrap d with
-       Ast0.DOTS(l) | Ast0.CIRCLES(l) | Ast0.STARS(l) ->
-         multibind (List.map define_param l) in
-    k d
-
-  and define_param p =
-    let k p =
-      match Ast0.unwrap p with
-       Ast0.DParam(id) -> ident id
-      | Ast0.DPComma(comma) -> string_mcode comma
-      | Ast0.DPdots(d) -> string_mcode d
-      | Ast0.DPcircles(c) -> string_mcode c
-      | Ast0.OptDParam(dp) -> define_param dp
-      | Ast0.UniqueDParam(dp) -> define_param dp in
-    k p
-
-  and fninfo = function
-      Ast0.FStorage(stg) -> storage_mcode stg
-    | Ast0.FType(ty) -> typeC ty
-    | Ast0.FInline(inline) -> string_mcode inline
-    | Ast0.FAttr(init) -> string_mcode init
-
-  and whencode notfn alwaysfn = function
-      Ast0.WhenNot a -> notfn a
-    | Ast0.WhenAlways a -> alwaysfn a
-    | Ast0.WhenModifier(_) -> option_default
-    | Ast0.WhenNotTrue(e) -> expression e
-    | Ast0.WhenNotFalse(e) -> expression e
-
-  and case_line c =
-    let k c =
-      match Ast0.unwrap c with
-       Ast0.Default(def,colon,code) ->
-         multibind [string_mcode def;string_mcode colon;statement_dots code]
-      | Ast0.Case(case,exp,colon,code) ->
-         multibind [string_mcode case;expression exp;string_mcode colon;
-                     statement_dots code]
-      |        Ast0.OptCase(case) -> case_line case in
-    casefn all_functions k c
-
-  and anything a = (* for compile_iso, not parameterisable *)
-    let k = function
-       Ast0.DotsExprTag(exprs) -> expression_dots exprs
-      | Ast0.DotsInitTag(inits) -> initialiser_dots inits
-      | Ast0.DotsParamTag(params) -> parameter_dots params
-      | Ast0.DotsStmtTag(stmts) -> statement_dots stmts
-      | Ast0.DotsDeclTag(decls) -> declaration_dots decls
-      | Ast0.DotsCaseTag(cases) -> case_line_dots cases
-      | Ast0.IdentTag(id) -> ident id
-      | Ast0.ExprTag(exp) -> expression exp
-      | Ast0.ArgExprTag(exp) -> expression exp
-      | Ast0.TestExprTag(exp) -> expression exp
-      | Ast0.TypeCTag(ty) -> typeC ty
-      | Ast0.ParamTag(param) -> parameterTypeDef param
-      | Ast0.InitTag(init) -> initialiser init
-      | Ast0.DeclTag(decl) -> declaration decl
-      | Ast0.StmtTag(stmt) -> statement stmt
-      | Ast0.CaseLineTag(c) -> case_line c
-      | Ast0.TopTag(top) -> top_level top
-      | Ast0.IsoWhenTag(_) -> option_default
-      | Ast0.IsoWhenTTag(e) -> expression e
-      | Ast0.IsoWhenFTag(e) -> expression e
-      |        Ast0.MetaPosTag(var) -> failwith "not supported" in
-    k a
-
-  and top_level t =
-    let k t =
-      match Ast0.unwrap t with
-       Ast0.FILEINFO(old_file,new_file) ->
-         bind (string_mcode old_file) (string_mcode new_file)
-      | Ast0.DECL(stmt_dots) -> statement stmt_dots
-      | Ast0.CODE(stmt_dots) -> statement_dots stmt_dots
-      | Ast0.ERRORWORDS(exps) -> multibind (List.map expression exps)
-      | Ast0.OTHER(_) -> failwith "unexpected code" in
-    topfn all_functions k t
-  and all_functions =
-    {combiner_ident = ident;
-      combiner_expression = expression;
-      combiner_typeC = typeC;
-      combiner_declaration = declaration;
-      combiner_initialiser = initialiser;
-      combiner_initialiser_list = initialiser_dots;
-      combiner_parameter = parameterTypeDef;
-      combiner_parameter_list = parameter_dots;
-      combiner_statement = statement;
-      combiner_case_line = case_line;
-      combiner_top_level = top_level;
-      combiner_expression_dots = expression_dots;
-      combiner_statement_dots = statement_dots;
-      combiner_declaration_dots = declaration_dots;
-      combiner_case_line_dots = case_line_dots;
-      combiner_anything = anything} in
-  all_functions
-
-(* --------------------------------------------------------------------- *)
-(* Generic traversal: rebuilder *)
-
-type 'a inout = 'a -> 'a (* for specifying the type of rebuilder *)
-
-type rebuilder =
-    {rebuilder_ident : Ast0.ident inout;
-      rebuilder_expression : Ast0.expression inout;
-      rebuilder_typeC : Ast0.typeC inout;
-      rebuilder_declaration : Ast0.declaration inout;
-      rebuilder_initialiser : Ast0.initialiser inout;
-      rebuilder_initialiser_list : Ast0.initialiser_list inout;
-      rebuilder_parameter : Ast0.parameterTypeDef inout;
-      rebuilder_parameter_list : Ast0.parameter_list inout;
-      rebuilder_statement : Ast0.statement inout;
-      rebuilder_case_line : Ast0.case_line inout;
-      rebuilder_top_level : Ast0.top_level inout;
-      rebuilder_expression_dots :
-       Ast0.expression Ast0.dots ->
-         Ast0.expression Ast0.dots;
-         rebuilder_statement_dots :
-           Ast0.statement Ast0.dots ->
-             Ast0.statement Ast0.dots;
-         rebuilder_declaration_dots :
-           Ast0.declaration Ast0.dots ->
-             Ast0.declaration Ast0.dots;
-         rebuilder_case_line_dots :
-           Ast0.case_line Ast0.dots ->
-             Ast0.case_line Ast0.dots;
-         rebuilder_anything :
-           Ast0.anything -> Ast0.anything}
-
-type 'mc rmcode = 'mc Ast0.mcode inout
-type 'cd rcode = rebuilder -> ('cd inout) -> 'cd inout
-
-let rebuilder = fun
-    meta_mcode string_mcode const_mcode assign_mcode fix_mcode unary_mcode
-    binary_mcode cv_mcode sign_mcode struct_mcode storage_mcode
-    inc_mcode
-    dotsexprfn dotsinitfn dotsparamfn dotsstmtfn dotsdeclfn dotscasefn
-    identfn exprfn tyfn initfn paramfn declfn stmtfn casefn topfn ->
-  let get_option f = function
-      Some x -> Some (f x)
-    | None -> None in
-  let rec expression_dots d =
-    let k d =
-      Ast0.rewrap d
-       (match Ast0.unwrap d with
-         Ast0.DOTS(l) -> Ast0.DOTS(List.map expression l)
-       | Ast0.CIRCLES(l) -> Ast0.CIRCLES(List.map expression l)
-       | Ast0.STARS(l) -> Ast0.STARS(List.map expression l)) in
-    dotsexprfn all_functions k d
-  and initialiser_list i =
-    let k i =
-      Ast0.rewrap i
-       (match Ast0.unwrap i with
-         Ast0.DOTS(l) -> Ast0.DOTS(List.map initialiser l)
-       | Ast0.CIRCLES(l) -> Ast0.CIRCLES(List.map initialiser l)
-       | Ast0.STARS(l) -> Ast0.STARS(List.map initialiser l)) in
-    dotsinitfn all_functions k i
-  and parameter_list d =
-    let k d =
-      Ast0.rewrap d
-       (match Ast0.unwrap d with
-         Ast0.DOTS(l) -> Ast0.DOTS(List.map parameterTypeDef l)
-       | Ast0.CIRCLES(l) -> Ast0.CIRCLES(List.map parameterTypeDef l)
-       | Ast0.STARS(l) -> Ast0.STARS(List.map parameterTypeDef l)) in
-    dotsparamfn all_functions k d
-  and statement_dots d =
-    let k d =
-      Ast0.rewrap d
-       (match Ast0.unwrap d with
-         Ast0.DOTS(l) -> Ast0.DOTS(List.map statement l)
-       | Ast0.CIRCLES(l) -> Ast0.CIRCLES(List.map statement l)
-       | Ast0.STARS(l) -> Ast0.STARS(List.map statement l)) in
-    dotsstmtfn all_functions k d
-  and declaration_dots d =
-    let k d =
-      Ast0.rewrap d
-       (match Ast0.unwrap d with
-         Ast0.DOTS(l) -> Ast0.DOTS(List.map declaration l)
-       | Ast0.CIRCLES(l) -> Ast0.CIRCLES(List.map declaration l)
-       | Ast0.STARS(l) -> Ast0.STARS(List.map declaration l)) in
-    dotsdeclfn all_functions k d
-  and case_line_dots d =
-    let k d =
-      Ast0.rewrap d
-       (match Ast0.unwrap d with
-         Ast0.DOTS(l) -> Ast0.DOTS(List.map case_line l)
-       | Ast0.CIRCLES(l) -> Ast0.CIRCLES(List.map case_line l)
-       | Ast0.STARS(l) -> Ast0.STARS(List.map case_line l)) in
-    dotscasefn all_functions k d
-  and ident i =
-    let k i =
-      Ast0.rewrap i
-       (match Ast0.unwrap i with
-         Ast0.Id(name) -> Ast0.Id(string_mcode name)
-       | Ast0.MetaId(name,constraints,pure) ->
-           Ast0.MetaId(meta_mcode name,constraints,pure)
-       | Ast0.MetaFunc(name,constraints,pure) ->
-           Ast0.MetaFunc(meta_mcode name,constraints,pure)
-       | Ast0.MetaLocalFunc(name,constraints,pure) ->
-           Ast0.MetaLocalFunc(meta_mcode name,constraints,pure)
-       | Ast0.OptIdent(id) -> Ast0.OptIdent(ident id)
-       | Ast0.UniqueIdent(id) -> Ast0.UniqueIdent(ident id)) in
-    identfn all_functions k i
-  and expression e =
-    let k e =
-      Ast0.rewrap e
-       (match Ast0.unwrap e with
-         Ast0.Ident(id) -> Ast0.Ident(ident id)
-       | Ast0.Constant(const) -> Ast0.Constant(const_mcode const)
-       | Ast0.FunCall(fn,lp,args,rp) ->
-           Ast0.FunCall(expression fn,string_mcode lp,expression_dots args,
-                        string_mcode rp)
-       | Ast0.Assignment(left,op,right,simple) ->
-           Ast0.Assignment(expression left,assign_mcode op,expression right,
-                           simple)
-       | Ast0.CondExpr(exp1,why,exp2,colon,exp3) ->
-           Ast0.CondExpr(expression exp1, string_mcode why,
-                         get_option expression exp2, string_mcode colon,
-                         expression exp3)
-       | Ast0.Postfix(exp,op) -> Ast0.Postfix(expression exp, fix_mcode op)
-       | Ast0.Infix(exp,op) -> Ast0.Infix(expression exp, fix_mcode op)
-       | Ast0.Unary(exp,op) -> Ast0.Unary(expression exp, unary_mcode op)
-       | Ast0.Binary(left,op,right) ->
-           Ast0.Binary(expression left, binary_mcode op, expression right)
-       | Ast0.Nested(left,op,right) ->
-           Ast0.Nested(expression left, binary_mcode op, expression right)
-       | Ast0.Paren(lp,exp,rp) ->
-           Ast0.Paren(string_mcode lp, expression exp, string_mcode rp)
-       | Ast0.ArrayAccess(exp1,lb,exp2,rb) ->
-           Ast0.ArrayAccess(expression exp1,string_mcode lb,expression exp2,
-                            string_mcode rb)
-       | Ast0.RecordAccess(exp,pt,field) ->
-           Ast0.RecordAccess(expression exp, string_mcode pt, ident field)
-       | Ast0.RecordPtAccess(exp,ar,field) ->
-           Ast0.RecordPtAccess(expression exp, string_mcode ar, ident field)
-       | Ast0.Cast(lp,ty,rp,exp) ->
-           Ast0.Cast(string_mcode lp, typeC ty, string_mcode rp,
-                     expression exp)
-       | Ast0.SizeOfExpr(szf,exp) ->
-           Ast0.SizeOfExpr(string_mcode szf, expression exp)
-       | Ast0.SizeOfType(szf,lp,ty,rp) ->
-           Ast0.SizeOfType(string_mcode szf,string_mcode lp, typeC ty,
-                            string_mcode rp)
-       | Ast0.TypeExp(ty) -> Ast0.TypeExp(typeC ty)
-       | Ast0.MetaErr(name,constraints,pure) ->
-           Ast0.MetaErr(meta_mcode name,constraints,pure)
-       | Ast0.MetaExpr(name,constraints,ty,form,pure) ->
-           Ast0.MetaExpr(meta_mcode name,constraints,ty,form,pure)
-       | Ast0.MetaExprList(name,lenname,pure) ->
-           Ast0.MetaExprList(meta_mcode name,lenname,pure)
-       | Ast0.EComma(cm) -> Ast0.EComma(string_mcode cm)
-       | Ast0.DisjExpr(starter,expr_list,mids,ender) ->
-           Ast0.DisjExpr(string_mcode starter,List.map expression expr_list,
-                         List.map string_mcode mids,string_mcode ender)
-       | Ast0.NestExpr(starter,expr_dots,ender,whencode,multi) ->
-           Ast0.NestExpr(string_mcode starter,expression_dots expr_dots,
-                         string_mcode ender, get_option expression whencode,
-                         multi)
-       | Ast0.Edots(dots,whencode) ->
-           Ast0.Edots(string_mcode dots, get_option expression whencode)
-       | Ast0.Ecircles(dots,whencode) ->
-           Ast0.Ecircles(string_mcode dots, get_option expression whencode)
-       | Ast0.Estars(dots,whencode) ->
-           Ast0.Estars(string_mcode dots, get_option expression whencode)
-       | Ast0.OptExp(exp) -> Ast0.OptExp(expression exp)
-       | Ast0.UniqueExp(exp) -> Ast0.UniqueExp(expression exp)) in
-    exprfn all_functions k e
-  and typeC t =
-    let k t =
-      Ast0.rewrap t
-       (match Ast0.unwrap t with
-         Ast0.ConstVol(cv,ty) -> Ast0.ConstVol(cv_mcode cv,typeC ty)
-       | Ast0.BaseType(ty,strings) ->
-           Ast0.BaseType(ty, List.map string_mcode strings)
-       | Ast0.Signed(sign,ty) ->
-           Ast0.Signed(sign_mcode sign,get_option typeC ty)
-       | Ast0.Pointer(ty,star) ->
-           Ast0.Pointer(typeC ty, string_mcode star)
-       | Ast0.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) ->
-           Ast0.FunctionPointer(typeC ty,string_mcode lp1,string_mcode star,
-                                string_mcode rp1,string_mcode lp2,
-                                parameter_list params,
-                                string_mcode rp2)
-       | Ast0.FunctionType(ty,lp1,params,rp1) ->
-           Ast0.FunctionType(get_option typeC ty,
-                             string_mcode lp1,parameter_list params,
-                             string_mcode rp1)
-       | Ast0.Array(ty,lb,size,rb) ->
-           Ast0.Array(typeC ty, string_mcode lb,
-                      get_option expression size, string_mcode rb)
-       | Ast0.EnumName(kind,name) ->
-           Ast0.EnumName(string_mcode kind, ident name)
-       | Ast0.StructUnionName(kind,name) ->
-           Ast0.StructUnionName (struct_mcode kind, get_option ident name)
-       | Ast0.StructUnionDef(ty,lb,decls,rb) ->
-           Ast0.StructUnionDef (typeC ty,
-                                string_mcode lb, declaration_dots decls,
-                                string_mcode rb)
-       | Ast0.TypeName(name) -> Ast0.TypeName(string_mcode name)
-       | Ast0.MetaType(name,pure) ->
-           Ast0.MetaType(meta_mcode name,pure)
-       | Ast0.DisjType(starter,types,mids,ender) ->
-           Ast0.DisjType(string_mcode starter,List.map typeC types,
-                         List.map string_mcode mids,string_mcode ender)
-       | Ast0.OptType(ty) -> Ast0.OptType(typeC ty)
-       | Ast0.UniqueType(ty) -> Ast0.UniqueType(typeC ty)) in
-    tyfn all_functions k t
-  and declaration d =
-    let k d =
-      Ast0.rewrap d
-       (match Ast0.unwrap d with
-         Ast0.Init(stg,ty,id,eq,ini,sem) ->
-           Ast0.Init(get_option storage_mcode stg,
-                     typeC ty, ident id, string_mcode eq, initialiser ini,
-                     string_mcode sem)
-       | Ast0.UnInit(stg,ty,id,sem) ->
-           Ast0.UnInit(get_option storage_mcode stg,
-                       typeC ty, ident id, string_mcode sem)
-       | Ast0.MacroDecl(name,lp,args,rp,sem) ->
-           Ast0.MacroDecl(ident name,string_mcode lp,
-                          expression_dots args,
-                          string_mcode rp,string_mcode sem)
-       | Ast0.TyDecl(ty,sem) -> Ast0.TyDecl(typeC ty, string_mcode sem)
-       | Ast0.Typedef(stg,ty,id,sem) ->
-           Ast0.Typedef(string_mcode stg, typeC ty, typeC id,
-                        string_mcode sem)
-       | Ast0.DisjDecl(starter,decls,mids,ender) ->
-           Ast0.DisjDecl(string_mcode starter,List.map declaration decls,
-                         List.map string_mcode mids,string_mcode ender)
-       | Ast0.Ddots(dots,whencode) ->
-           Ast0.Ddots(string_mcode dots, get_option declaration whencode)
-       | Ast0.OptDecl(decl) -> Ast0.OptDecl(declaration decl)
-       | Ast0.UniqueDecl(decl) -> Ast0.UniqueDecl(declaration decl)) in
-    declfn all_functions k d
-  and initialiser i =
-    let k i =
-      Ast0.rewrap i
-       (match Ast0.unwrap i with
-         Ast0.MetaInit(name,pure) ->
-           Ast0.MetaInit(meta_mcode name,pure)
-       | Ast0.InitExpr(exp) -> Ast0.InitExpr(expression exp)
-       | Ast0.InitList(lb,initlist,rb) ->
-           Ast0.InitList(string_mcode lb, initialiser_list initlist,
-                         string_mcode rb)
-       | Ast0.InitGccExt(designators,eq,ini) ->
-           Ast0.InitGccExt
-             (List.map designator designators, string_mcode eq,
-              initialiser ini)
-       | Ast0.InitGccName(name,eq,ini) ->
-           Ast0.InitGccName(ident name, string_mcode eq, initialiser ini)
-       | Ast0.IComma(cm) -> Ast0.IComma(string_mcode cm)
-       | Ast0.Idots(d,whencode) ->
-           Ast0.Idots(string_mcode d, get_option initialiser whencode)
-       | Ast0.OptIni(i) -> Ast0.OptIni(initialiser i)
-       | Ast0.UniqueIni(i) -> Ast0.UniqueIni(initialiser i)) in
-    initfn all_functions k i
-
-  and designator = function
-      Ast0.DesignatorField(dot,id) ->
-       Ast0.DesignatorField(string_mcode dot,ident id)
-    | Ast0.DesignatorIndex(lb,exp,rb) ->
-       Ast0.DesignatorIndex(string_mcode lb,expression exp,string_mcode rb)
-    | Ast0.DesignatorRange(lb,min,dots,max,rb) ->
-       Ast0.DesignatorRange(string_mcode lb,expression min,string_mcode dots,
-                            expression max,string_mcode rb)
-
-  and parameterTypeDef p =
-    let k p =
-      Ast0.rewrap p
-       (match Ast0.unwrap p with
-         Ast0.VoidParam(ty) -> Ast0.VoidParam(typeC ty)
-       | Ast0.Param(ty,id) -> Ast0.Param(typeC ty, get_option ident id)
-       | Ast0.MetaParam(name,pure) ->
-           Ast0.MetaParam(meta_mcode name,pure)
-       | Ast0.MetaParamList(name,lenname,pure) ->
-           Ast0.MetaParamList(meta_mcode name,lenname,pure)
-       | Ast0.PComma(cm) -> Ast0.PComma(string_mcode cm)
-       | Ast0.Pdots(dots) -> Ast0.Pdots(string_mcode dots)
-       | Ast0.Pcircles(dots) -> Ast0.Pcircles(string_mcode dots)
-       | Ast0.OptParam(param) -> Ast0.OptParam(parameterTypeDef param)
-       | Ast0.UniqueParam(param) ->
-           Ast0.UniqueParam(parameterTypeDef param)) in
-    paramfn all_functions k p
-  (* not done for combiner, because the statement is assumed to be already
-     represented elsewhere in the code *)
-  and process_bef_aft s =
-    Ast0.set_dots_bef_aft s
-      (match Ast0.get_dots_bef_aft s with
-       Ast0.NoDots -> Ast0.NoDots
-      | Ast0.DroppingBetweenDots(stm) ->
-         Ast0.DroppingBetweenDots(statement stm)
-      | Ast0.AddingBetweenDots(stm) ->
-         Ast0.AddingBetweenDots(statement stm))
-
-  and statement s =
-    let k s =
-      Ast0.rewrap s
-       (match Ast0.unwrap s with
-         Ast0.FunDecl(bef,fi,name,lp,params,rp,lbrace,body,rbrace) ->
-           Ast0.FunDecl(bef,List.map fninfo fi, ident name,
-                        string_mcode lp, parameter_list params,
-                        string_mcode rp, string_mcode lbrace,
-                        statement_dots body, string_mcode rbrace)
-       | Ast0.Decl(bef,decl) -> Ast0.Decl(bef,declaration decl)
-       | Ast0.Seq(lbrace,body,rbrace) ->
-           Ast0.Seq(string_mcode lbrace, statement_dots body,
-                    string_mcode rbrace)
-       | Ast0.ExprStatement(exp,sem) ->
-           Ast0.ExprStatement(expression exp, string_mcode sem)
-       | Ast0.IfThen(iff,lp,exp,rp,branch1,aft) ->
-           Ast0.IfThen(string_mcode iff, string_mcode lp, expression exp,
-             string_mcode rp, statement branch1,aft)
-       | Ast0.IfThenElse(iff,lp,exp,rp,branch1,els,branch2,aft) ->
-           Ast0.IfThenElse(string_mcode iff,string_mcode lp,expression exp,
-             string_mcode rp, statement branch1, string_mcode els,
-             statement branch2,aft)
-       | Ast0.While(whl,lp,exp,rp,body,aft) ->
-           Ast0.While(string_mcode whl, string_mcode lp, expression exp,
-                      string_mcode rp, statement body, aft)
-       | Ast0.Do(d,body,whl,lp,exp,rp,sem) ->
-           Ast0.Do(string_mcode d, statement body, string_mcode whl,
-                   string_mcode lp, expression exp, string_mcode rp,
-                   string_mcode sem)
-       | Ast0.For(fr,lp,e1,sem1,e2,sem2,e3,rp,body,aft) ->
-           Ast0.For(string_mcode fr, string_mcode lp,
-                    get_option expression e1, string_mcode sem1,
-                    get_option expression e2, string_mcode sem2,
-                    get_option expression e3,
-                    string_mcode rp, statement body, aft)
-       | Ast0.Iterator(nm,lp,args,rp,body,aft) ->
-           Ast0.Iterator(ident nm, string_mcode lp,
-                         expression_dots args,
-                         string_mcode rp, statement body, aft)
-       | Ast0.Switch(switch,lp,exp,rp,lb,cases,rb) ->
-           Ast0.Switch(string_mcode switch,string_mcode lp,expression exp,
-                       string_mcode rp,string_mcode lb,
-                       case_line_dots cases, string_mcode rb)
-       | Ast0.Break(br,sem) ->
-           Ast0.Break(string_mcode br,string_mcode sem)
-       | Ast0.Continue(cont,sem) ->
-           Ast0.Continue(string_mcode cont,string_mcode sem)
-       | Ast0.Label(l,dd) -> Ast0.Label(ident l,string_mcode dd)
-       | Ast0.Goto(goto,l,sem) ->
-           Ast0.Goto(string_mcode goto,ident l,string_mcode sem)
-       | Ast0.Return(ret,sem) ->
-           Ast0.Return(string_mcode ret,string_mcode sem)
-       | Ast0.ReturnExpr(ret,exp,sem) ->
-           Ast0.ReturnExpr(string_mcode ret,expression exp,string_mcode sem)
-       | Ast0.MetaStmt(name,pure) ->
-           Ast0.MetaStmt(meta_mcode name,pure)
-       | Ast0.MetaStmtList(name,pure) ->
-           Ast0.MetaStmtList(meta_mcode name,pure)
-       | Ast0.Disj(starter,statement_dots_list,mids,ender) ->
-           Ast0.Disj(string_mcode starter,
-                     List.map statement_dots statement_dots_list,
-                     List.map string_mcode mids,
-                     string_mcode ender)
-       | Ast0.Nest(starter,stmt_dots,ender,whn,multi) ->
-           Ast0.Nest(string_mcode starter,statement_dots stmt_dots,
-                     string_mcode ender,
-                     List.map (whencode statement_dots statement) whn,
-                     multi)
-       | Ast0.Exp(exp) -> Ast0.Exp(expression exp)
-       | Ast0.TopExp(exp) -> Ast0.TopExp(expression exp)
-       | Ast0.Ty(ty) -> Ast0.Ty(typeC ty)
-       | Ast0.TopInit(init) -> Ast0.TopInit(initialiser init)
-       | Ast0.Dots(d,whn) ->
-           Ast0.Dots(string_mcode d,
-                     List.map (whencode statement_dots statement) whn)
-       | Ast0.Circles(d,whn) ->
-           Ast0.Circles(string_mcode d,
-                        List.map (whencode statement_dots statement) whn)
-       | Ast0.Stars(d,whn) ->
-           Ast0.Stars(string_mcode d,
-                      List.map (whencode statement_dots statement) whn)
-       | Ast0.Include(inc,name) ->
-           Ast0.Include(string_mcode inc,inc_mcode name)
-       | Ast0.Define(def,id,params,body) ->
-           Ast0.Define(string_mcode def,ident id,
-                       define_parameters params,
-                       statement_dots body)
-       | Ast0.OptStm(re) -> Ast0.OptStm(statement re)
-       | Ast0.UniqueStm(re) -> Ast0.UniqueStm(statement re)) in
-    let s = stmtfn all_functions k s in
-    process_bef_aft s
-
-  (* not parameterizable for now... *)
-  and define_parameters p =
-    let k p =
-      Ast0.rewrap p
-       (match Ast0.unwrap p with
-         Ast0.NoParams -> Ast0.NoParams
-       | Ast0.DParams(lp,params,rp) ->
-           Ast0.DParams(string_mcode lp,define_param_dots params,
-                        string_mcode rp))in
-    k p
-
-  and define_param_dots d =
-    let k d =
-      Ast0.rewrap d
-       (match Ast0.unwrap d with
-         Ast0.DOTS(l) -> Ast0.DOTS(List.map define_param l)
-       | Ast0.CIRCLES(l) -> Ast0.CIRCLES(List.map define_param l)
-       | Ast0.STARS(l) -> Ast0.STARS(List.map define_param l)) in
-    k d
-
-  and define_param p =
-    let k p =
-      Ast0.rewrap p
-       (match Ast0.unwrap p with
-         Ast0.DParam(id) -> Ast0.DParam(ident id)
-       | Ast0.DPComma(comma) -> Ast0.DPComma(string_mcode comma)
-       | Ast0.DPdots(d) -> Ast0.DPdots(string_mcode d)
-       | Ast0.DPcircles(c) -> Ast0.DPcircles(string_mcode c)
-       | Ast0.OptDParam(dp) -> Ast0.OptDParam(define_param dp)
-       | Ast0.UniqueDParam(dp) -> Ast0.UniqueDParam(define_param dp)) in
-    k p
-
-  and fninfo = function
-      Ast0.FStorage(stg) -> Ast0.FStorage(storage_mcode stg)
-    | Ast0.FType(ty) -> Ast0.FType(typeC ty)
-    | Ast0.FInline(inline) -> Ast0.FInline(string_mcode inline)
-    | Ast0.FAttr(init) -> Ast0.FAttr(string_mcode init)
-
-  and whencode notfn alwaysfn = function
-      Ast0.WhenNot a -> Ast0.WhenNot (notfn a)
-    | Ast0.WhenAlways a -> Ast0.WhenAlways (alwaysfn a)
-    | Ast0.WhenModifier(x) -> Ast0.WhenModifier(x)
-    | Ast0.WhenNotTrue(e) -> Ast0.WhenNotTrue(expression e)
-    | Ast0.WhenNotFalse(e) -> Ast0.WhenNotFalse(expression e)
-
-  and case_line c =
-    let k c =
-      Ast0.rewrap c
-       (match Ast0.unwrap c with
-         Ast0.Default(def,colon,code) ->
-           Ast0.Default(string_mcode def,string_mcode colon,
-                        statement_dots code)
-       | Ast0.Case(case,exp,colon,code) ->
-           Ast0.Case(string_mcode case,expression exp,string_mcode colon,
-                     statement_dots code)
-       | Ast0.OptCase(case) -> Ast0.OptCase(case_line case)) in
-    casefn all_functions k c
-
-  and top_level t =
-    let k t =
-      Ast0.rewrap t
-       (match Ast0.unwrap t with
-         Ast0.FILEINFO(old_file,new_file) ->
-           Ast0.FILEINFO(string_mcode old_file, string_mcode new_file)
-       | Ast0.DECL(statement_dots) ->
-           Ast0.DECL(statement statement_dots)
-       | Ast0.CODE(stmt_dots) -> Ast0.CODE(statement_dots stmt_dots)
-       | Ast0.ERRORWORDS(exps) -> Ast0.ERRORWORDS(List.map expression exps)
-       | Ast0.OTHER(_) -> failwith "unexpected code") in
-    topfn all_functions k t
-
-  and anything a = (* for compile_iso, not parameterisable *)
-    let k = function
-       Ast0.DotsExprTag(exprs) -> Ast0.DotsExprTag(expression_dots exprs)
-      | Ast0.DotsInitTag(inits) -> Ast0.DotsInitTag(initialiser_list inits)
-      | Ast0.DotsParamTag(params) -> Ast0.DotsParamTag(parameter_list params)
-      | Ast0.DotsStmtTag(stmts) -> Ast0.DotsStmtTag(statement_dots stmts)
-      | Ast0.DotsDeclTag(decls) -> Ast0.DotsDeclTag(declaration_dots decls)
-      | Ast0.DotsCaseTag(cases) -> Ast0.DotsCaseTag(case_line_dots cases)
-      | Ast0.IdentTag(id) -> Ast0.IdentTag(ident id)
-      | Ast0.ExprTag(exp) -> Ast0.ExprTag(expression exp)
-      | Ast0.ArgExprTag(exp) -> Ast0.ArgExprTag(expression exp)
-      | Ast0.TestExprTag(exp) -> Ast0.TestExprTag(expression exp)
-      | Ast0.TypeCTag(ty) -> Ast0.TypeCTag(typeC ty)
-      | Ast0.ParamTag(param) -> Ast0.ParamTag(parameterTypeDef param)
-      | Ast0.InitTag(init) -> Ast0.InitTag(initialiser init)
-      | Ast0.DeclTag(decl) -> Ast0.DeclTag(declaration decl)
-      | Ast0.StmtTag(stmt) -> Ast0.StmtTag(statement stmt)
-      | Ast0.CaseLineTag(c) -> Ast0.CaseLineTag(case_line c)
-      | Ast0.TopTag(top) -> Ast0.TopTag(top_level top)
-      | Ast0.IsoWhenTag(x) -> Ast0.IsoWhenTag(x)
-      | Ast0.IsoWhenTTag(e) -> Ast0.IsoWhenTTag(expression e)
-      | Ast0.IsoWhenFTag(e) -> Ast0.IsoWhenFTag(expression e)
-      |        Ast0.MetaPosTag(var) -> failwith "not supported" in
-    k a
-
-  (* not done for combiner, because the statement is assumed to be already
-     represented elsewhere in the code *)
-
-  and all_functions =
-    {rebuilder_ident = ident;
-      rebuilder_expression = expression;
-      rebuilder_typeC = typeC;
-      rebuilder_declaration = declaration;
-      rebuilder_initialiser = initialiser;
-      rebuilder_initialiser_list = initialiser_list;
-      rebuilder_parameter = parameterTypeDef;
-      rebuilder_parameter_list = parameter_list;
-      rebuilder_statement = statement;
-      rebuilder_case_line = case_line;
-      rebuilder_top_level = top_level;
-      rebuilder_expression_dots = expression_dots;
-      rebuilder_statement_dots = statement_dots;
-      rebuilder_declaration_dots = declaration_dots;
-      rebuilder_case_line_dots = case_line_dots;
-      rebuilder_anything = anything} in
-  all_functions
+(*
+* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
+* This file is part of Coccinelle.
+* 
+* Coccinelle is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, according to version 2 of the License.
+* 
+* Coccinelle is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+* 
+* You should have received a copy of the GNU General Public License
+* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+* 
+* The authors reserve the right to distribute this or future versions of
+* Coccinelle under other licenses.
+*)
+
+
+(* --------------------------------------------------------------------- *)
+(* Generic traversal: rebuilder *)
+
+module Ast = Ast_cocci
+module Ast0 = Ast0_cocci
+module VT0 = Visitor_ast0_types
+
+type mode = COMBINER | REBUILDER | BOTH
+
+let map_split f l = List.split(List.map f l)
+
+let rewrap x (n,e) = (n,Ast0.rewrap x e)
+
+let visitor mode bind option_default
+    meta_mcode string_mcode const_mcode assign_mcode fix_mcode unary_mcode
+    binary_mcode cv_mcode sign_mcode struct_mcode storage_mcode
+    inc_mcode
+    dotsexprfn dotsinitfn dotsparamfn dotsstmtfn dotsdeclfn dotscasefn
+    identfn exprfn tyfn initfn paramfn declfn stmtfn casefn topfn =
+  let multibind l =
+    let rec loop = function
+       [] -> option_default
+      |        [x] -> x
+      |        x::xs -> bind x (loop xs) in
+    loop l in
+  let map_split_bind f l =
+    let (n,e) = List.split(List.map f l) in (multibind n,e) in
+  let get_option f = function
+      Some x -> let (n,e) = f x in (n,Some e)
+    | None -> (option_default,None) in
+  let rec expression_dots d =
+    let k d =
+      rewrap d
+       (match Ast0.unwrap d with
+         Ast0.DOTS(l) ->
+           let (n,l) = map_split_bind expression l in (n,Ast0.DOTS(l))
+       | Ast0.CIRCLES(l) ->
+           let (n,l) = map_split_bind expression l in (n,Ast0.CIRCLES(l))
+       | Ast0.STARS(l) ->
+           let (n,l) = map_split_bind expression l in (n,Ast0.STARS(l))) in
+    dotsexprfn all_functions k d
+  and initialiser_list i =
+    let k i =
+      rewrap i
+       (match Ast0.unwrap i with
+         Ast0.DOTS(l) ->
+           let (n,l) = map_split_bind initialiser l in (n,Ast0.DOTS(l))
+       | Ast0.CIRCLES(l) ->
+           let (n,l) = map_split_bind initialiser l in (n,Ast0.CIRCLES(l))
+       | Ast0.STARS(l) ->
+           let (n,l) = map_split_bind initialiser l in (n,Ast0.STARS(l))) in
+    dotsinitfn all_functions k i
+
+  and parameter_list d =
+    let k d =
+      rewrap d
+       (match Ast0.unwrap d with
+         Ast0.DOTS(l) ->
+           let (n,l) = map_split_bind parameterTypeDef l in
+           (n,Ast0.DOTS(l))
+       | Ast0.CIRCLES(l) ->
+           let (n,l) = map_split_bind parameterTypeDef l in
+           (n,Ast0.CIRCLES(l))
+       | Ast0.STARS(l) ->
+           let (n,l) = map_split_bind parameterTypeDef l in
+           (n,Ast0.STARS(l))) in
+    dotsparamfn all_functions k d
+
+  and statement_dots d =
+    let k d =
+      rewrap d
+       (match Ast0.unwrap d with
+         Ast0.DOTS(l) ->
+           let (n,l) = map_split_bind statement l in (n,Ast0.DOTS(l))
+       | Ast0.CIRCLES(l) ->
+           let (n,l) = map_split_bind statement l in (n,Ast0.CIRCLES(l))
+       | Ast0.STARS(l) ->
+           let (n,l) = map_split_bind statement l in (n,Ast0.STARS(l))) in
+    dotsstmtfn all_functions k d
+
+  and declaration_dots d =
+    let k d =
+      rewrap d
+       (match Ast0.unwrap d with
+         Ast0.DOTS(l) ->
+           let (n,l) = map_split_bind declaration l in (n, Ast0.DOTS(l))
+       | Ast0.CIRCLES(l) ->
+           let (n,l) = map_split_bind declaration l in (n, Ast0.CIRCLES(l))
+       | Ast0.STARS(l) ->
+           let (n,l) = map_split_bind declaration l in (n, Ast0.STARS(l))) in
+    dotsdeclfn all_functions k d
+
+  and case_line_dots d =
+    let k d =
+      rewrap d
+       (match Ast0.unwrap d with
+         Ast0.DOTS(l) ->
+           let (n,l) = map_split_bind case_line l in (n, Ast0.DOTS(l))
+       | Ast0.CIRCLES(l) ->
+           let (n,l) = map_split_bind case_line l in (n, Ast0.CIRCLES(l))
+       | Ast0.STARS(l) ->
+           let (n,l) = map_split_bind case_line l in (n, Ast0.STARS(l))) in
+    dotscasefn all_functions k d
+
+  and ident i =
+    let k i =
+      rewrap i
+       (match Ast0.unwrap i with
+         Ast0.Id(name) ->
+           let (n,name) = string_mcode name in (n,Ast0.Id(name))
+       | Ast0.MetaId(name,constraints,pure) ->
+           let (n,name) = meta_mcode name in
+           (n,Ast0.MetaId(name,constraints,pure))
+       | Ast0.MetaFunc(name,constraints,pure) ->
+           let (n,name) = meta_mcode name in
+           (n,Ast0.MetaFunc(name,constraints,pure))
+       | Ast0.MetaLocalFunc(name,constraints,pure) ->
+           let (n,name) = meta_mcode name in
+           (n,Ast0.MetaLocalFunc(name,constraints,pure))
+       | Ast0.OptIdent(id) ->
+           let (n,id) = ident id in (n,Ast0.OptIdent(id))
+       | Ast0.UniqueIdent(id) ->
+           let (n,id) = ident id in (n,Ast0.UniqueIdent(id))) in
+    identfn all_functions k i
+
+  and expression e =
+    let k e =
+      rewrap e
+       (match Ast0.unwrap e with
+         Ast0.Ident(id) ->
+           let (n,id) = ident id in (n,Ast0.Ident(id))
+       | Ast0.Constant(const) ->
+           let (n,const) = const_mcode const in (n,Ast0.Constant(const))
+       | Ast0.FunCall(fn,lp,args,rp) ->
+           let (fn_n,fn) = expression fn in
+           let (lp_n,lp) = string_mcode lp in
+           let (args_n,args) = expression_dots args in
+           let (rp_n,rp) = string_mcode rp in
+           (multibind [fn_n;lp_n;args_n;rp_n], Ast0.FunCall(fn,lp,args,rp))
+       | Ast0.Assignment(left,op,right,simple) ->
+           let (left_n,left) = expression left in
+           let (op_n,op) = assign_mcode op in
+           let (right_n,right) = expression right in
+           (multibind [left_n;op_n;right_n],
+            Ast0.Assignment(left,op,right,simple))
+       | Ast0.CondExpr(exp1,why,exp2,colon,exp3) ->
+           let (exp1_n,exp1) = expression exp1 in
+           let (why_n,why) = string_mcode why in
+           let (exp2_n,exp2) = get_option expression exp2 in
+           let (colon_n,colon) = string_mcode colon in
+           let (exp3_n,exp3) = expression exp3 in
+           (multibind [exp1_n;why_n;exp2_n;colon_n;exp3_n],
+            Ast0.CondExpr(exp1,why,exp2,colon,exp3))
+       | Ast0.Postfix(exp,op) ->
+           let (exp_n,exp) = expression exp in
+           let (op_n,op) = fix_mcode op in
+           (bind exp_n op_n, Ast0.Postfix(exp,op))
+       | Ast0.Infix(exp,op) ->
+           let (exp_n,exp) = expression exp in
+           let (op_n,op) = fix_mcode op in
+           (bind op_n exp_n, Ast0.Infix(exp,op))
+       | Ast0.Unary(exp,op) ->
+           let (exp_n,exp) = expression exp in
+           let (op_n,op) = unary_mcode op in
+           (bind op_n exp_n, Ast0.Unary(exp,op))
+       | Ast0.Binary(left,op,right) ->
+           let (left_n,left) = expression left in
+           let (op_n,op) = binary_mcode op in
+           let (right_n,right) = expression right in
+           (multibind [left_n;op_n;right_n], Ast0.Binary(left,op,right))
+       | Ast0.Nested(left,op,right) ->
+           let (left_n,left) = expression left in
+           let (op_n,op) = binary_mcode op in
+           let (right_n,right) = expression right in
+           (multibind [left_n;op_n;right_n], Ast0.Nested(left,op,right))
+       | Ast0.Paren(lp,exp,rp) ->
+           let (lp_n,lp) = string_mcode lp in
+           let (exp_n,exp) = expression exp in
+           let (rp_n,rp) = string_mcode rp in
+           (multibind [lp_n;exp_n;rp_n], Ast0.Paren(lp,exp,rp))
+       | Ast0.ArrayAccess(exp1,lb,exp2,rb) ->
+           let (exp1_n,exp1) = expression exp1 in
+           let (lb_n,lb) = string_mcode lb in
+           let (exp2_n,exp2) = expression exp2 in
+           let (rb_n,rb) = string_mcode rb in
+           (multibind [exp1_n;lb_n;exp2_n;rb_n],
+            Ast0.ArrayAccess(exp1,lb,exp2,rb))
+       | Ast0.RecordAccess(exp,pt,field) ->
+           let (exp_n,exp) = expression exp in
+           let (pt_n,pt) = string_mcode pt in
+           let (field_n,field) = ident field in
+           (multibind [exp_n;pt_n;field_n], Ast0.RecordAccess(exp,pt,field))
+       | Ast0.RecordPtAccess(exp,ar,field) ->
+           let (exp_n,exp) = expression exp in
+           let (ar_n,ar) = string_mcode ar in
+           let (field_n,field) = ident field in
+           (multibind [exp_n;ar_n;field_n], Ast0.RecordPtAccess(exp,ar,field))
+       | Ast0.Cast(lp,ty,rp,exp) ->
+           let (lp_n,lp) = string_mcode lp in
+           let (ty_n,ty) = typeC ty in
+           let (rp_n,rp) = string_mcode rp in
+           let (exp_n,exp) = expression exp in
+           (multibind [lp_n;ty_n;rp_n;exp_n], Ast0.Cast(lp,ty,rp,exp))
+       | Ast0.SizeOfExpr(szf,exp) ->
+           let (szf_n,szf) = string_mcode szf in
+           let (exp_n,exp) = expression exp in
+           (multibind [szf_n;exp_n],Ast0.SizeOfExpr(szf,exp))
+       | Ast0.SizeOfType(szf,lp,ty,rp) ->
+           let (szf_n,szf) = string_mcode szf in
+           let (lp_n,lp) = string_mcode lp in
+           let (ty_n,ty) = typeC ty in
+            let (rp_n,rp) = string_mcode rp in
+           (multibind [szf_n;lp_n;ty_n;rp_n], Ast0.SizeOfType(szf,lp,ty,rp))
+       | Ast0.TypeExp(ty) ->
+           let (ty_n,ty) = typeC ty in
+           (ty_n,Ast0.TypeExp(ty))
+       | Ast0.MetaErr(name,constraints,pure) ->
+           let (name_n,name) = meta_mcode name in
+           (name_n,Ast0.MetaErr(name,constraints,pure))
+       | Ast0.MetaExpr(name,constraints,ty,form,pure) ->
+           let (name_n,name) = meta_mcode name in
+           (name_n,Ast0.MetaExpr(name,constraints,ty,form,pure))
+       | Ast0.MetaExprList(name,lenname,pure) ->
+           let (name_n,name) = meta_mcode name in
+           (name_n,Ast0.MetaExprList(name,lenname,pure))
+       | Ast0.EComma(cm) ->
+           let (cm_n,cm) = string_mcode cm in (cm_n,Ast0.EComma(cm))
+       | Ast0.DisjExpr(starter,expr_list,mids,ender) ->
+           let (starter_n,starter) = string_mcode starter in
+           let (expr_list_n,expr_list) = map_split expression expr_list in
+           let (mids_n,mids) = map_split string_mcode mids in
+           let (ender_n,ender) = string_mcode ender in
+           (multibind
+              [starter_n;List.hd expr_list_n;
+                multibind (List.map2 bind mids_n (List.tl expr_list_n));
+                ender_n],
+            Ast0.DisjExpr(starter,expr_list,mids,ender))
+       | Ast0.NestExpr(starter,expr_dots,ender,whencode,multi) ->
+           let (starter_n,starter) = string_mcode starter in
+           let (expr_dots_n,expr_dots) = expression_dots expr_dots in
+           let (ender_n,ender) = string_mcode ender in
+           let (whencode_n,whencode) = get_option expression whencode in
+           (multibind [starter_n;expr_dots_n;ender_n;whencode_n],
+            Ast0.NestExpr(starter,expr_dots,ender,whencode,multi))
+       | Ast0.Edots(dots,whencode) ->
+           let (dots_n,dots) = string_mcode dots in
+           let (whencode_n,whencode) = get_option expression whencode in
+           (bind dots_n whencode_n,Ast0.Edots(dots,whencode))
+       | Ast0.Ecircles(dots,whencode) ->
+           let (dots_n,dots) = string_mcode dots in
+           let (whencode_n,whencode) = get_option expression whencode in
+           (bind dots_n whencode_n,Ast0.Ecircles(dots,whencode))
+       | Ast0.Estars(dots,whencode) ->
+           let (dots_n,dots) = string_mcode dots in
+           let (whencode_n,whencode) = get_option expression whencode in
+           (bind dots_n whencode_n,Ast0.Estars(dots,whencode))
+       | Ast0.OptExp(exp) ->
+           let (exp_n,exp) = expression exp in
+           (exp_n,Ast0.OptExp(exp))
+       | Ast0.UniqueExp(exp) ->
+           let (exp_n,exp) = expression exp in
+           (exp_n,Ast0.UniqueExp(exp))) in
+    exprfn all_functions k e
+  and typeC t =
+    let k t =
+      rewrap t
+       (match Ast0.unwrap t with
+         Ast0.ConstVol(cv,ty) ->
+           let (cv_n,cv) = cv_mcode cv in
+           let (ty_n,ty) = typeC ty in
+           (bind cv_n ty_n, Ast0.ConstVol(cv,ty))
+       | Ast0.BaseType(ty,strings) ->
+           let (strings_n,strings) = map_split_bind string_mcode strings in
+           (strings_n, Ast0.BaseType(ty,strings))
+       | Ast0.Signed(sign,ty) ->
+           let (sign_n,sign) = sign_mcode sign in
+           let (ty_n,ty) = get_option typeC ty in
+           (bind sign_n ty_n, Ast0.Signed(sign,ty))
+       | Ast0.Pointer(ty,star) ->
+           let (ty_n,ty) = typeC ty in
+           let (star_n,star) = string_mcode star in
+           (bind ty_n star_n, Ast0.Pointer(ty,star))
+       | Ast0.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2) ->
+           function_pointer (ty,lp1,star,rp1,lp2,params,rp2) []
+       | Ast0.FunctionType(ty,lp1,params,rp1) ->
+           function_type (ty,lp1,params,rp1) []
+       | Ast0.Array(ty,lb,size,rb) -> array_type (ty,lb,size,rb) []
+       | Ast0.EnumName(kind,name) ->
+           let (kind_n,kind) = string_mcode kind in
+           let (name_n,name) = ident name in
+           (bind kind_n name_n, Ast0.EnumName(kind,name))
+       | Ast0.StructUnionName(kind,name) ->
+           let (kind_n,kind) = struct_mcode kind in
+           let (name_n,name) = get_option ident name in
+           (bind kind_n name_n, Ast0.StructUnionName(kind,name))
+       | Ast0.StructUnionDef(ty,lb,decls,rb) ->
+           let (ty_n,ty) = typeC ty in
+           let (lb_n,lb) = string_mcode lb in
+           let (decls_n,decls) = declaration_dots decls in
+           let (rb_n,rb) = string_mcode rb in
+           (multibind [ty_n;lb_n;decls_n;rb_n],
+            Ast0.StructUnionDef(ty,lb,decls,rb))
+       | Ast0.TypeName(name) ->
+           let (name_n,name) = string_mcode name in
+           (name_n,Ast0.TypeName(name))
+       | Ast0.MetaType(name,pure) ->
+           let (name_n,name) = meta_mcode name in
+           (name_n,Ast0.MetaType(name,pure))
+       | Ast0.DisjType(starter,types,mids,ender) ->
+           let (starter_n,starter) = string_mcode starter in
+           let (types_n,types) = map_split typeC types in
+           let (mids_n,mids) = map_split string_mcode mids in
+           let (ender_n,ender) = string_mcode ender in
+           (multibind
+              [starter_n;List.hd types_n;
+                multibind (List.map2 bind mids_n (List.tl types_n));
+                ender_n],
+           Ast0.DisjType(starter,types,mids,ender))
+       | Ast0.OptType(ty) ->
+           let (ty_n,ty) = typeC ty in (ty_n, Ast0.OptType(ty))
+       | Ast0.UniqueType(ty) ->
+           let (ty_n,ty) = typeC ty in (ty_n, Ast0.UniqueType(ty))) in
+    tyfn all_functions k t
+
+  and function_pointer (ty,lp1,star,rp1,lp2,params,rp2) extra =
+    let (ty_n,ty) = typeC ty in
+    let (lp1_n,lp1) = string_mcode lp1 in
+    let (star_n,star) = string_mcode star in
+    let (rp1_n,rp1) = string_mcode rp1 in
+    let (lp2_n,lp2) = string_mcode lp2 in
+    let (params_n,params) = parameter_list params in
+    let (rp2_n,rp2) = string_mcode rp2 in
+    (* have to put the treatment of the identifier into the right position *)
+    (multibind ([ty_n;lp1_n;star_n] @ extra @ [rp1_n;lp2_n;params_n;rp2_n]),
+     Ast0.FunctionPointer(ty,lp1,star,rp1,lp2,params,rp2))
+  and function_type (ty,lp1,params,rp1) extra =
+    let (ty_n,ty) = get_option typeC ty in
+    let (lp1_n,lp1) = string_mcode lp1 in
+    let (params_n,params) = parameter_list params in
+    let (rp1_n,rp1) = string_mcode rp1 in
+    (* have to put the treatment of the identifier into the right position *)
+    (multibind (ty_n :: extra @ [lp1_n;params_n;rp1_n]),
+     Ast0.FunctionType(ty,lp1,params,rp1))
+  and array_type (ty,lb,size,rb) extra =
+    let (ty_n,ty) = typeC ty in
+    let (lb_n,lb) = string_mcode lb in
+    let (size_n,size) = get_option expression size in
+    let (rb_n,rb) = string_mcode rb in
+    (multibind (ty_n :: extra @ [lb_n;size_n;rb_n]),
+     Ast0.Array(ty,lb,size,rb))
+
+  and named_type ty id =
+    let (id_n,id) = ident id in
+    match Ast0.unwrap ty with
+      Ast0.FunctionPointer(rty,lp1,star,rp1,lp2,params,rp2) ->
+       let tyres =
+         function_pointer (rty,lp1,star,rp1,lp2,params,rp2) [id_n] in
+       (rewrap ty tyres, id)
+    | Ast0.FunctionType(rty,lp1,params,rp1) ->
+       let tyres = function_type (rty,lp1,params,rp1) [id_n] in
+       (rewrap ty tyres, id)
+    | Ast0.Array(rty,lb,size,rb) ->
+       let tyres = array_type (rty,lb,size,rb) [id_n] in
+       (rewrap ty tyres, id)
+    | _ -> let (ty_n,ty) = typeC ty in ((bind ty_n id_n, ty), id)
+
+  and declaration d =
+    let k d =
+      rewrap d
+       (match Ast0.unwrap d with
+         Ast0.Init(stg,ty,id,eq,ini,sem) ->
+           let (stg_n,stg) = get_option storage_mcode stg in
+           let ((ty_id_n,ty),id) = named_type ty id in
+           let (eq_n,eq) = string_mcode eq in
+           let (ini_n,ini) = initialiser ini in
+           let (sem_n,sem) = string_mcode sem in
+           (multibind [stg_n;ty_id_n;eq_n;ini_n;sem_n],
+            Ast0.Init(stg,ty,id,eq,ini,sem))
+       | Ast0.UnInit(stg,ty,id,sem) ->
+           let (stg_n,stg) = get_option storage_mcode stg in
+           let ((ty_id_n,ty),id) = named_type ty id in
+           let (sem_n,sem) = string_mcode sem in
+           (multibind [stg_n;ty_id_n;sem_n], Ast0.UnInit(stg,ty,id,sem))
+       | Ast0.MacroDecl(name,lp,args,rp,sem) ->
+           let (name_n,name) = ident name in
+           let (lp_n,lp) = string_mcode lp in
+           let (args_n,args) = expression_dots args in
+           let (rp_n,rp) = string_mcode rp in
+           let (sem_n,sem) = string_mcode sem in
+           (multibind [name_n;lp_n;args_n;rp_n;sem_n],
+            Ast0.MacroDecl(name,lp,args,rp,sem))
+       | Ast0.TyDecl(ty,sem) ->
+           let (ty_n,ty) = typeC ty in
+           let (sem_n,sem) = string_mcode sem in
+           (bind ty_n sem_n, Ast0.TyDecl(ty,sem))
+       | Ast0.Typedef(stg,ty,id,sem) ->
+           let (stg_n,stg) = string_mcode stg in
+           let (ty_n,ty) = typeC ty in
+           let (id_n,id) = typeC id in
+           let (sem_n,sem) = string_mcode sem in
+           (multibind [stg_n;ty_n;id_n;sem_n], Ast0.Typedef(stg,ty,id,sem))
+       | Ast0.DisjDecl(starter,decls,mids,ender) ->
+           let (starter_n,starter) = string_mcode starter in
+           let (decls_n,decls) = map_split declaration decls in
+           let (mids_n,mids) = map_split string_mcode mids in
+           let (ender_n,ender) = string_mcode ender in
+           (multibind
+              [starter_n;List.hd decls_n;
+                multibind (List.map2 bind mids_n (List.tl decls_n));
+                ender_n],
+            Ast0.DisjDecl(starter,decls,mids,ender))
+       | Ast0.Ddots(dots,whencode) ->
+           let (dots_n,dots) = string_mcode dots in
+           let (whencode_n,whencode) = get_option declaration whencode in
+           (bind dots_n whencode_n, Ast0.Ddots(dots,whencode))
+       | Ast0.OptDecl(decl) ->
+           let (n,decl) = declaration decl in (n,Ast0.OptDecl(decl))
+       | Ast0.UniqueDecl(decl) ->
+           let (n,decl) = declaration decl in (n,Ast0.UniqueDecl(decl))) in
+    declfn all_functions k d
+
+  and initialiser i =
+    let k i =
+      rewrap i
+       (match Ast0.unwrap i with
+         Ast0.MetaInit(name,pure) ->
+           let (name_n,name) = meta_mcode name in
+           (name_n,Ast0.MetaInit(name,pure))
+       | Ast0.InitExpr(exp) ->
+           let (exp_n,exp) = expression exp in
+           (exp_n,Ast0.InitExpr(exp))
+       | Ast0.InitList(lb,initlist,rb) ->
+           let (lb_n,lb) = string_mcode lb in
+           let (initlist_n,initlist) = initialiser_list initlist in
+           let (rb_n,rb) = string_mcode rb in
+           (multibind [lb_n;initlist_n;rb_n], Ast0.InitList(lb,initlist,rb))
+       | Ast0.InitGccExt(designators,eq,ini) ->
+           let (dn,designators) = map_split_bind designator designators in
+           let (eq_n,eq) = string_mcode eq in
+           let (ini_n,ini) = initialiser ini in
+           (multibind [dn;eq_n;ini_n], Ast0.InitGccExt(designators,eq,ini))
+       | Ast0.InitGccName(name,eq,ini) ->
+           let (name_n,name) = ident name in
+           let (eq_n,eq) = string_mcode eq in
+           let (ini_n,ini) = initialiser ini in
+           (multibind [name_n;eq_n;ini_n], Ast0.InitGccName(name,eq,ini))
+       | Ast0.IComma(cm) ->
+           let (n,cm) = string_mcode cm in (n,Ast0.IComma(cm))
+       | Ast0.Idots(d,whencode) ->
+           let (d_n,d) = string_mcode d in
+           let (whencode_n,whencode) = get_option initialiser whencode in
+           (bind d_n whencode_n, Ast0.Idots(d,whencode))
+       | Ast0.OptIni(i) ->
+           let (n,i) = initialiser i in (n,Ast0.OptIni(i))
+       | Ast0.UniqueIni(i) ->
+           let (n,i) = initialiser i in (n,Ast0.UniqueIni(i))) in
+    initfn all_functions k i
+
+  and designator = function
+      Ast0.DesignatorField(dot,id) ->
+       let (dot_n,dot) = string_mcode dot in
+       let (id_n,id) = ident id in
+       (bind dot_n id_n, Ast0.DesignatorField(dot,id))
+    | Ast0.DesignatorIndex(lb,exp,rb) ->
+       let (lb_n,lb) = string_mcode lb in
+       let (exp_n,exp) = expression exp in
+       let (rb_n,rb) = string_mcode rb in
+       (multibind [lb_n;exp_n;rb_n], Ast0.DesignatorIndex(lb,exp,rb))
+    | Ast0.DesignatorRange(lb,min,dots,max,rb) ->
+       let (lb_n,lb) = string_mcode lb in
+       let (min_n,min) = expression min in
+       let (dots_n,dots) = string_mcode dots in
+       let (max_n,max) = expression max in
+       let (rb_n,rb) = string_mcode rb in
+       (multibind [lb_n;min_n;dots_n;max_n;rb_n],
+        Ast0.DesignatorRange(lb,min,dots,max,rb))
+
+  and parameterTypeDef p =
+    let k p =
+      rewrap p
+       (match Ast0.unwrap p with
+         Ast0.VoidParam(ty) ->
+           let (n,ty) = typeC ty in (n,Ast0.VoidParam(ty))
+       | Ast0.Param(ty,id) ->
+           let (ty_n,ty) = typeC ty in
+           let (id_n,id) = get_option ident id in
+           (bind ty_n id_n, Ast0.Param(ty,id))
+       | Ast0.MetaParam(name,pure) ->
+           let (n,name) = meta_mcode name in
+           (n,Ast0.MetaParam(name,pure))
+       | Ast0.MetaParamList(name,lenname,pure) ->
+           let (n,name) = meta_mcode name in
+           (n,Ast0.MetaParamList(name,lenname,pure))
+       | Ast0.PComma(cm) ->
+           let (n,cm) = string_mcode cm in (n,Ast0.PComma(cm))
+       | Ast0.Pdots(dots) ->
+           let (n,dots) = string_mcode dots in (n,Ast0.Pdots(dots))
+       | Ast0.Pcircles(dots) ->
+           let (n,dots) = string_mcode dots in (n,Ast0.Pcircles(dots))
+       | Ast0.OptParam(param) ->
+           let (n,param) = parameterTypeDef param in (n,Ast0.OptParam(param))
+       | Ast0.UniqueParam(param) ->
+           let (n,param) = parameterTypeDef param in
+           (n,Ast0.UniqueParam(param))) in
+    paramfn all_functions k p
+
+  (* not done for combiner, because the statement is assumed to be already
+     represented elsewhere in the code *)
+  (* NOTE: This is not called for combiner_rebuilder.  This is ok for its
+     only current use. *)
+  and process_bef_aft s =
+    Ast0.set_dots_bef_aft s
+      (match Ast0.get_dots_bef_aft s with
+       Ast0.NoDots -> Ast0.NoDots
+      | Ast0.DroppingBetweenDots(stm) ->
+         let (_,stm) = statement stm in Ast0.DroppingBetweenDots(stm)
+      | Ast0.AddingBetweenDots(stm) ->
+         let (_,stm) = statement stm in Ast0.AddingBetweenDots(stm))
+
+  and statement s =
+    (if mode = COMBINER then let _ = process_bef_aft s in ());
+    let k s =
+      rewrap s
+       (match Ast0.unwrap s with
+         Ast0.FunDecl(bef,fi,name,lp,params,rp,lbrace,body,rbrace) ->
+           let (fi_n,fi) = map_split_bind fninfo fi in 
+           let (name_n,name) = ident name in
+           let (lp_n,lp) = string_mcode lp in 
+           let (params_n,params) = parameter_list params in
+           let (rp_n,rp) = string_mcode rp in 
+           let (lbrace_n,lbrace) = string_mcode lbrace in
+           let (body_n,body) = statement_dots body in 
+           let (rbrace_n,rbrace) = string_mcode rbrace in
+           (multibind
+              [fi_n;name_n;lp_n;params_n;rp_n;lbrace_n;body_n;rbrace_n],
+            Ast0.FunDecl(bef,fi,name,lp,params,rp,lbrace,body,rbrace))
+       | Ast0.Decl(bef,decl) ->
+           let (decl_n,decl) = declaration decl in
+           (decl_n,Ast0.Decl(bef,decl))
+       | Ast0.Seq(lbrace,body,rbrace) ->
+           let (lbrace_n,lbrace) = string_mcode lbrace in 
+           let (body_n,body) = statement_dots body in
+           let (rbrace_n,rbrace) = string_mcode rbrace in
+           (multibind [lbrace_n;body_n;rbrace_n],
+            Ast0.Seq(lbrace,body,rbrace))
+       | Ast0.ExprStatement(exp,sem) ->
+           let (exp_n,exp) = expression exp in 
+           let (sem_n,sem) = string_mcode sem in
+           (bind exp_n sem_n, Ast0.ExprStatement(exp,sem))
+       | Ast0.IfThen(iff,lp,exp,rp,branch1,aft) ->
+           let (iff_n,iff) = string_mcode iff in 
+           let (lp_n,lp) = string_mcode lp in 
+           let (exp_n,exp) = expression exp in
+           let (rp_n,rp) = string_mcode rp in
+           let (branch1_n,branch1) = statement branch1 in
+           (multibind [iff_n;lp_n;exp_n;rp_n;branch1_n],
+            Ast0.IfThen(iff,lp,exp,rp,branch1,aft))
+       | Ast0.IfThenElse(iff,lp,exp,rp,branch1,els,branch2,aft) ->
+           let (iff_n,iff) = string_mcode iff in 
+           let (lp_n,lp) = string_mcode lp in
+           let (exp_n,exp) = expression exp in
+           let (rp_n,rp) = string_mcode rp in 
+           let (branch1_n,branch1) = statement branch1 in 
+           let (els_n,els) = string_mcode els in
+           let (branch2_n,branch2) = statement branch2 in
+           (multibind [iff_n;lp_n;exp_n;rp_n;branch1_n;els_n;branch2_n],
+            Ast0.IfThenElse(iff,lp,exp,rp,branch1,els,branch2,aft))
+       | Ast0.While(whl,lp,exp,rp,body,aft) ->
+           let (whl_n,whl) = string_mcode whl in
+           let (lp_n,lp) = string_mcode lp in
+           let (exp_n,exp) = expression exp in
+           let (rp_n,rp) = string_mcode rp in
+           let (body_n,body) = statement body in
+           (multibind [whl_n;lp_n;exp_n;rp_n;body_n],
+            Ast0.While(whl,lp,exp,rp,body,aft))
+       | Ast0.Do(d,body,whl,lp,exp,rp,sem) ->
+           let (d_n,d) = string_mcode d in
+           let (body_n,body) = statement body in
+           let (whl_n,whl) = string_mcode whl in
+           let (lp_n,lp) = string_mcode lp in
+           let (exp_n,exp) = expression exp in
+           let (rp_n,rp) =  string_mcode rp in
+           let (sem_n,sem) = string_mcode sem in
+           (multibind [d_n;body_n;whl_n;lp_n;exp_n;rp_n;sem_n],
+            Ast0.Do(d,body,whl,lp,exp,rp,sem))
+       | Ast0.For(fr,lp,e1,sem1,e2,sem2,e3,rp,body,aft) ->
+           let (fr_n,fr) = string_mcode fr in
+           let (lp_n,lp) = string_mcode lp in
+           let (e1_n,e1) = get_option expression e1 in
+           let (sem1_n,sem1) = string_mcode sem1 in
+           let (e2_n,e2) = get_option expression e2 in
+           let (sem2_n,sem2) = string_mcode sem2 in
+           let (e3_n,e3) = get_option expression e3 in
+           let (rp_n,rp) = string_mcode rp in
+           let (body_n,body) = statement body in
+           (multibind [fr_n;lp_n;e1_n;sem1_n;e2_n;sem2_n;e3_n;rp_n;body_n],
+            Ast0.For(fr,lp,e1,sem1,e2,sem2,e3,rp,body,aft))
+       | Ast0.Iterator(nm,lp,args,rp,body,aft) ->
+           let (nm_n,nm) = ident nm in 
+           let (lp_n,lp) = string_mcode lp in
+           let (args_n,args) = expression_dots args in
+           let (rp_n,rp) = string_mcode rp in
+           let (body_n,body) = statement body in
+           (multibind [nm_n;lp_n;args_n;rp_n;body_n],
+            Ast0.Iterator(nm,lp,args,rp,body,aft))
+       | Ast0.Switch(switch,lp,exp,rp,lb,cases,rb) ->
+           let (switch_n,switch) = string_mcode switch in 
+           let (lp_n,lp) = string_mcode lp in
+           let (exp_n,exp) = expression exp in
+           let (rp_n,rp) = string_mcode rp in 
+           let (lb_n,lb) = string_mcode lb in
+           let (cases_n,cases) = case_line_dots cases in 
+           let (rb_n,rb) = string_mcode rb in
+           (multibind [switch_n;lp_n;exp_n;rp_n;lb_n;cases_n;rb_n],
+            Ast0.Switch(switch,lp,exp,rp,lb,cases,rb))
+       | Ast0.Break(br,sem) ->
+           let (br_n,br) = string_mcode br in
+           let (sem_n,sem) = string_mcode sem in
+           (bind br_n sem_n, Ast0.Break(br,sem))
+       | Ast0.Continue(cont,sem) ->
+           let (cont_n,cont) = string_mcode cont in
+           let (sem_n,sem) = string_mcode sem in
+           (bind cont_n sem_n, Ast0.Continue(cont,sem))
+       | Ast0.Label(l,dd) ->
+           let (l_n,l) = ident l in
+           let (dd_n,dd) = string_mcode dd in
+           (bind l_n dd_n, Ast0.Label(l,dd))
+       | Ast0.Goto(goto,l,sem) ->
+           let (goto_n,goto) = string_mcode goto in
+           let (l_n,l) = ident l in
+           let (sem_n,sem) = string_mcode sem in
+           (bind goto_n (bind l_n sem_n), Ast0.Goto(goto,l,sem))
+       | Ast0.Return(ret,sem) ->
+           let (ret_n,ret) = string_mcode ret in
+           let (sem_n,sem) = string_mcode sem in
+           (bind ret_n sem_n, Ast0.Return(ret,sem))
+       | Ast0.ReturnExpr(ret,exp,sem) ->
+           let (ret_n,ret) = string_mcode ret in
+           let (exp_n,exp) = expression exp in
+           let (sem_n,sem) = string_mcode sem in
+           (multibind [ret_n;exp_n;sem_n], Ast0.ReturnExpr(ret,exp,sem))
+       | Ast0.MetaStmt(name,pure) ->
+           let (name_n,name) = meta_mcode name in
+           (name_n,Ast0.MetaStmt(name,pure))
+       | Ast0.MetaStmtList(name,pure) ->
+           let (name_n,name) = meta_mcode name in
+           (name_n,Ast0.MetaStmtList(name,pure))
+       | Ast0.Disj(starter,statement_dots_list,mids,ender) ->
+           let (starter_n,starter) = string_mcode starter in
+           let (s_n,statement_dots_list) =
+             map_split statement_dots statement_dots_list in
+           let (mids_n,mids) = map_split string_mcode mids in
+           let (ender_n,ender) = string_mcode ender in
+           (multibind
+              [starter_n;List.hd s_n;
+                multibind (List.map2 bind mids_n (List.tl s_n));
+                ender_n],
+            Ast0.Disj(starter,statement_dots_list,mids,ender))
+       | Ast0.Nest(starter,stmt_dots,ender,whn,multi) ->
+           let (starter_n,starter) = string_mcode starter in
+           let (stmt_dots_n,stmt_dots) = statement_dots stmt_dots in
+           let (ender_n,ender) = string_mcode ender in
+           let (whn_n,whn) =
+             map_split_bind (whencode statement_dots statement) whn in
+           (multibind [starter_n;stmt_dots_n;ender_n;whn_n],
+            Ast0.Nest(starter,stmt_dots,ender,whn,multi))
+       | Ast0.Exp(exp) ->
+           let (exp_n,exp) = expression exp in
+           (exp_n,Ast0.Exp(exp))
+       | Ast0.TopExp(exp) ->
+           let (exp_n,exp) = expression exp in
+           (exp_n,Ast0.TopExp(exp))
+       | Ast0.Ty(ty) ->
+           let (ty_n,ty) = typeC ty in
+           (ty_n,Ast0.Ty(ty))
+       | Ast0.TopInit(init) ->
+           let (init_n,init) = initialiser init in
+           (init_n,Ast0.TopInit(init))
+       | Ast0.Dots(d,whn) ->
+           let (d_n,d) = string_mcode d in
+           let (whn_n,whn) =
+             map_split_bind (whencode statement_dots statement) whn in
+           (bind d_n whn_n, Ast0.Dots(d,whn))
+       | Ast0.Circles(d,whn) ->
+           let (d_n,d) = string_mcode d in
+           let (whn_n,whn) =
+             map_split_bind (whencode statement_dots statement) whn in
+           (bind d_n whn_n, Ast0.Circles(d,whn))
+       | Ast0.Stars(d,whn) ->
+           let (d_n,d) = string_mcode d in
+           let (whn_n,whn) =
+             map_split_bind (whencode statement_dots statement) whn in
+           (bind d_n whn_n, Ast0.Stars(d,whn))
+       | Ast0.Include(inc,name) ->
+           let (inc_n,inc) = string_mcode inc in
+           let (name_n,name) = inc_mcode name in
+           (bind inc_n name_n, Ast0.Include(inc,name))
+       | Ast0.Define(def,id,params,body) ->
+           let (def_n,def) = string_mcode def in
+           let (id_n,id) = ident id in
+           let (params_n,params) = define_parameters params in
+           let (body_n,body) = statement_dots body in
+           (multibind [def_n;id_n;params_n;body_n],
+            Ast0.Define(def,id,params,body))
+       | Ast0.OptStm(re) ->
+           let (re_n,re) = statement re in (re_n,Ast0.OptStm(re))
+       | Ast0.UniqueStm(re) ->
+           let (re_n,re) = statement re in (re_n,Ast0.UniqueStm(re))) in
+    let (n,s) = stmtfn all_functions k s in
+    (n,if mode = REBUILDER then process_bef_aft s else s)
+
+  (* not parameterizable for now... *)
+  and define_parameters p =
+    let k p =
+      rewrap p
+       (match Ast0.unwrap p with
+         Ast0.NoParams -> (option_default,Ast0.NoParams)
+       | Ast0.DParams(lp,params,rp) ->
+           let (lp_n,lp) = string_mcode lp in
+           let (params_n,params) = define_param_dots params in
+           let (rp_n,rp) = string_mcode rp in
+           (multibind [lp_n;params_n;rp_n], Ast0.DParams(lp,params,rp))) in
+    k p
+
+  and define_param_dots d =
+    let k d =
+      rewrap d
+       (match Ast0.unwrap d with
+         Ast0.DOTS(l) ->
+           let (n,l) = map_split_bind define_param l in (n,Ast0.DOTS(l))
+       | Ast0.CIRCLES(l) ->
+           let (n,l) = map_split_bind define_param l in (n,Ast0.CIRCLES(l))
+       | Ast0.STARS(l) ->
+           let (n,l) = map_split_bind define_param l in (n,Ast0.STARS(l))) in
+    k d
+
+  and define_param p =
+    let k p =
+      rewrap p
+       (match Ast0.unwrap p with
+         Ast0.DParam(id) -> let (n,id) = ident id in (n,Ast0.DParam(id))
+       | Ast0.DPComma(comma) ->
+           let (n,comma) = string_mcode comma in (n,Ast0.DPComma(comma))
+       | Ast0.DPdots(d) ->
+           let (n,d) = string_mcode d in (n,Ast0.DPdots(d))
+       | Ast0.DPcircles(c) ->
+           let (n,c) = string_mcode c in (n,Ast0.DPcircles(c))
+       | Ast0.OptDParam(dp) ->
+           let (n,dp) = define_param dp in (n,Ast0.OptDParam(dp))
+       | Ast0.UniqueDParam(dp) ->
+           let (n,dp) = define_param dp in (n,Ast0.UniqueDParam(dp))) in
+    k p
+
+  and fninfo = function
+      Ast0.FStorage(stg) ->
+       let (n,stg) = storage_mcode stg in (n,Ast0.FStorage(stg))
+    | Ast0.FType(ty) -> let (n,ty) = typeC ty in (n,Ast0.FType(ty))
+    | Ast0.FInline(inline) ->
+       let (n,inline) = string_mcode inline in (n,Ast0.FInline(inline))
+    | Ast0.FAttr(init) ->
+       let (n,init) = string_mcode init in (n,Ast0.FAttr(init))
+
+  and whencode notfn alwaysfn = function
+      Ast0.WhenNot a -> let (n,a) = notfn a in (n,Ast0.WhenNot(a))
+    | Ast0.WhenAlways a -> let (n,a) = alwaysfn a in (n,Ast0.WhenAlways(a))
+    | Ast0.WhenModifier(x) -> (option_default,Ast0.WhenModifier(x))
+    | Ast0.WhenNotTrue(e) ->
+       let (n,e) = expression e in (n,Ast0.WhenNotTrue(e))
+    | Ast0.WhenNotFalse(e) ->
+       let (n,e) = expression e in (n,Ast0.WhenNotFalse(e))
+
+  and case_line c =
+    let k c =
+      rewrap c
+       (match Ast0.unwrap c with
+         Ast0.Default(def,colon,code) ->
+           let (def_n,def) = string_mcode def in
+           let (colon_n,colon) = string_mcode colon in
+           let (code_n,code) = statement_dots code in
+           (multibind [def_n;colon_n;code_n], Ast0.Default(def,colon,code))
+       | Ast0.Case(case,exp,colon,code) ->
+           let (case_n,case) = string_mcode case in
+           let (exp_n,exp) = expression exp in
+           let (colon_n,colon) = string_mcode colon in
+           let (code_n,code) = statement_dots code in
+           (multibind [case_n;exp_n;colon_n;code_n],
+            Ast0.Case(case,exp,colon,code))
+       | Ast0.OptCase(case) ->
+           let (n,case) = case_line case in (n,Ast0.OptCase(case))) in
+    casefn all_functions k c
+
+  and top_level t =
+    let k t =
+      rewrap t
+       (match Ast0.unwrap t with
+         Ast0.FILEINFO(old_file,new_file) ->
+           let (old_file_n,old_file) = string_mcode old_file in
+           let (new_file_n,new_file) = string_mcode new_file in
+           (bind old_file_n new_file_n,Ast0.FILEINFO(old_file,new_file))
+       | Ast0.DECL(statement_dots) ->
+           let (n,statement_dots) = statement statement_dots in
+           (n,Ast0.DECL(statement_dots))
+       | Ast0.CODE(stmt_dots) ->
+           let (stmt_dots_n,stmt_dots) = statement_dots stmt_dots in
+           (stmt_dots_n, Ast0.CODE(stmt_dots))
+       | Ast0.ERRORWORDS(exps) ->
+           let (n,exps) = map_split_bind expression exps in
+           (n, Ast0.ERRORWORDS(exps))
+       | Ast0.OTHER(_) -> failwith "unexpected code") in
+    topfn all_functions k t
+
+  and anything a = (* for compile_iso, not parameterisable *)
+    let k = function
+       Ast0.DotsExprTag(exprs) ->
+         let (exprs_n,exprs) = expression_dots exprs in
+         (exprs_n,Ast0.DotsExprTag(exprs))
+      | Ast0.DotsInitTag(inits) ->
+         let (inits_n,inits) = initialiser_list inits in
+         (inits_n,Ast0.DotsInitTag(inits))
+      | Ast0.DotsParamTag(params) ->
+         let (params_n,params) = parameter_list params in
+         (params_n,Ast0.DotsParamTag(params))
+      | Ast0.DotsStmtTag(stmts) ->
+         let (stmts_n,stmts) = statement_dots stmts in 
+         (stmts_n,Ast0.DotsStmtTag(stmts))
+      | Ast0.DotsDeclTag(decls) ->
+         let (decls_n,decls) = declaration_dots decls in
+         (decls_n,Ast0.DotsDeclTag(decls))
+      | Ast0.DotsCaseTag(cases) ->
+         let (cases_n,cases) = case_line_dots cases in
+         (cases_n,Ast0.DotsCaseTag(cases))
+      | Ast0.IdentTag(id) ->
+         let (id_n,id) = ident id in
+         (id_n,Ast0.IdentTag(id))
+      | Ast0.ExprTag(exp) ->
+         let (exp_n,exp) = expression exp in
+         (exp_n,Ast0.ExprTag(exp))
+      | Ast0.ArgExprTag(exp) ->
+         let (exp_n,exp) = expression exp in
+         (exp_n,Ast0.ArgExprTag(exp))
+      | Ast0.TestExprTag(exp) ->
+         let (exp_n,exp) = expression exp in
+         (exp_n,Ast0.TestExprTag(exp))
+      | Ast0.TypeCTag(ty) ->
+         let (ty_n,ty) = typeC ty in
+         (ty_n,Ast0.TypeCTag(ty))
+      | Ast0.ParamTag(param) ->
+         let (param_n,param) = parameterTypeDef param in
+         (param_n,Ast0.ParamTag(param))
+      | Ast0.InitTag(init) ->
+         let (init_n,init) = initialiser init in
+         (init_n,Ast0.InitTag(init))
+      | Ast0.DeclTag(decl) ->
+         let (decl_n,decl) = declaration decl in
+         (decl_n,Ast0.DeclTag(decl))
+      | Ast0.StmtTag(stmt) ->
+         let (stmt_n,stmt) = statement stmt in
+         (stmt_n,Ast0.StmtTag(stmt))
+      | Ast0.CaseLineTag(c) ->
+         let (c_n,c) = case_line c in
+         (c_n,Ast0.CaseLineTag(c))
+      | Ast0.TopTag(top) ->
+         let (top_n,top) = top_level top in
+         (top_n,Ast0.TopTag(top))
+      | Ast0.IsoWhenTag(x) -> (option_default,Ast0.IsoWhenTag(x))
+      | Ast0.IsoWhenTTag(e) ->
+         let (e_n,e) = expression e in
+         (e_n,Ast0.IsoWhenTTag(e))
+      | Ast0.IsoWhenFTag(e) ->
+         let (e_n,e) = expression e in
+         (e_n,Ast0.IsoWhenFTag(e))
+      |        Ast0.MetaPosTag(var) -> failwith "not supported" in
+    k a
+
+  (* not done for combiner, because the statement is assumed to be already
+     represented elsewhere in the code *)
+
+  and all_functions =
+    {VT0.ident = ident;
+      VT0.expression = expression;
+      VT0.typeC = typeC;
+      VT0.declaration = declaration;
+      VT0.initialiser = initialiser;
+      VT0.initialiser_list = initialiser_list;
+      VT0.parameter = parameterTypeDef;
+      VT0.parameter_list = parameter_list;
+      VT0.statement = statement;
+      VT0.case_line = case_line;
+      VT0.top_level = top_level;
+      VT0.expression_dots = expression_dots;
+      VT0.statement_dots = statement_dots;
+      VT0.declaration_dots = declaration_dots;
+      VT0.case_line_dots = case_line_dots;
+      VT0.anything = anything} in
+  all_functions
+
+let combiner_functions =
+  {VT0.combiner_meta_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_string_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_const_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_assign_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_fix_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_unary_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_binary_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_cv_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_sign_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_struct_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_storage_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_inc_mcode = (fun opt_default mc -> opt_default);
+   VT0.combiner_dotsexprfn = (fun r k e -> k e);
+   VT0.combiner_dotsinitfn = (fun r k e -> k e);
+   VT0.combiner_dotsparamfn = (fun r k e -> k e);
+   VT0.combiner_dotsstmtfn = (fun r k e -> k e);
+   VT0.combiner_dotsdeclfn = (fun r k e -> k e);
+   VT0.combiner_dotscasefn = (fun r k e -> k e);
+   VT0.combiner_identfn = (fun r k e -> k e);
+   VT0.combiner_exprfn = (fun r k e -> k e);
+   VT0.combiner_tyfn = (fun r k e -> k e);
+   VT0.combiner_initfn = (fun r k e -> k e);
+   VT0.combiner_paramfn = (fun r k e -> k e);
+   VT0.combiner_declfn = (fun r k e -> k e);
+   VT0.combiner_stmtfn = (fun r k e -> k e);
+   VT0.combiner_casefn = (fun r k e -> k e);
+   VT0.combiner_topfn = (fun r k e -> k e)}
+
+let combiner_dz r =
+    {VT0.combiner_rec_ident =
+      (function e -> let (n,_) = r.VT0.ident e in n);
+      VT0.combiner_rec_expression =
+      (function e -> let (n,_) = r.VT0.expression e in n);
+      VT0.combiner_rec_typeC =
+      (function e -> let (n,_) = r.VT0.typeC e in n);
+      VT0.combiner_rec_declaration =
+      (function e -> let (n,_) = r.VT0.declaration e in n);
+      VT0.combiner_rec_initialiser =
+      (function e -> let (n,_) = r.VT0.initialiser e in n);
+      VT0.combiner_rec_initialiser_list =
+      (function e -> let (n,_) = r.VT0.initialiser_list e in n);
+      VT0.combiner_rec_parameter =
+      (function e -> let (n,_) = r.VT0.parameter e in n);
+      VT0.combiner_rec_parameter_list =
+      (function e -> let (n,_) = r.VT0.parameter_list e in n);
+      VT0.combiner_rec_statement =
+      (function e -> let (n,_) = r.VT0.statement e in n);
+      VT0.combiner_rec_case_line =
+      (function e -> let (n,_) = r.VT0.case_line e in n);
+      VT0.combiner_rec_top_level =
+      (function e -> let (n,_) = r.VT0.top_level e in n);
+      VT0.combiner_rec_expression_dots =
+      (function e -> let (n,_) = r.VT0.expression_dots e in n);
+      VT0.combiner_rec_statement_dots =
+      (function e -> let (n,_) = r.VT0.statement_dots e in n);
+      VT0.combiner_rec_declaration_dots =
+      (function e -> let (n,_) = r.VT0.declaration_dots e in n);
+      VT0.combiner_rec_case_line_dots =
+      (function e -> let (n,_) = r.VT0.case_line_dots e in n);
+      VT0.combiner_rec_anything =
+      (function e -> let (n,_) = r.VT0.anything e in n)}
+
+let combiner bind option_default functions =
+  let xk k e = let (n,_) = k e in n in
+  let dz = combiner_dz in
+  combiner_dz
+    (visitor COMBINER bind option_default
+    (function mc -> (functions.VT0.combiner_meta_mcode option_default mc,mc))
+    (function mc -> (functions.VT0.combiner_string_mcode option_default mc,mc))
+    (function mc -> (functions.VT0.combiner_const_mcode option_default mc,mc))
+    (function mc -> (functions.VT0.combiner_assign_mcode option_default mc,mc))
+    (function mc -> (functions.VT0.combiner_fix_mcode option_default mc,mc))
+    (function mc -> (functions.VT0.combiner_unary_mcode option_default mc,mc))
+    (function mc -> (functions.VT0.combiner_binary_mcode option_default mc,mc))
+    (function mc -> (functions.VT0.combiner_cv_mcode option_default mc,mc))
+    (function mc -> (functions.VT0.combiner_sign_mcode option_default mc,mc))
+    (function mc -> (functions.VT0.combiner_struct_mcode option_default mc,mc))
+    (function mc ->
+      (functions.VT0.combiner_storage_mcode option_default mc,mc))
+    (function mc -> (functions.VT0.combiner_inc_mcode option_default mc,mc))
+    (fun r k e -> (functions.VT0.combiner_dotsexprfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_dotsinitfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_dotsparamfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_dotsstmtfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_dotsdeclfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_dotscasefn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_identfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_exprfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_tyfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_initfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_paramfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_declfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_stmtfn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_casefn (dz r) (xk k) e, e))
+    (fun r k e -> (functions.VT0.combiner_topfn (dz r) (xk k) e, e)))
+
+let flat_combiner bind option_default
+    meta_mcode string_mcode const_mcode assign_mcode fix_mcode unary_mcode
+    binary_mcode cv_mcode sign_mcode struct_mcode storage_mcode
+    inc_mcode
+    dotsexprfn dotsinitfn dotsparamfn dotsstmtfn dotsdeclfn dotscasefn
+    identfn exprfn tyfn initfn paramfn declfn stmtfn casefn topfn =
+  let dz = combiner_dz in
+  let xk k e = let (n,_) = k e in n in
+  combiner_dz (visitor COMBINER bind option_default
+    (function mc -> (meta_mcode mc,mc))
+    (function mc -> (string_mcode mc,mc))
+    (function mc -> (const_mcode mc,mc))
+    (function mc -> (assign_mcode mc,mc))
+    (function mc -> (fix_mcode mc,mc))
+    (function mc -> (unary_mcode mc,mc))
+    (function mc -> (binary_mcode mc,mc))
+    (function mc -> (cv_mcode mc,mc))
+    (function mc -> (sign_mcode mc,mc))
+    (function mc -> (struct_mcode mc,mc))
+    (function mc -> (storage_mcode mc,mc))
+    (function mc -> (inc_mcode mc,mc))
+    (fun r k e -> (dotsexprfn (dz r) (xk k) e, e))
+    (fun r k e -> (dotsinitfn (dz r) (xk k) e, e))
+    (fun r k e -> (dotsparamfn (dz r) (xk k) e, e))
+    (fun r k e -> (dotsstmtfn (dz r) (xk k) e, e))
+    (fun r k e -> (dotsdeclfn (dz r) (xk k) e, e))
+    (fun r k e -> (dotscasefn (dz r) (xk k) e, e))
+    (fun r k e -> (identfn (dz r) (xk k) e, e))
+    (fun r k e -> (exprfn (dz r) (xk k) e, e))
+    (fun r k e -> (tyfn (dz r) (xk k) e, e))
+    (fun r k e -> (initfn (dz r) (xk k) e, e))
+    (fun r k e -> (paramfn (dz r) (xk k) e, e))
+    (fun r k e -> (declfn (dz r) (xk k) e, e))
+    (fun r k e -> (stmtfn (dz r) (xk k) e, e))
+    (fun r k e -> (casefn (dz r) (xk k) e, e))
+    (fun r k e -> (topfn (dz r) (xk k) e, e)))
+
+let rebuilder_functions =
+  {VT0.rebuilder_meta_mcode = (fun mc -> mc);
+   VT0.rebuilder_string_mcode = (fun mc -> mc);
+   VT0.rebuilder_const_mcode = (fun mc -> mc);
+   VT0.rebuilder_assign_mcode = (fun mc -> mc);
+   VT0.rebuilder_fix_mcode = (fun mc -> mc);
+   VT0.rebuilder_unary_mcode = (fun mc -> mc);
+   VT0.rebuilder_binary_mcode = (fun mc -> mc);
+   VT0.rebuilder_cv_mcode = (fun mc -> mc);
+   VT0.rebuilder_sign_mcode = (fun mc -> mc);
+   VT0.rebuilder_struct_mcode = (fun mc -> mc);
+   VT0.rebuilder_storage_mcode = (fun mc -> mc);
+   VT0.rebuilder_inc_mcode = (fun mc -> mc);
+   VT0.rebuilder_dotsexprfn = (fun r k e -> k e);
+   VT0.rebuilder_dotsinitfn = (fun r k e -> k e);
+   VT0.rebuilder_dotsparamfn = (fun r k e -> k e);
+   VT0.rebuilder_dotsstmtfn = (fun r k e -> k e);
+   VT0.rebuilder_dotsdeclfn = (fun r k e -> k e);
+   VT0.rebuilder_dotscasefn = (fun r k e -> k e);
+   VT0.rebuilder_identfn = (fun r k e -> k e);
+   VT0.rebuilder_exprfn = (fun r k e -> k e);
+   VT0.rebuilder_tyfn = (fun r k e -> k e);
+   VT0.rebuilder_initfn = (fun r k e -> k e);
+   VT0.rebuilder_paramfn = (fun r k e -> k e);
+   VT0.rebuilder_declfn = (fun r k e -> k e);
+   VT0.rebuilder_stmtfn = (fun r k e -> k e);
+   VT0.rebuilder_casefn = (fun r k e -> k e);
+   VT0.rebuilder_topfn = (fun r k e -> k e)}
+
+let rebuilder_dz r =
+  {VT0.rebuilder_rec_ident =
+      (function e -> let (_,e) = r.VT0.ident e in e);
+      VT0.rebuilder_rec_expression =
+      (function e -> let (_,e) = r.VT0.expression e in e);
+      VT0.rebuilder_rec_typeC =
+      (function e -> let (_,e) = r.VT0.typeC e in e);
+      VT0.rebuilder_rec_declaration =
+      (function e -> let (_,e) = r.VT0.declaration e in e);
+      VT0.rebuilder_rec_initialiser =
+      (function e -> let (_,e) = r.VT0.initialiser e in e);
+      VT0.rebuilder_rec_initialiser_list =
+      (function e -> let (_,e) = r.VT0.initialiser_list e in e);
+      VT0.rebuilder_rec_parameter =
+      (function e -> let (_,e) = r.VT0.parameter e in e);
+      VT0.rebuilder_rec_parameter_list =
+      (function e -> let (_,e) = r.VT0.parameter_list e in e);
+      VT0.rebuilder_rec_statement =
+      (function e -> let (_,e) = r.VT0.statement e in e);
+      VT0.rebuilder_rec_case_line =
+      (function e -> let (_,e) = r.VT0.case_line e in e);
+      VT0.rebuilder_rec_top_level =
+      (function e -> let (_,e) = r.VT0.top_level e in e);
+      VT0.rebuilder_rec_expression_dots =
+      (function e -> let (_,e) = r.VT0.expression_dots e in e);
+      VT0.rebuilder_rec_statement_dots =
+      (function e -> let (_,e) = r.VT0.statement_dots e in e);
+      VT0.rebuilder_rec_declaration_dots =
+      (function e -> let (_,e) = r.VT0.declaration_dots e in e);
+      VT0.rebuilder_rec_case_line_dots =
+      (function e -> let (_,e) = r.VT0.case_line_dots e in e);
+      VT0.rebuilder_rec_anything =
+      (function e -> let (_,e) = r.VT0.anything e in e)}
+
+let rebuilder functions =
+  let dz = rebuilder_dz in
+  let xk k e = let (_,e) = k e in e in
+  rebuilder_dz
+    (visitor REBUILDER (fun x y -> x) ()
+    (function mc -> ((),functions.VT0.rebuilder_meta_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_string_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_const_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_assign_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_fix_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_unary_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_binary_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_cv_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_sign_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_struct_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_storage_mcode mc))
+    (function mc -> ((),functions.VT0.rebuilder_inc_mcode mc))
+    (fun r k e -> ((),functions.VT0.rebuilder_dotsexprfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_dotsinitfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_dotsparamfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_dotsstmtfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_dotsdeclfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_dotscasefn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_identfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_exprfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_tyfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_initfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_paramfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_declfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_stmtfn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_casefn (dz r) (xk k) e))
+    (fun r k e -> ((),functions.VT0.rebuilder_topfn (dz r) (xk k) e)))
+
+let flat_rebuilder
+    meta_mcode string_mcode const_mcode assign_mcode fix_mcode unary_mcode
+    binary_mcode cv_mcode sign_mcode struct_mcode storage_mcode
+    inc_mcode
+    dotsexprfn dotsinitfn dotsparamfn dotsstmtfn dotsdeclfn dotscasefn
+    identfn exprfn tyfn initfn paramfn declfn stmtfn casefn topfn =
+  let dz = rebuilder_dz in
+  let xk k e = let (_,e) = k e in e in
+  rebuilder_dz
+    (visitor REBUILDER (fun x y -> x) ()
+    (function mc -> ((),meta_mcode mc))
+    (function mc -> ((),string_mcode mc))
+    (function mc -> ((),const_mcode mc))
+    (function mc -> ((),assign_mcode mc))
+    (function mc -> ((),fix_mcode mc))
+    (function mc -> ((),unary_mcode mc))
+    (function mc -> ((),binary_mcode mc))
+    (function mc -> ((),cv_mcode mc))
+    (function mc -> ((),sign_mcode mc))
+    (function mc -> ((),struct_mcode mc))
+    (function mc -> ((),storage_mcode mc))
+    (function mc -> ((),inc_mcode mc))
+    (fun r k e -> ((),dotsexprfn (dz r) (xk k) e))
+    (fun r k e -> ((),dotsinitfn (dz r) (xk k) e))
+    (fun r k e -> ((),dotsparamfn (dz r) (xk k) e))
+    (fun r k e -> ((),dotsstmtfn (dz r) (xk k) e))
+    (fun r k e -> ((),dotsdeclfn (dz r) (xk k) e))
+    (fun r k e -> ((),dotscasefn (dz r) (xk k) e))
+    (fun r k e -> ((),identfn (dz r) (xk k) e))
+    (fun r k e -> ((),exprfn (dz r) (xk k) e))
+    (fun r k e -> ((),tyfn (dz r) (xk k) e))
+    (fun r k e -> ((),initfn (dz r) (xk k) e))
+    (fun r k e -> ((),paramfn (dz r) (xk k) e))
+    (fun r k e -> ((),declfn (dz r) (xk k) e))
+    (fun r k e -> ((),stmtfn (dz r) (xk k) e))
+    (fun r k e -> ((),casefn (dz r) (xk k) e))
+    (fun r k e -> ((),topfn (dz r) (xk k) e)))
+
+let combiner_rebuilder_functions =
+  {VT0.combiner_rebuilder_meta_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_string_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_const_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_assign_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_fix_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_unary_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_binary_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_cv_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_sign_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_struct_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_storage_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_inc_mcode =
+    (fun opt_default mc -> (opt_default,mc));
+   VT0.combiner_rebuilder_dotsexprfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_dotsinitfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_dotsparamfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_dotsstmtfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_dotsdeclfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_dotscasefn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_identfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_exprfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_tyfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_initfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_paramfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_declfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_stmtfn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_casefn = (fun r k e -> k e);
+   VT0.combiner_rebuilder_topfn = (fun r k e -> k e)}
+
+let combiner_rebuilder bind option_default functions =
+  visitor BOTH bind option_default
+    (functions.VT0.combiner_rebuilder_meta_mcode option_default)
+    (functions.VT0.combiner_rebuilder_string_mcode option_default)
+    (functions.VT0.combiner_rebuilder_const_mcode option_default)
+    (functions.VT0.combiner_rebuilder_assign_mcode option_default)
+    (functions.VT0.combiner_rebuilder_fix_mcode option_default)
+    (functions.VT0.combiner_rebuilder_unary_mcode option_default)
+    (functions.VT0.combiner_rebuilder_binary_mcode option_default)
+    (functions.VT0.combiner_rebuilder_cv_mcode option_default)
+    (functions.VT0.combiner_rebuilder_sign_mcode option_default)
+    (functions.VT0.combiner_rebuilder_struct_mcode option_default)
+    (functions.VT0.combiner_rebuilder_storage_mcode option_default)
+    (functions.VT0.combiner_rebuilder_inc_mcode option_default)
+    functions.VT0.combiner_rebuilder_dotsexprfn
+    functions.VT0.combiner_rebuilder_dotsinitfn
+    functions.VT0.combiner_rebuilder_dotsparamfn
+    functions.VT0.combiner_rebuilder_dotsstmtfn
+    functions.VT0.combiner_rebuilder_dotsdeclfn
+    functions.VT0.combiner_rebuilder_dotscasefn
+    functions.VT0.combiner_rebuilder_identfn
+    functions.VT0.combiner_rebuilder_exprfn
+    functions.VT0.combiner_rebuilder_tyfn
+    functions.VT0.combiner_rebuilder_initfn
+    functions.VT0.combiner_rebuilder_paramfn
+    functions.VT0.combiner_rebuilder_declfn
+    functions.VT0.combiner_rebuilder_stmtfn
+    functions.VT0.combiner_rebuilder_casefn
+    functions.VT0.combiner_rebuilder_topfn
dissimilarity index 98%
index 285539f..14b8212 100644 (file)
-
-(* --------------------------------------------------------------------- *)
-
-type 'a combiner =
-    {combiner_ident : Ast0_cocci.ident -> 'a;
-      combiner_expression : Ast0_cocci.expression -> 'a;
-      combiner_typeC : Ast0_cocci.typeC -> 'a;
-      combiner_declaration : Ast0_cocci.declaration -> 'a;
-      combiner_initialiser : Ast0_cocci.initialiser -> 'a;
-      combiner_initialiser_list : Ast0_cocci.initialiser_list -> 'a;
-      combiner_parameter : Ast0_cocci.parameterTypeDef -> 'a;
-      combiner_parameter_list : Ast0_cocci.parameter_list -> 'a;
-      combiner_statement : Ast0_cocci.statement -> 'a;
-      combiner_case_line : Ast0_cocci.case_line -> 'a;
-      combiner_top_level : Ast0_cocci.top_level -> 'a;
-      combiner_expression_dots :
-         Ast0_cocci.expression Ast0_cocci.dots -> 'a;
-      combiner_statement_dots :
-             Ast0_cocci.statement Ast0_cocci.dots -> 'a;
-      combiner_declaration_dots :
-                 Ast0_cocci.declaration Ast0_cocci.dots -> 'a;
-      combiner_case_line_dots :
-                 Ast0_cocci.case_line Ast0_cocci.dots -> 'a;
-      combiner_anything : Ast0_cocci.anything -> 'a}
-
-type ('mc,'a) cmcode = 'mc Ast0_cocci.mcode -> 'a
-type ('cd,'a) ccode = 'a combiner -> ('cd -> 'a) -> 'cd -> 'a
-
-val combiner :
-    ('a -> 'a -> 'a) -> 'a ->
-    ((string*string,'a) cmcode) ->
-    ((string,'a) cmcode) ->
-    ((Ast_cocci.constant,'a) cmcode) ->
-    ((Ast_cocci.assignOp,'a) cmcode) ->
-    ((Ast_cocci.fixOp,'a) cmcode) ->
-    ((Ast_cocci.unaryOp,'a) cmcode) ->
-    ((Ast_cocci.binaryOp,'a) cmcode) ->
-    ((Ast_cocci.const_vol,'a) cmcode) ->
-    ((Ast_cocci.sign,'a) cmcode) ->
-    ((Ast_cocci.structUnion,'a) cmcode) ->
-    ((Ast_cocci.storage,'a) cmcode) ->
-    ((Ast_cocci.inc_file,'a) cmcode) ->
-    ((Ast0_cocci.expression Ast0_cocci.dots,'a) ccode) ->
-    ((Ast0_cocci.initialiser Ast0_cocci.dots,'a) ccode) ->
-    ((Ast0_cocci.parameterTypeDef Ast0_cocci.dots,'a) ccode) ->
-    ((Ast0_cocci.statement Ast0_cocci.dots,'a) ccode) ->
-    ((Ast0_cocci.declaration Ast0_cocci.dots,'a) ccode) ->
-    ((Ast0_cocci.case_line Ast0_cocci.dots,'a) ccode) ->
-    ((Ast0_cocci.ident,'a) ccode) ->
-    ((Ast0_cocci.expression,'a) ccode) ->
-    ((Ast0_cocci.typeC,'a) ccode) ->
-    ((Ast0_cocci.initialiser,'a) ccode) ->
-    ((Ast0_cocci.parameterTypeDef,'a) ccode) ->
-    ((Ast0_cocci.declaration,'a) ccode) ->
-    ((Ast0_cocci.statement,'a) ccode) ->
-    ((Ast0_cocci.case_line,'a) ccode) ->
-    ((Ast0_cocci.top_level,'a) ccode) ->
-    'a combiner
-
-type 'a inout = 'a -> 'a (* for specifying the type of rebuilder *)
-
-type rebuilder =
-    {rebuilder_ident : Ast0_cocci.ident inout;
-      rebuilder_expression : Ast0_cocci.expression inout;
-      rebuilder_typeC : Ast0_cocci.typeC inout;
-      rebuilder_declaration : Ast0_cocci.declaration inout;
-      rebuilder_initialiser : Ast0_cocci.initialiser inout;
-      rebuilder_initialiser_list : Ast0_cocci.initialiser_list inout;
-      rebuilder_parameter : Ast0_cocci.parameterTypeDef inout;
-      rebuilder_parameter_list : Ast0_cocci.parameter_list inout;
-      rebuilder_statement : Ast0_cocci.statement inout;
-      rebuilder_case_line : Ast0_cocci.case_line inout;
-      rebuilder_top_level : Ast0_cocci.top_level inout;
-      rebuilder_expression_dots :
-       Ast0_cocci.expression Ast0_cocci.dots ->
-         Ast0_cocci.expression Ast0_cocci.dots;
-         rebuilder_statement_dots :
-           Ast0_cocci.statement Ast0_cocci.dots ->
-             Ast0_cocci.statement Ast0_cocci.dots;
-         rebuilder_declaration_dots :
-           Ast0_cocci.declaration Ast0_cocci.dots ->
-             Ast0_cocci.declaration Ast0_cocci.dots;
-         rebuilder_case_line_dots :
-           Ast0_cocci.case_line Ast0_cocci.dots ->
-             Ast0_cocci.case_line Ast0_cocci.dots;
-          rebuilder_anything : Ast0_cocci.anything -> Ast0_cocci.anything}
-
-type 'mc rmcode = 'mc Ast0_cocci.mcode inout
-type 'cd rcode = rebuilder -> ('cd inout) -> 'cd inout
-
-val rebuilder :
-    ((string*string) rmcode) ->
-    (string rmcode) ->
-    (Ast_cocci.constant rmcode) ->
-    (Ast_cocci.assignOp rmcode) ->
-    (Ast_cocci.fixOp rmcode) ->
-    (Ast_cocci.unaryOp rmcode) ->
-    (Ast_cocci.binaryOp rmcode) ->
-    (Ast_cocci.const_vol rmcode) ->
-    (Ast_cocci.sign rmcode) ->
-    (Ast_cocci.structUnion rmcode) ->
-    (Ast_cocci.storage rmcode) ->
-    (Ast_cocci.inc_file rmcode) ->
-    (Ast0_cocci.expression Ast0_cocci.dots rcode) ->
-    (Ast0_cocci.initialiser Ast0_cocci.dots rcode) ->
-    (Ast0_cocci.parameterTypeDef Ast0_cocci.dots rcode) ->
-    (Ast0_cocci.statement Ast0_cocci.dots rcode) ->
-    (Ast0_cocci.declaration Ast0_cocci.dots rcode) ->
-    (Ast0_cocci.case_line Ast0_cocci.dots rcode) ->
-    (Ast0_cocci.ident rcode) ->
-    (Ast0_cocci.expression rcode) ->
-    (Ast0_cocci.typeC rcode) ->
-    (Ast0_cocci.initialiser rcode) ->
-    (Ast0_cocci.parameterTypeDef rcode) ->
-    (Ast0_cocci.declaration rcode) ->
-    (Ast0_cocci.statement rcode) ->
-    (Ast0_cocci.case_line rcode) ->
-    (Ast0_cocci.top_level rcode) ->
-    rebuilder
+val combiner_functions : 'a Visitor_ast0_types.combiner_functions
+val combiner :
+  ('a -> 'a -> 'a) ->
+  'a -> 'a Visitor_ast0_types.combiner_functions ->
+    'a Visitor_ast0_types.combiner_rec_functions
+
+val flat_combiner :
+    ('a -> 'a -> 'a) -> 'a ->
+    ((string*string,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((string,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast_cocci.constant,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast_cocci.assignOp,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast_cocci.fixOp,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast_cocci.unaryOp,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast_cocci.binaryOp,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast_cocci.const_vol,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast_cocci.sign,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast_cocci.structUnion,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast_cocci.storage,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast_cocci.inc_file,'a) Visitor_ast0_types.flat_cmcode) ->
+    ((Ast0_cocci.expression Ast0_cocci.dots,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.initialiser Ast0_cocci.dots,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.parameterTypeDef Ast0_cocci.dots,'a)
+       Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.statement Ast0_cocci.dots,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.declaration Ast0_cocci.dots,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.case_line Ast0_cocci.dots,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.ident,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.expression,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.typeC,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.initialiser,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.parameterTypeDef,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.declaration,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.statement,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.case_line,'a) Visitor_ast0_types.ccode) ->
+    ((Ast0_cocci.top_level,'a) Visitor_ast0_types.ccode) ->
+    'a Visitor_ast0_types.combiner_rec_functions
+
+val rebuilder_functions : Visitor_ast0_types.rebuilder_functions
+val rebuilder : Visitor_ast0_types.rebuilder_functions ->
+  Visitor_ast0_types.rebuilder_rec_functions
+
+val flat_rebuilder :
+    ((string*string) Visitor_ast0_types.rmcode) ->
+    (string Visitor_ast0_types.rmcode) ->
+    (Ast_cocci.constant Visitor_ast0_types.rmcode) ->
+    (Ast_cocci.assignOp Visitor_ast0_types.rmcode) ->
+    (Ast_cocci.fixOp Visitor_ast0_types.rmcode) ->
+    (Ast_cocci.unaryOp Visitor_ast0_types.rmcode) ->
+    (Ast_cocci.binaryOp Visitor_ast0_types.rmcode) ->
+    (Ast_cocci.const_vol Visitor_ast0_types.rmcode) ->
+    (Ast_cocci.sign Visitor_ast0_types.rmcode) ->
+    (Ast_cocci.structUnion Visitor_ast0_types.rmcode) ->
+    (Ast_cocci.storage Visitor_ast0_types.rmcode) ->
+    (Ast_cocci.inc_file Visitor_ast0_types.rmcode) ->
+    (Ast0_cocci.expression Ast0_cocci.dots Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.initialiser Ast0_cocci.dots Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.parameterTypeDef Ast0_cocci.dots Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.statement Ast0_cocci.dots Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.declaration Ast0_cocci.dots Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.case_line Ast0_cocci.dots Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.ident Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.expression Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.typeC Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.initialiser Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.parameterTypeDef Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.declaration Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.statement Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.case_line Visitor_ast0_types.rcode) ->
+    (Ast0_cocci.top_level Visitor_ast0_types.rcode) ->
+      Visitor_ast0_types.rebuilder_rec_functions
+
+val combiner_rebuilder_functions :
+    'a Visitor_ast0_types.combiner_rebuilder_functions
+val combiner_rebuilder :
+  ('a -> 'a -> 'a) -> 'a ->
+    'a Visitor_ast0_types.combiner_rebuilder_functions ->
+      'a Visitor_ast0_types.all_functions
diff --git a/parsing_cocci/visitor_ast0_types.ml b/parsing_cocci/visitor_ast0_types.ml
new file mode 100644 (file)
index 0000000..a679616
--- /dev/null
@@ -0,0 +1,181 @@
+module Ast0 = Ast0_cocci
+module Ast = Ast_cocci
+
+type ('a,'n) inout = 'a -> ('n * 'a)
+
+type 'n all_functions =
+    {ident : (Ast0.ident,'n) inout;
+      expression : (Ast0.expression,'n) inout;
+      typeC : (Ast0.typeC,'n) inout;
+      declaration : (Ast0.declaration,'n) inout;
+      initialiser : (Ast0.initialiser,'n) inout;
+      initialiser_list : (Ast0.initialiser_list,'n) inout;
+      parameter : (Ast0.parameterTypeDef,'n) inout;
+      parameter_list : (Ast0.parameter_list,'n) inout;
+      statement : (Ast0.statement,'n) inout;
+      case_line : (Ast0.case_line,'n) inout;
+      top_level : (Ast0.top_level,'n) inout;
+      expression_dots : (Ast0.expression Ast0.dots,'n) inout;
+      statement_dots : (Ast0.statement Ast0.dots,'n) inout;
+      declaration_dots : (Ast0.declaration Ast0.dots,'n) inout;
+      case_line_dots : (Ast0.case_line Ast0.dots,'n) inout;
+      anything : (Ast0.anything,'n) inout}
+
+(* ----------------------------------------------------------------------- *)
+(* combiner *)
+
+type ('a,'n) combiner_inout = 'a -> 'n
+
+type 'n combiner_rec_functions =
+    {combiner_rec_ident : (Ast0.ident,'n) combiner_inout;
+      combiner_rec_expression : (Ast0.expression,'n) combiner_inout;
+      combiner_rec_typeC : (Ast0.typeC,'n) combiner_inout;
+      combiner_rec_declaration : (Ast0.declaration,'n) combiner_inout;
+      combiner_rec_initialiser : (Ast0.initialiser,'n) combiner_inout;
+      combiner_rec_initialiser_list :
+       (Ast0.initialiser_list,'n) combiner_inout;
+      combiner_rec_parameter : (Ast0.parameterTypeDef,'n) combiner_inout;
+      combiner_rec_parameter_list : (Ast0.parameter_list,'n) combiner_inout;
+      combiner_rec_statement : (Ast0.statement,'n) combiner_inout;
+      combiner_rec_case_line : (Ast0.case_line,'n) combiner_inout;
+      combiner_rec_top_level : (Ast0.top_level,'n) combiner_inout;
+      combiner_rec_expression_dots :
+       (Ast0.expression Ast0.dots,'n) combiner_inout;
+      combiner_rec_statement_dots :
+       (Ast0.statement Ast0.dots,'n) combiner_inout;
+      combiner_rec_declaration_dots :
+       (Ast0.declaration Ast0.dots,'n) combiner_inout;
+      combiner_rec_case_line_dots :
+       (Ast0.case_line Ast0.dots,'n) combiner_inout;
+      combiner_rec_anything : (Ast0.anything,'n) combiner_inout}
+
+type ('mc,'n) cmcode = 'n -> 'mc Ast0.mcode -> 'n
+type ('mc,'n) flat_cmcode = 'mc Ast0.mcode -> 'n
+type ('cd,'n) ccode = 'n combiner_rec_functions -> ('cd -> 'n) -> 'cd -> 'n
+
+type 'n combiner_functions =
+  {combiner_meta_mcode : ((string*string),'n) cmcode;
+   combiner_string_mcode : (string,'n) cmcode;
+   combiner_const_mcode : (Ast.constant,'n) cmcode;
+   combiner_assign_mcode : (Ast.assignOp,'n) cmcode;
+   combiner_fix_mcode : (Ast.fixOp,'n) cmcode;
+   combiner_unary_mcode : (Ast.unaryOp,'n) cmcode;
+   combiner_binary_mcode : (Ast.binaryOp,'n) cmcode;
+   combiner_cv_mcode : (Ast.const_vol,'n) cmcode;
+   combiner_sign_mcode : (Ast.sign,'n) cmcode;
+   combiner_struct_mcode : (Ast.structUnion,'n) cmcode;
+   combiner_storage_mcode : (Ast.storage,'n) cmcode;
+   combiner_inc_mcode : (Ast.inc_file,'n) cmcode;
+   combiner_dotsexprfn : (Ast0.expression Ast0.dots,'n) ccode;
+   combiner_dotsinitfn : (Ast0.initialiser Ast0.dots,'n) ccode;
+   combiner_dotsparamfn : (Ast0.parameterTypeDef Ast0.dots,'n) ccode;
+   combiner_dotsstmtfn : (Ast0.statement Ast0.dots,'n) ccode;
+   combiner_dotsdeclfn : (Ast0.declaration Ast0.dots,'n) ccode;
+   combiner_dotscasefn : (Ast0.case_line Ast0.dots,'n) ccode;
+   combiner_identfn : (Ast0.ident,'n) ccode;
+   combiner_exprfn : (Ast0.expression,'n) ccode;
+   combiner_tyfn : (Ast0.typeC,'n) ccode;
+   combiner_initfn : (Ast0.initialiser,'n) ccode;
+   combiner_paramfn : (Ast0.parameterTypeDef,'n) ccode;
+   combiner_declfn : (Ast0.declaration,'n) ccode;
+   combiner_stmtfn : (Ast0.statement,'n) ccode;
+   combiner_casefn : (Ast0.case_line,'n) ccode;
+   combiner_topfn : (Ast0.top_level,'n) ccode}
+
+(* ----------------------------------------------------------------------- *)
+(* rebuilder *)
+
+type 'a rebuilder_inout = 'a -> 'a
+
+type rebuilder_rec_functions =
+    {rebuilder_rec_ident : Ast0.ident rebuilder_inout;
+      rebuilder_rec_expression : Ast0.expression rebuilder_inout;
+      rebuilder_rec_typeC : Ast0.typeC rebuilder_inout;
+      rebuilder_rec_declaration : Ast0.declaration rebuilder_inout;
+      rebuilder_rec_initialiser : Ast0.initialiser rebuilder_inout;
+      rebuilder_rec_initialiser_list :
+       Ast0.initialiser_list rebuilder_inout;
+      rebuilder_rec_parameter : Ast0.parameterTypeDef rebuilder_inout;
+      rebuilder_rec_parameter_list : Ast0.parameter_list rebuilder_inout;
+      rebuilder_rec_statement : Ast0.statement rebuilder_inout;
+      rebuilder_rec_case_line : Ast0.case_line rebuilder_inout;
+      rebuilder_rec_top_level : Ast0.top_level rebuilder_inout;
+      rebuilder_rec_expression_dots :
+       Ast0.expression Ast0.dots rebuilder_inout;
+      rebuilder_rec_statement_dots :
+       Ast0.statement Ast0.dots rebuilder_inout;
+      rebuilder_rec_declaration_dots :
+       Ast0.declaration Ast0.dots rebuilder_inout;
+      rebuilder_rec_case_line_dots :
+       Ast0.case_line Ast0.dots rebuilder_inout;
+      rebuilder_rec_anything : Ast0.anything rebuilder_inout}
+
+type 'mc rmcode = 'mc Ast0.mcode rebuilder_inout
+type 'cd rcode =
+    rebuilder_rec_functions -> ('cd rebuilder_inout) -> 'cd rebuilder_inout
+
+type rebuilder_functions =
+  {rebuilder_meta_mcode : (string*string) rmcode;
+   rebuilder_string_mcode : string rmcode;
+   rebuilder_const_mcode : Ast.constant rmcode;
+   rebuilder_assign_mcode : Ast.assignOp rmcode;
+   rebuilder_fix_mcode : Ast.fixOp rmcode;
+   rebuilder_unary_mcode : Ast.unaryOp rmcode;
+   rebuilder_binary_mcode : Ast.binaryOp rmcode;
+   rebuilder_cv_mcode : Ast.const_vol rmcode;
+   rebuilder_sign_mcode : Ast.sign rmcode;
+   rebuilder_struct_mcode : Ast.structUnion rmcode;
+   rebuilder_storage_mcode : Ast.storage rmcode;
+   rebuilder_inc_mcode : Ast.inc_file rmcode;
+   rebuilder_dotsexprfn : Ast0.expression Ast0.dots rcode;
+   rebuilder_dotsinitfn : Ast0.initialiser Ast0.dots rcode;
+   rebuilder_dotsparamfn : Ast0.parameterTypeDef Ast0.dots rcode;
+   rebuilder_dotsstmtfn : Ast0.statement Ast0.dots rcode;
+   rebuilder_dotsdeclfn : Ast0.declaration Ast0.dots rcode;
+   rebuilder_dotscasefn : Ast0.case_line Ast0.dots rcode;
+   rebuilder_identfn : Ast0.ident rcode;
+   rebuilder_exprfn : Ast0.expression rcode;
+   rebuilder_tyfn : Ast0.typeC rcode;
+   rebuilder_initfn : Ast0.initialiser rcode;
+   rebuilder_paramfn : Ast0.parameterTypeDef rcode;
+   rebuilder_declfn : Ast0.declaration rcode;
+   rebuilder_stmtfn : Ast0.statement rcode;
+   rebuilder_casefn : Ast0.case_line rcode;
+   rebuilder_topfn : Ast0.top_level rcode}
+
+(* ----------------------------------------------------------------------- *)
+(* combiner_rebuilder *)
+
+type ('mc,'a) rcmcode = 'a -> 'mc Ast0.mcode -> ('a * 'mc Ast0.mcode)
+type ('cd,'a) rccode =
+    'a all_functions -> ('cd -> ('a * 'cd)) -> 'cd -> ('a * 'cd)
+
+type 'n combiner_rebuilder_functions =
+  {combiner_rebuilder_meta_mcode : ((string*string),'n) rcmcode;
+   combiner_rebuilder_string_mcode : (string,'n) rcmcode;
+   combiner_rebuilder_const_mcode : (Ast.constant,'n) rcmcode;
+   combiner_rebuilder_assign_mcode : (Ast.assignOp,'n) rcmcode;
+   combiner_rebuilder_fix_mcode : (Ast.fixOp,'n) rcmcode;
+   combiner_rebuilder_unary_mcode : (Ast.unaryOp,'n) rcmcode;
+   combiner_rebuilder_binary_mcode : (Ast.binaryOp,'n) rcmcode;
+   combiner_rebuilder_cv_mcode : (Ast.const_vol,'n) rcmcode;
+   combiner_rebuilder_sign_mcode : (Ast.sign,'n) rcmcode;
+   combiner_rebuilder_struct_mcode : (Ast.structUnion,'n) rcmcode;
+   combiner_rebuilder_storage_mcode : (Ast.storage,'n) rcmcode;
+   combiner_rebuilder_inc_mcode : (Ast.inc_file,'n) rcmcode;
+   combiner_rebuilder_dotsexprfn : (Ast0.expression Ast0.dots,'n) rccode;
+   combiner_rebuilder_dotsinitfn : (Ast0.initialiser Ast0.dots,'n) rccode;
+   combiner_rebuilder_dotsparamfn :
+      (Ast0.parameterTypeDef Ast0.dots,'n) rccode;
+   combiner_rebuilder_dotsstmtfn : (Ast0.statement Ast0.dots,'n) rccode;
+   combiner_rebuilder_dotsdeclfn : (Ast0.declaration Ast0.dots,'n) rccode;
+   combiner_rebuilder_dotscasefn : (Ast0.case_line Ast0.dots,'n) rccode;
+   combiner_rebuilder_identfn : (Ast0.ident,'n) rccode;
+   combiner_rebuilder_exprfn : (Ast0.expression,'n) rccode;
+   combiner_rebuilder_tyfn : (Ast0.typeC,'n) rccode;
+   combiner_rebuilder_initfn : (Ast0.initialiser,'n) rccode;
+   combiner_rebuilder_paramfn : (Ast0.parameterTypeDef,'n) rccode;
+   combiner_rebuilder_declfn : (Ast0.declaration,'n) rccode;
+   combiner_rebuilder_stmtfn : (Ast0.statement,'n) rccode;
+   combiner_rebuilder_casefn : (Ast0.case_line,'n) rccode;
+   combiner_rebuilder_topfn : (Ast0.top_level,'n) rccode}
diff --git a/popl/Makefile b/popl/Makefile
deleted file mode 100644 (file)
index e7968f3..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-# Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-# Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-# This file is part of Coccinelle.
-# 
-# Coccinelle is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, according to version 2 of the License.
-# 
-# Coccinelle is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-# 
-# The authors reserve the right to distribute this or future versions of
-# Coccinelle under other licenses.
-
-
-#note: if you add a file (a .mli or .ml), dont forget to do a   make depend
-
--include ../Makefile.config
-
-TARGET = popl
-
-SRC = ast_popl.ml asttopopl.ml insert_quantifiers.ml insert_befaft.ml \
-pretty_print_popl.ml popltoctl.ml popl.ml flag_popl.ml
-
-SYSLIBS=str.cma unix.cma
-LIBS=../commons/commons.cma ../globals/globals.cma
-
-INCLUDE_PATH = -I ../commons -I ../globals \
-              -I ../ctl -I ../parsing_c -I ../parsing_cocci -I ../engine
-
-#The Caml compilers.
-#for warning:  -w A 
-#for profiling:  -p -inline 0   with OCAMLOPT
-CAMLC =ocamlc$(OPTBIN) -dtypes -g 
-CAMLOPT=ocamlopt$(OPTBIN)   $(OPTFLAGS)
-CAMLLEX = ocamllex$(OPTBIN)
-CAMLYACC= ocamlyacc
-CAMLDEP = ocamldep$(OPTBIN) 
-CAMLMKTOP=ocamlmktop -g -custom
-
-
-
-LIB=$(TARGET).cma
-OPTLIB=$(LIB:.cma=.cmxa)
-
-OBJS = $(SRC:.ml=.cmo)
-OPTOBJS = $(SRC:.ml=.cmx)
-
-all: $(LIB)
-all.opt: $(OPTLIB)
-
-$(TARGET).top: $(LIB)
-       $(CAMLMKTOP) -o $(TARGET).top $(SYSLIBS) $(LIBS) $(OBJS)
-
-$(LIB):  $(OBJS)
-       $(CAMLC) -a -o $(LIB) $(OBJS)
-
-clean::
-       rm -f $(LIB) $(TARGET).top
-
-
-$(OPTLIB): $(OPTOBJS)
-       $(CAMLOPT) -a -o $(OPTLIB) $(OPTOBJS)
-
-# clean rule for LIB.opt
-clean::
-       rm -f $(OPTLIB) $(LIB:.cma=.a)  
-
-
-.SUFFIXES:
-.SUFFIXES: .ml .mli .cmo .cmi .cmx
-
-.ml.cmo:
-       $(CAMLC) $(INCLUDE_PATH) -c $<
-
-.mli.cmi:
-       $(CAMLC) $(INCLUDE_PATH) -c $<
-
-.ml.cmx:
-       $(CAMLOPT) $(INCLUDE_PATH) -c $<
-
-
-
-
-# clean rule for others files
-clean::
-       rm -f *.cm[iox] *.o *.annot
-       rm -f *~ .*~ #*# 
-
-depend: 
-       $(CAMLDEP) $(INCLUDE_PATH) *.mli *.ml > .depend
-
-#clean::
-#      rm -f .depend
-
-.depend:
-       $(CAMLDEP) $(INCLUDE_PATH) *.mli *.ml > .depend
-
--include .depend
diff --git a/popl/ast_popl.ml b/popl/ast_popl.ml
deleted file mode 100644 (file)
index 8a0e475..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-type sequence =
-    Seq of element * sequence
-  | Empty
-  | SExists of Ast_cocci.meta_name * sequence
-
-and element =
-    Term of Ast_cocci.rule_elem
-  | Or of sequence * sequence
-  | DInfo of dots * element list (* before *) * element list (* after *)
-  | EExists of Ast_cocci.meta_name * element
-
-and dots = 
-    Dots
-  | Nest of sequence
-  | When of dots * sequence
-  | DExists of Ast_cocci.meta_name * dots
diff --git a/popl/asttopopl.ml b/popl/asttopopl.ml
deleted file mode 100644 (file)
index 6f1d840..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-module Ast = Ast_cocci
-module Past = Ast_popl
-
-(* --------------------------------------------------------------------- *)
-
-let rec stm s =
-  match Ast.unwrap s with
-    Ast.Atomic(ast) ->
-      (match Ast.unwrap ast with
-       Ast.ExprStatement(_,_) -> Past.Term ast
-      |        Ast.Exp(_) -> Past.Term ast
-      |        Ast.Decl(_,_,_) -> Past.Term ast
-      |        _ -> failwith "complex statements not supported")
-  | Ast.Disj(stm1::stm2::stmts) ->
-      List.fold_left
-       (function prev ->
-         function cur ->
-           Past.Or(Past.Seq(prev,Past.Empty),stm_list cur))
-       (Past.Or(stm_list stm1,stm_list stm2)) stmts
-  | Ast.Dots(dots,whencodes,_,_) ->
-      (match whencodes with
-       [Ast.WhenNot(a)] -> Past.DInfo(Past.When(Past.Dots,stm_list a),[],[])
-      |        _ -> failwith "only one when != supported")
-  | Ast.Nest(stmt_dots,whencodes,false,_,_) ->
-      let nest = Past.Nest(stm_list stmt_dots) in
-      (match whencodes with
-       [Ast.WhenNot(a)] -> Past.DInfo(Past.When(nest,stm_list a),[],[])
-      |        _ -> failwith "only when != supported")
-  | Ast.While(header,body,(_,_,_,aft)) | Ast.For(header,body,(_,_,_,aft)) ->
-      (* only allowed if only the header is significant *)
-      (match (Ast.unwrap body,aft) with
-       (Ast.Atomic(re),Ast.CONTEXT(_,Ast.NOTHING)) ->
-         (match Ast.unwrap re with
-           Ast.MetaStmt(_,Type_cocci.Unitary,_,false) -> Past.Term header
-         | _ -> failwith "unsupported statement1")
-      | _ -> failwith "unsupported statement2")
-  | _ ->
-      Pretty_print_cocci.statement "" s;
-      failwith "unsupported statement3"
-
-and stm_list s =
-  match Ast.unwrap s with
-    Ast.DOTS(d) ->
-      List.fold_right
-       (function cur -> function rest -> Past.Seq(stm cur, rest))
-       d Past.Empty
-  | _ -> failwith "only DOTS handled"
-
-let top s =
-  match Ast.unwrap s with
-    Ast.CODE(stmt_dots) -> stm_list stmt_dots
-  | _ -> failwith "only CODE handled"
diff --git a/popl/asttopopl.mli b/popl/asttopopl.mli
deleted file mode 100644 (file)
index 5d8e4b1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-val top : Ast_cocci.top_level -> Ast_popl.sequence
diff --git a/popl/insert_befaft.ml b/popl/insert_befaft.ml
deleted file mode 100644 (file)
index c5294f2..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-module Past = Ast_popl
-
-(* --------------------------------------------------------------------- *)
-
-let rec get_before a = function
-    Past.Seq(elem,seq) ->
-      let (elem,ea) = get_before_element a elem in
-      let (seq,sla) = get_before ea seq in
-      (Past.Seq(elem,seq),sla)
-  | Past.Empty -> (Past.Empty,a)
-  | Past.SExists(var,seq) -> failwith "not possible"
-
-and get_before_element a = function
-    Past.Term(term) as s -> (s,[s])
-  | Past.Or(seq1,seq2) ->
-      let (seq1,seq1a) = get_before a seq1 in
-      let (seq2,seq2a) = get_before a seq2 in
-      (Past.Or(seq1,seq2),Common.union_set seq1a seq2a)
-  | Past.DInfo(dots,_,seq_aft) ->
-      let dots = get_before_dots a dots in
-      (Past.DInfo(dots,a,seq_aft),a)
-  | Past.EExists(var,seq) -> failwith "not possible"
-
-and get_before_dots a = function
-    Past.Dots -> Past.Dots
-  | Past.Nest(seq) ->
-      let (seq,_) = get_before a seq in
-      Past.Nest(seq)
-  | Past.When(dots,seq) ->
-      let dots = get_before_dots a dots in
-      let (seq,_) = get_before [] seq in
-      Past.When(dots,seq)
-  | Past.DExists(var,dots) -> failwith "not possible"
-
-(* --------------------------------------------------------------------- *)
-
-let rec get_after a = function
-    Past.Seq(elem,seq) ->
-      let (seq,sla) = get_after a seq in
-      let (elem,ea) = get_after_element sla elem in
-      (Past.Seq(elem,seq),ea)
-  | Past.Empty -> (Past.Empty,a)
-  | Past.SExists(var,seq) -> failwith "not possible"
-
-and get_after_element a = function
-    Past.Term(term) as s -> (s,[s])
-  | Past.Or(seq1,seq2) ->
-      let (seq1,seq1a) = get_after a seq1 in
-      let (seq2,seq2a) = get_after a seq2 in
-      (Past.Or(seq1,seq2),Common.union_set seq1a seq2a)
-  | Past.DInfo(dots,seq_bef,_) ->
-      let dots = get_after_dots a dots in
-      (Past.DInfo(dots,seq_bef,a),a)
-  | Past.EExists(var,seq) -> failwith "not possible"
-
-and get_after_dots a = function
-    Past.Dots -> Past.Dots
-  | Past.Nest(seq) ->
-      let (seq,_) = get_after (Common.union_set (get_first [] seq) a) seq in
-      Past.Nest(seq)
-  | Past.When(dots,seq) ->
-      let dots = get_after_dots a dots in
-      let (seq,_) = get_after [] seq in
-      Past.When(dots,seq)
-  | Past.DExists(var,dots) -> failwith "not possible"
-
-(* --------------------------------------------------------------------- *)
-(* like get_after, but just returns the a component; doesn't modify the term *)
-
-and get_first a = function
-    Past.Seq(elem,seq) ->
-      let sla = get_first a seq in
-      let ea  = get_first_element sla elem in
-      ea
-  | Past.Empty -> a
-  | Past.SExists(var,seq) -> failwith "not possible"
-
-and get_first_element a = function
-    Past.Term(term) as s -> [s]
-  | Past.Or(seq1,seq2) ->
-      Common.union_set (get_first a seq1) (get_first a seq2)
-  | Past.DInfo(dots,_,_) -> a
-  | Past.EExists(var,seq) -> failwith "not possible"
-
-(* --------------------------------------------------------------------- *)
-(* Entry point *)
-
-let insert_befaft sl =
-  let (sl,_) = get_before [] sl in
-  let (sl,_) = get_after [] sl in
-  sl
diff --git a/popl/insert_befaft.mli b/popl/insert_befaft.mli
deleted file mode 100644 (file)
index eea1354..0000000
+++ /dev/null
@@ -1 +0,0 @@
-val insert_befaft : Ast_popl.sequence -> Ast_popl.sequence
diff --git a/popl/insert_quantifiers.ml b/popl/insert_quantifiers.ml
deleted file mode 100644 (file)
index a982efa..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-module Ast = Ast_cocci
-module Past = Ast_popl
-
-(* --------------------------------------------------------------------- *)
-
-let rec fvs_sequence = function
-    Past.Seq(elem,seq) ->
-      Common.union_set (fvs_element elem) (fvs_sequence seq)
-  | Past.Empty -> []
-  | Past.SExists(var,seq) -> failwith "not possible"
-
-and fvs_element = function
-    Past.Term(term) -> Ast.get_fvs term
-  | Past.Or(seq1,seq2) ->
-      Common.union_set (fvs_sequence seq1) (fvs_sequence seq2)
-  | Past.DInfo(dots,seq_bef,seq_aft) ->
-      List.fold_left
-       (function prev ->
-         function cur ->
-           Common.union_set (fvs_element cur) prev)
-      (fvs_dots dots) seq_bef
-  | Past.EExists(var,seq) -> failwith "not possible"
-
-and fvs_dots = function
-    Past.Dots -> []
-  | Past.Nest(seq) -> fvs_sequence seq
-  | Past.When(dots,seq) -> Common.union_set (fvs_dots dots) (fvs_sequence seq)
-  | Past.DExists(var,dots) -> failwith "not possible"
-
-(* --------------------------------------------------------------------- *)
-
-let rec quant_sequence bound = function
-    Past.Seq(elem,seq) ->
-      let fe = fvs_element elem in
-      let fs = fvs_sequence seq in
-      let inter = Common.inter_set fe fs in
-      let free = Common.minus_set inter bound in
-      let new_bound = free @ bound in
-      List.fold_right (function cur -> function rest -> Past.SExists(cur,rest))
-       free (Past.Seq(quant_element new_bound elem,
-                      quant_sequence new_bound seq))
-  | Past.Empty -> Past.Empty
-  | Past.SExists(var,seq) -> failwith "not possible"
-
-and quant_element bound = function
-    Past.Term(term) as x ->
-      let free = Common.minus_set (fvs_element x) bound in
-      List.fold_right (function cur -> function rest -> Past.EExists(cur,rest))
-       free x
-  | Past.Or(seq1,seq2) ->
-      Past.Or(quant_sequence bound seq1,quant_sequence bound seq2)
-  | Past.DInfo(dots,seq_bef,seq_aft) ->
-      Past.DInfo(quant_dots bound dots,seq_bef,
-                List.map (quant_element bound) seq_aft)
-  | Past.EExists(var,seq) -> failwith "not possible"
-
-and quant_dots bound = function
-    Past.Dots -> Past.Dots
-  | Past.Nest(seq) -> Past.Nest(quant_sequence bound seq)
-  | Past.When(dots,seq) ->
-      let fd = fvs_dots dots in
-      let fs = fvs_sequence seq in
-      let inter = Common.inter_set fd fs in
-      let free = Common.minus_set inter bound in
-      let new_bound = free @ bound in
-      List.fold_right (function cur -> function rest -> Past.DExists(cur,rest))
-       free (Past.When(quant_dots new_bound dots,
-                       quant_sequence new_bound seq))
-  | Past.DExists(var,dots) -> failwith "not possible"
-
-(* --------------------------------------------------------------------- *)
-
-let insert_quantifiers x = quant_sequence [] x
diff --git a/popl/insert_quantifiers.mli b/popl/insert_quantifiers.mli
deleted file mode 100644 (file)
index b8eef27..0000000
+++ /dev/null
@@ -1 +0,0 @@
-val insert_quantifiers : Ast_popl.sequence -> Ast_popl.sequence
diff --git a/popl/popl.ml b/popl/popl.ml
deleted file mode 100644 (file)
index 4be03ce..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
-type formula =
-    (cocci_predicate,Ast_cocci.meta_name, Wrapper_ctl.info) Ast_ctl.generic_ctl
-
-let poplz (name,_,ast) =
-  match ast with
-    [ast] ->
-      let ast = Asttopopl.top ast in
-      let ba = Insert_befaft.insert_befaft ast in
-      let qt = Insert_quantifiers.insert_quantifiers ba in
-      [Popltoctl.toctl qt]
-  | _ -> failwith "only one rule allowed"
-
-let popl r =
-  match r with
-    Ast_cocci.CocciRule (a,b,c) -> poplz (a,b,c)
-  | _ -> []
diff --git a/popl/popl.mli b/popl/popl.mli
deleted file mode 100644 (file)
index 4a7fd49..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
-type formula =
-    (cocci_predicate,Ast_cocci.meta_name, Wrapper_ctl.info) Ast_ctl.generic_ctl
-
-val popl : Ast_cocci.rule -> formula list
diff --git a/popl/popltoctl.ml b/popl/popltoctl.ml
deleted file mode 100644 (file)
index c3e02ba..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-module Past = Ast_popl
-module Ast = Ast_cocci
-module V = Visitor_ast
-module CTL  = Ast_ctl
-
-(* --------------------------------------------------------------------- *)
-(* result type *)
-
-type cocci_predicate = Lib_engine.predicate * Ast.meta_name Ast_ctl.modif
-type formula =
-    (cocci_predicate,Ast_cocci.meta_name, Wrapper_ctl.info) Ast_ctl.generic_ctl
-
-(* --------------------------------------------------------------------- *)
-
-let contains_modif =
-  let bind x y = x or y in
-  let option_default = false in
-  let mcode r (_,_,kind,_) =
-    match kind with
-      Ast.MINUS(_,_) -> true
-    | Ast.PLUS -> failwith "not possible"
-    | Ast.CONTEXT(_,info) -> not (info = Ast.NOTHING) in
-  let do_nothing r k e = k e in
-  let rule_elem r k re =
-    let res = k re in
-    match Ast.unwrap re with
-      Ast.FunHeader(bef,_,fninfo,name,lp,params,rp) ->
-      bind (mcode r ((),(),bef,Ast.NoMetaPos)) res
-    | Ast.Decl(bef,_,decl) -> bind (mcode r ((),(),bef,Ast.NoMetaPos)) res
-    | _ -> res in
-  let recursor =
-    V.combiner bind option_default
-      mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-      mcode
-      do_nothing do_nothing do_nothing do_nothing
-      do_nothing do_nothing do_nothing do_nothing do_nothing do_nothing
-      do_nothing rule_elem do_nothing do_nothing do_nothing do_nothing in
-  recursor.V.combiner_rule_elem
-
-let ctl_exists v x keep_wit = CTL.Exists(v,x,keep_wit)
-
-let predmaker guard term =
-  let pos = ("","_p") in
-  ctl_exists true pos
-    (if guard && contains_modif term
-    then
-      let v = ("","_v") in
-      ctl_exists true v
-       (CTL.Pred (Lib_engine.Match(term),CTL.Modif v))
-    else CTL.Pred (Lib_engine.Match(term),CTL.Control))
-
-(* --------------------------------------------------------------------- *)
-
-let is_true = function CTL.True -> true | _ -> false
-
-let is_false = function CTL.False -> true | _ -> false
-
-let ctl_true       = CTL.True
-
-let ctl_false      = CTL.False
-
-let ctl_and x y    =
-  if is_true x then y
-  else if is_true y then x else CTL.And(CTL.STRICT,x,y)
-
-let ctl_or x y     =
-  if is_false x then y
-  else if is_false y then x else CTL.Or(x,y)
-
-let ctl_seqor x y  = CTL.SeqOr(x,y)
-
-let ctl_not x      = CTL.Not(x)
-
-let ctl_ax x       =
-  if is_true x then CTL.True
-  else CTL.AX(CTL.FORWARD,CTL.STRICT,x)
-
-let after          = CTL.Pred(Lib_engine.After, CTL.Control)
-let exit           = CTL.Pred(Lib_engine.Exit, CTL.Control)
-let truepred       = CTL.Pred(Lib_engine.TrueBranch, CTL.Control)
-let retpred        = CTL.Pred(Lib_engine.Return, CTL.Control)
-
-let string2var x = ("",x)
-
-let labelctr = ref 0
-let get_label_ctr _ =
-  let cur = !labelctr in
-  labelctr := cur + 1;
-  string2var (Printf.sprintf "l%d" cur)
-
-let ctl_au x seq_after y =
-  let lv = get_label_ctr() in
-  let labelpred = CTL.Pred(Lib_engine.Label lv,CTL.Control) in
-  let preflabelpred = CTL.Pred(Lib_engine.PrefixLabel lv,CTL.Control) in
-  let matchgoto = CTL.Pred(Lib_engine.Goto,CTL.Control) in
-  let matchbreak =
-    predmaker false
-      (Ast.make_term
-        (Ast.Break(Ast.make_mcode "break",Ast.make_mcode ";"))) in
-  let matchcontinue =
-    predmaker false
-      (Ast.make_term
-        (Ast.Continue(Ast.make_mcode "continue",Ast.make_mcode ";"))) in
-  let stop_early =
-    ctl_or after
-      (ctl_and (ctl_and truepred labelpred)
-        (CTL.AU
-           (CTL.FORWARD,CTL.STRICT,preflabelpred,
-            ctl_and preflabelpred
-              (ctl_or retpred
-                 (ctl_and (ctl_or (ctl_or matchgoto matchbreak) matchcontinue)
-                       (CTL.AG
-                          (CTL.FORWARD,CTL.STRICT,
-                           ctl_not seq_after))))))) in
-  CTL.AU(CTL.FORWARD,CTL.STRICT,x,ctl_or y stop_early)
-
-let ctl_uncheck x  = CTL.Uncheck(x)
-
-(* --------------------------------------------------------------------- *)
-
-let rec ctl_seq keep_wit a = function
-    Past.Seq(elem,seq) ->
-      ctl_element keep_wit (ctl_seq keep_wit a seq) elem
-  | Past.Empty -> a
-  | Past.SExists(var,seq) -> ctl_exists keep_wit var (ctl_seq keep_wit a seq)
-
-and ctl_element keep_wit a = function
-    Past.Term(term) -> ctl_and (predmaker keep_wit term) (ctl_ax a)
-  | Past.Or(seq1,seq2) ->
-      ctl_seqor (ctl_seq keep_wit a seq1) (ctl_seq keep_wit a seq2)
-  | Past.DInfo(dots,seq_bef,seq_aft) ->
-      let shortest l =
-       List.fold_left ctl_or ctl_false
-         (List.map (ctl_element false ctl_true) l) in
-      let s = shortest (Common.union_set seq_bef seq_aft) in
-      ctl_au (ctl_and (guard_ctl_dots keep_wit dots) (ctl_not s))
-       (shortest seq_aft) a
-  | Past.EExists(var,elem) ->
-      ctl_exists keep_wit var (ctl_element keep_wit a elem)
-
-(* --------------------------------------------------------------------- *)
-
-and guard_ctl_seq keep_wit = function
-    Past.Seq(elem,Past.Empty) -> guard_ctl_element keep_wit elem
-  | Past.Seq(elem,seq) ->
-      ctl_element keep_wit (guard_ctl_seq keep_wit seq) elem
-  | Past.Empty -> ctl_true
-  | Past.SExists(var,seq) ->
-      ctl_exists keep_wit var (guard_ctl_seq keep_wit seq)
-
-and guard_ctl_element keep_wit = function
-    Past.Term(term) -> predmaker keep_wit term
-  | Past.Or(seq1,seq2) ->
-      ctl_seqor (guard_ctl_seq keep_wit seq1) (guard_ctl_seq keep_wit seq2)
-  | Past.DInfo(dots,seq_bef,seq_aft) ->
-      let shortest l =
-       List.fold_left ctl_or ctl_false
-         (List.map (ctl_element false ctl_true) l) in
-      let s = shortest (Common.union_set seq_bef seq_aft) in
-      let aft = ctl_or s exit in
-      ctl_au (ctl_and (guard_ctl_dots keep_wit dots) (ctl_not s))
-       (shortest seq_aft) aft
-  | Past.EExists(var,elem) ->
-      ctl_exists keep_wit var (guard_ctl_element keep_wit elem)
-
-and guard_ctl_dots keep_wit = function
-    Past.Dots -> ctl_true
-  | Past.Nest(_) when not keep_wit -> ctl_true
-  | Past.Nest(seq) ->
-      ctl_or (guard_ctl_seq true seq) (ctl_not (guard_ctl_seq false seq))
-  | Past.When(dots,seq) ->
-      ctl_and
-       (guard_ctl_dots keep_wit dots)
-       (ctl_not (ctl_seq false ctl_true seq))
-  | Past.DExists(var,dots) ->
-      ctl_exists keep_wit var (guard_ctl_dots keep_wit dots)
-
-(* --------------------------------------------------------------------- *)
-
-let toctl sl = ctl_seq true ctl_true sl
diff --git a/popl/popltoctl.mli b/popl/popltoctl.mli
deleted file mode 100644 (file)
index b1285d1..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
-type formula =
-    (cocci_predicate,Ast_cocci.meta_name, Wrapper_ctl.info) Ast_ctl.generic_ctl
-
-val toctl : Ast_popl.sequence -> formula
diff --git a/popl/pretty_print_popl.ml b/popl/pretty_print_popl.ml
deleted file mode 100644 (file)
index 9ea7f1e..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-open Format
-module Past = Ast_popl
-
-let start_block str =
-  force_newline(); print_string "  "; open_box 0
-
-let end_block str =
-  close_box(); force_newline ()
-
-(* --------------------------------------------------------------------- *)
-
-let rec print_sequence = function
-    Past.Seq(e,seq) -> print_element e; force_newline(); print_sequence seq
-  | Past.Empty -> ()
-  | Past.SExists((_,v),seq) -> print_string "exists "; print_string v;
-      print_string " ."; force_newline(); print_sequence seq
-
-and print_element = function
-    Past.Term(term) -> Pretty_print_cocci.rule_elem "" term
-  | Past.Or(seq1,seq2) ->
-      force_newline(); print_string "("; force_newline(); print_sequence seq1;
-      print_string "|"; force_newline(); print_sequence seq2; print_string ")"
-  | Past.DInfo(dots,bef,aft) ->
-      start_block();
-      List.iter
-       (function b -> print_string ">>>"; print_element b; force_newline())
-       bef;
-      print_dots dots;
-      List.iter
-       (function b -> force_newline(); print_string "<<<"; print_element b)
-       aft;
-      end_block()
-  | Past.EExists((_,v),elem) -> print_string "exists "; print_string v;
-      print_string " ."; force_newline(); print_element elem
-
-and print_dots = function
-    Past.Dots -> print_string "..."
-  | Past.Nest(seq)-> print_string "<..."; start_block(); print_sequence seq;
-      end_block(); print_string "...>"
-  | Past.When(dots,seq) -> print_dots dots; print_string " when != ";
-      open_box 0; print_sequence seq; close_box()
-  | Past.DExists((_,v),dots) -> print_string "exists "; print_string v;
-      print_string " ."; force_newline(); print_dots dots
-
-(* --------------------------------------------------------------------- *)
-
-let pretty_print_e e =
-  print_element e;
-  print_newline()
-
-let pretty_print sl =
-  print_sequence sl;
-  print_newline()
-
diff --git a/popl/pretty_print_popl.mli b/popl/pretty_print_popl.mli
deleted file mode 100644 (file)
index 5b3399a..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-val pretty_print : Ast_popl.sequence -> unit
-val pretty_print_e : Ast_popl.element -> unit
diff --git a/popl09/.depend b/popl09/.depend
deleted file mode 100644 (file)
index 687e676..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-asttopopl.cmi: ast_popl.cmo ../parsing_cocci/ast_cocci.cmi 
-insert_quantifiers.cmi: ast_popl.cmo 
-popl.cmi: ../ctl/wrapper_ctl.cmi ../engine/lib_engine.cmo ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi 
-popltoctl.cmi: ../ctl/wrapper_ctl.cmi ../engine/lib_engine.cmo ast_popl.cmo \
-    ../ctl/ast_ctl.cmo ../parsing_cocci/ast_cocci.cmi 
-pretty_print_popl.cmi: ast_popl.cmo 
-ast_popl.cmo: ../parsing_cocci/ast_cocci.cmi 
-ast_popl.cmx: ../parsing_cocci/ast_cocci.cmx 
-asttopopl.cmo: ../parsing_cocci/pretty_print_cocci.cmi ast_popl.cmo \
-    ../parsing_cocci/ast_cocci.cmi asttopopl.cmi 
-asttopopl.cmx: ../parsing_cocci/pretty_print_cocci.cmx ast_popl.cmx \
-    ../parsing_cocci/ast_cocci.cmx asttopopl.cmi 
-insert_quantifiers.cmo: ../commons/common.cmi ast_popl.cmo \
-    ../parsing_cocci/ast_cocci.cmi insert_quantifiers.cmi 
-insert_quantifiers.cmx: ../commons/common.cmx ast_popl.cmx \
-    ../parsing_cocci/ast_cocci.cmx insert_quantifiers.cmi 
-popl.cmo: ../ctl/wrapper_ctl.cmi popltoctl.cmi ../engine/lib_engine.cmo \
-    insert_quantifiers.cmi asttopopl.cmi ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi popl.cmi 
-popl.cmx: ../ctl/wrapper_ctl.cmx popltoctl.cmx ../engine/lib_engine.cmx \
-    insert_quantifiers.cmx asttopopl.cmx ../ctl/ast_ctl.cmx \
-    ../parsing_cocci/ast_cocci.cmx popl.cmi 
-popltoctl.cmo: ../ctl/wrapper_ctl.cmi ../parsing_cocci/visitor_ast.cmi \
-    ../engine/lib_engine.cmo flag_popl.cmo ast_popl.cmo ../ctl/ast_ctl.cmo \
-    ../parsing_cocci/ast_cocci.cmi popltoctl.cmi 
-popltoctl.cmx: ../ctl/wrapper_ctl.cmx ../parsing_cocci/visitor_ast.cmx \
-    ../engine/lib_engine.cmx flag_popl.cmx ast_popl.cmx ../ctl/ast_ctl.cmx \
-    ../parsing_cocci/ast_cocci.cmx popltoctl.cmi 
-pretty_print_popl.cmo: ../parsing_cocci/pretty_print_cocci.cmi ast_popl.cmo \
-    ../parsing_cocci/ast_cocci.cmi pretty_print_popl.cmi 
-pretty_print_popl.cmx: ../parsing_cocci/pretty_print_cocci.cmx ast_popl.cmx \
-    ../parsing_cocci/ast_cocci.cmx pretty_print_popl.cmi 
diff --git a/popl09/Makefile b/popl09/Makefile
deleted file mode 100644 (file)
index 21bd4ae..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-# Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-# Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-# This file is part of Coccinelle.
-# 
-# Coccinelle is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, according to version 2 of the License.
-# 
-# Coccinelle is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-# 
-# The authors reserve the right to distribute this or future versions of
-# Coccinelle under other licenses.
-
-
-#note: if you add a file (a .mli or .ml), dont forget to do a   make depend
-
--include ../Makefile.config
-TARGET = popl
-
-SRC = ast_popl.ml asttopopl.ml insert_quantifiers.ml \
-pretty_print_popl.ml flag_popl.ml popltoctl.ml popl.ml
-
-SYSLIBS=str.cma unix.cma
-LIBS=../commons/commons.cma ../globals/globals.cma
-
-INCLUDES = -I ../commons -I ../globals \
-              -I ../ctl -I ../parsing_cocci -I ../parsing_c  -I ../engine
-
-#The Caml compilers.
-#for warning:  -w A 
-#for profiling:  -p -inline 0   with OCAMLOPT
-OCAMLCFLAGS ?= -g -dtypes
-OCAMLC =ocamlc$(OPTBIN) $(OCAMLCFLAGS) $(INCLUDES)
-OCAMLOPT = ocamlopt$(OPTBIN) $(OPTFLAGS) $(INCLUDES)
-OCAMLDEP = ocamldep$(OPTBIN) $(INCLUDES)
-OCAMLMKTOP=ocamlmktop -g -custom
-
-
-
-LIB=$(TARGET).cma
-OPTLIB=$(LIB:.cma=.cmxa)
-
-OBJS = $(SRC:.ml=.cmo)
-OPTOBJS = $(SRC:.ml=.cmx)
-
-all: $(LIB)
-all.opt: $(OPTLIB)
-
-$(TARGET).top: $(LIB)
-       $(OCAMLMKTOP) -o $(TARGET).top $(SYSLIBS) $(LIBS) $(OBJS)
-
-$(LIB):  $(OBJS)
-       $(OCAMLC) -a -o $(LIB) $(OBJS)
-
-clean::
-       rm -f $(LIB) $(TARGET).top
-
-
-$(OPTLIB): $(OPTOBJS)
-       $(OCAMLOPT) -a -o $(OPTLIB) $(OPTOBJS)
-
-# clean rule for LIB.opt
-clean::
-       rm -f $(OPTLIB) $(LIB:.cma=.a)  
-
-
-.SUFFIXES:
-.SUFFIXES: .ml .mli .cmo .cmi .cmx
-
-.ml.cmo:
-       $(OCAMLC) -c $<
-
-.mli.cmi:
-       $(OCAMLC) -c $<
-
-.ml.cmx:
-       $(OCAMLOPT) -c $<
-
-
-
-
-# clean rule for others files
-clean::
-       rm -f *.cm[iox] *.o *.annot
-       rm -f *~ .*~ #*# 
-
-depend: 
-       $(OCAMLDEP) *.mli *.ml > .depend
-
-#clean::
-#      rm -f .depend
-
-.depend:
-       $(OCAMLDEP) $(INCLUDE_PATH) *.mli *.ml > .depend
-
--include .depend
diff --git a/popl09/ast_popl.ml b/popl09/ast_popl.ml
deleted file mode 100644 (file)
index 64c2ec9..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-type sequence =
-    Seq of element * sequence
-  | Empty
-  | SExists of Ast_cocci.meta_name * sequence
-
-and term =
-    Atomic of Ast_cocci.rule_elem
-  | IfThen of term * term * Ast_cocci.end_info
-  | TExists of Ast_cocci.meta_name * term
-
-and element =
-    Term of term * dots_bef_aft
-  | Or of sequence * sequence
-  | DInfo of dots
-  | EExists of Ast_cocci.meta_name * element
-
-and dots = 
-    Dots
-  | Nest of sequence
-  | When of dots * sequence
-
-and dots_bef_aft =
-    NoDots
-  | AddingBetweenDots of term * int (*index of let var*)
-  | DroppingBetweenDots of term * int (*index of let var*)
-
diff --git a/popl09/asttopopl.ml b/popl09/asttopopl.ml
deleted file mode 100644 (file)
index e256ceb..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-module Ast = Ast_cocci
-module Past = Ast_popl
-
-(* --------------------------------------------------------------------- *)
-
-let term s inif =
-  let fail _ =
-    Pretty_print_cocci.statement "" s;
-    Format.print_newline();
-    failwith "complex statements not supported" in
-  match Ast.unwrap s with
-    Ast.Atomic(ast) ->
-      (match Ast.unwrap ast with
-       Ast.ExprStatement(_,_) -> Past.Atomic ast
-      | Ast.Exp(_) -> Past.Atomic ast
-      | Ast.Decl(_,_,_) -> Past.Atomic ast
-      | Ast.ReturnExpr(_,_,_) -> Past.Atomic ast
-      | Ast.MetaStmt(_,_,_,_) when inif -> Past.Atomic ast
-      | Ast.DisjRuleElem(_) -> Past.Atomic ast
-      | _ -> fail())
-  | _ -> fail()
-
-let rec stm s =
-  match Ast.unwrap s with
-    Ast.Atomic(ast) -> Past.Term(term s false,dots_bef_aft s false)
-  | Ast.IfThen(header,body,aft) ->
-      Past.Term(
-      Past.IfThen(Past.Atomic header,term body true,aft),
-      dots_bef_aft s true)
-  | Ast.Disj(stm1::stm2::stmts) ->
-      List.fold_left
-       (function prev ->
-         function cur ->
-           Past.Or(Past.Seq(prev,Past.Empty),stm_list cur))
-       (Past.Or(stm_list stm1,stm_list stm2)) stmts
-  | Ast.Dots(dots,whencodes,_,_) ->
-      Past.DInfo
-       (List.fold_left
-          (function prev ->
-            function
-                Ast.WhenNot(a) -> Past.When(prev,stm_list a)
-              | _ -> failwith "only when != supported")
-          Past.Dots whencodes)
-  | Ast.Nest(stmt_dots,whencodes,false,_,_) ->
-      let nest = Past.Nest(stm_list stmt_dots) in
-      Past.DInfo
-       (List.fold_left
-          (function prev ->
-            function
-                Ast.WhenNot(a) -> Past.When(prev,stm_list a)
-              | _ -> failwith "only when != supported")
-          nest whencodes)
-  | _ ->
-      Pretty_print_cocci.statement "" s;
-      failwith "unsupported statement3"
-
-and dots_bef_aft s inif =
-  match Ast.get_dots_bef_aft s with
-    Ast.AddingBetweenDots (brace_term,n) ->
-      Past.AddingBetweenDots (term brace_term inif,n)
-  | Ast.DroppingBetweenDots (brace_term,n) ->
-      Past.DroppingBetweenDots (term brace_term inif,n)
-  | Ast.NoDots -> Past.NoDots
-
-and stm_list s =
-  match Ast.unwrap s with
-    Ast.DOTS(d) ->
-      List.fold_right
-       (function cur -> function rest -> Past.Seq(stm cur, rest))
-       d Past.Empty
-  | _ -> failwith "only DOTS handled"
-
-let top s =
-  match Ast.unwrap s with
-    Ast.CODE(stmt_dots) -> stm_list stmt_dots
-  | _ -> failwith "only CODE handled"
diff --git a/popl09/asttopopl.mli b/popl09/asttopopl.mli
deleted file mode 100644 (file)
index 5d8e4b1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-val top : Ast_cocci.top_level -> Ast_popl.sequence
diff --git a/popl09/flag_popl.ml b/popl09/flag_popl.ml
deleted file mode 100644 (file)
index 20b79f1..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-let mark_all = ref false
-let keep_all_wits = ref false
diff --git a/popl09/insert_quantifiers.ml b/popl09/insert_quantifiers.ml
deleted file mode 100644 (file)
index a257fba..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-module Ast = Ast_cocci
-module Past = Ast_popl
-
-(* --------------------------------------------------------------------- *)
-
-let rec fvs_sequence = function
-    Past.Seq(elem,seq) ->
-      Common.union_set (fvs_element elem) (fvs_sequence seq)
-  | Past.Empty -> []
-  | Past.SExists(var,seq) -> failwith "not possible"
-
-and fvs_term = function
-    Past.Atomic(term) -> Ast.get_fvs term
-  | Past.IfThen(test,thn,(afvs,_,_,_)) ->
-      Common.union_set afvs
-       (Common.union_set (fvs_term test) (fvs_term thn))
-  | Past.TExists(var,term) -> failwith "not possible"
-
-and fvs_element = function
-    Past.Term(term,_) -> fvs_term term
-  | Past.Or(seq1,seq2) ->
-      Common.union_set (fvs_sequence seq1) (fvs_sequence seq2)
-  | Past.DInfo(dots) -> fvs_dots dots
-  | Past.EExists(var,seq) -> failwith "not possible"
-
-and fvs_dots = function
-    Past.Dots -> []
-  | Past.Nest(seq) -> fvs_sequence seq
-  | Past.When(dots,seq) -> Common.union_set (fvs_dots dots) (fvs_sequence seq)
-
-(* --------------------------------------------------------------------- *)
-
-let inter_set l1 l2 = List.filter (function l1e -> List.mem l1e l2) l1
-
-let minus_set l1 l2 = List.filter (function l1e -> not (List.mem l1e l2)) l1
-
-let rec quant_sequence bound = function
-    Past.Seq(elem,seq) ->
-      let fe = fvs_element elem in
-      let fs = fvs_sequence seq in
-      let inter = inter_set fe fs in
-      let free = minus_set inter bound in
-      let new_bound = free @ bound in
-      List.fold_right (function cur -> function rest -> Past.SExists(cur,rest))
-       free (Past.Seq(quant_element new_bound elem,
-                      quant_sequence new_bound seq))
-  | Past.Empty -> Past.Empty
-  | Past.SExists(var,seq) -> failwith "not possible"
-
-and quant_term bound = function
-    (Past.Atomic(term)) as x ->
-      let free = minus_set (Ast.get_fvs term) bound in
-      List.fold_right (function cur -> function rest -> Past.TExists(cur,rest))
-       free x
-  | Past.IfThen(test,thn,((afvs,_,_,_) as aft)) ->
-      let fts = fvs_term test in
-      let fth = fvs_term thn in
-      let inter = inter_set fts fth in
-      let free = minus_set inter bound in
-      let new_bound = free @ bound in
-      List.fold_right (function cur -> function rest -> Past.TExists(cur,rest))
-       free (Past.IfThen(quant_term new_bound test,
-                         quant_term new_bound thn,
-                         aft))
-  | Past.TExists(var,term) -> failwith "not possible"
-
-and quant_element bound = function
-    Past.Term(term,ba) ->
-      Past.Term(quant_term bound term,dots_bef_aft bound ba)
-  | Past.Or(seq1,seq2) ->
-      Past.Or(quant_sequence bound seq1,quant_sequence bound seq2)
-  | Past.DInfo(dots) ->
-      Past.DInfo(quant_dots bound dots)
-  | Past.EExists(var,seq) -> failwith "not possible"
-
-and dots_bef_aft bound = function
-    Past.AddingBetweenDots (brace_term,n) ->
-      Past.AddingBetweenDots (quant_term bound brace_term,n)
-  | Past.DroppingBetweenDots (brace_term,n) ->
-      Past.DroppingBetweenDots (quant_term bound brace_term,n)
-  | Past.NoDots -> Past.NoDots
-
-and quant_dots bound = function
-    Past.Dots -> Past.Dots
-  | Past.Nest(seq) -> Past.Nest(quant_sequence bound seq)
-  | Past.When(dots,seq) ->
-      Past.When(quant_dots bound dots, quant_sequence bound seq)
-
-(* --------------------------------------------------------------------- *)
-
-let insert_quantifiers x = quant_sequence [] x
diff --git a/popl09/insert_quantifiers.mli b/popl09/insert_quantifiers.mli
deleted file mode 100644 (file)
index b8eef27..0000000
+++ /dev/null
@@ -1 +0,0 @@
-val insert_quantifiers : Ast_popl.sequence -> Ast_popl.sequence
diff --git a/popl09/popl.ml b/popl09/popl.ml
deleted file mode 100644 (file)
index 92ea56d..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
-type formula =
-    (cocci_predicate,Ast_cocci.meta_name, Wrapper_ctl.info) Ast_ctl.generic_ctl
-
-let poplz (name,_,ast) =
-  match ast with
-    [ast] ->
-      let ast = Asttopopl.top ast in
-      let qt = Insert_quantifiers.insert_quantifiers ast in
-      [Popltoctl.toctl qt]
-  | _ -> failwith "only one rule allowed"
-
-let popl r =
-  match r with
-    Ast_cocci.CocciRule(a,b,c,_,Ast_cocci.Normal) -> poplz (a,b,c)
-  | _ -> []
diff --git a/popl09/popl.mli b/popl09/popl.mli
deleted file mode 100644 (file)
index 4a7fd49..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
-type formula =
-    (cocci_predicate,Ast_cocci.meta_name, Wrapper_ctl.info) Ast_ctl.generic_ctl
-
-val popl : Ast_cocci.rule -> formula list
diff --git a/popl09/popltoctl.ml b/popl09/popltoctl.ml
deleted file mode 100644 (file)
index f98f199..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-module Past = Ast_popl
-module Ast = Ast_cocci
-module V = Visitor_ast
-module CTL  = Ast_ctl
-
-(* --------------------------------------------------------------------- *)
-(* result type *)
-
-type cocci_predicate = Lib_engine.predicate * Ast.meta_name Ast_ctl.modif
-type formula =
-    (cocci_predicate,Ast_cocci.meta_name, Wrapper_ctl.info) Ast_ctl.generic_ctl
-
-(* --------------------------------------------------------------------- *)
-
-let contains_modif =
-  let bind x y = x or y in
-  let option_default = false in
-  let mcode r (_,_,kind,_) =
-    match kind with
-      Ast.MINUS(_,_) -> true
-    | Ast.PLUS -> failwith "not possible"
-    | Ast.CONTEXT(_,info) -> not (info = Ast.NOTHING) in
-  let do_nothing r k e = k e in
-  let rule_elem r k re =
-    let res = k re in
-    match Ast.unwrap re with
-      Ast.FunHeader(bef,_,fninfo,name,lp,params,rp) ->
-      bind (mcode r ((),(),bef,Ast.NoMetaPos)) res
-    | Ast.Decl(bef,_,decl) -> bind (mcode r ((),(),bef,Ast.NoMetaPos)) res
-    | _ -> res in
-  let recursor =
-    V.combiner bind option_default
-      mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
-      do_nothing do_nothing do_nothing do_nothing
-      do_nothing do_nothing do_nothing do_nothing do_nothing do_nothing
-      do_nothing rule_elem do_nothing do_nothing do_nothing do_nothing in
-  recursor.V.combiner_rule_elem
-
-let ctl_exists keep_wit v x =
-  CTL.Exists(!Flag_popl.keep_all_wits or keep_wit,v,x)
-
-let predmaker keep_wit term =
-  if (!Flag_popl.keep_all_wits or keep_wit) &&
-     (!Flag_popl.mark_all or contains_modif term)
-  then
-    let v = ("","_v") in
-    ctl_exists true v
-      (CTL.Pred (Lib_engine.Match(term),CTL.Modif v))
-  else CTL.Pred (Lib_engine.Match(term),CTL.Control)
-
-(* --------------------------------------------------------------------- *)
-
-let is_true = function CTL.True -> true | _ -> false
-
-let is_false = function CTL.False -> true | _ -> false
-
-let ctl_true       = CTL.True
-
-let ctl_false      = CTL.False
-
-let ctl_and x y    =
-  if is_true x then y
-  else if is_true y then x else CTL.And(CTL.STRICT,x,y)
-
-let ctl_or x y     =
-  if is_false x then y
-  else if is_false y then x else CTL.Or(x,y)
-
-let ctl_seqor x y  = CTL.SeqOr(x,y)
-
-let ctl_not x      = CTL.Not(x)
-
-let ctl_ax x       =
-  if is_true x then CTL.True
-  else CTL.AX(CTL.FORWARD,CTL.STRICT,x)
-
-let ctl_ex x       =
-  if is_true x then CTL.True
-  else CTL.EX(CTL.FORWARD,x)
-
-let ctl_back_ex x  =
-  if is_true x then CTL.True
-  else CTL.EX(CTL.BACKWARD,x)
-
-let after          = CTL.Pred(Lib_engine.After, CTL.Control)
-let fall           = CTL.Pred(Lib_engine.FallThrough, CTL.Control)
-let exit           = CTL.Pred(Lib_engine.Exit, CTL.Control)
-let truepred       = CTL.Pred(Lib_engine.TrueBranch, CTL.Control)
-let falsepred      = CTL.Pred(Lib_engine.FalseBranch, CTL.Control)
-let retpred        = CTL.Pred(Lib_engine.Return, CTL.Control)
-
-let string2var x = ("",x)
-
-let labelctr = ref 0
-let get_label_ctr _ =
-  let cur = !labelctr in
-  labelctr := cur + 1;
-  string2var (Printf.sprintf "l%d" cur)
-
-let ctl_au x y = CTL.AU(CTL.FORWARD,CTL.STRICT,x,y)
-
-let ctl_uncheck x  = CTL.Uncheck(x)
-
-let make_meta_rule_elem d =
-  let nm = "_S" in
-  Ast.make_meta_rule_elem nm d ([],[],[])
-
-(* --------------------------------------------------------------------- *)
-
-let rec ctl_seq keep_wit a = function
-    Past.Seq(elem,seq) ->
-      ctl_element keep_wit (ctl_seq keep_wit a seq) elem
-  | Past.Empty -> a
-  | Past.SExists(var,seq) -> ctl_exists keep_wit var (ctl_seq keep_wit a seq)
-
-and ctl_term keep_wit a = function
-    Past.Atomic(term) -> ctl_and (predmaker keep_wit term) (ctl_ax a)
-  | Past.IfThen(test,thn,(_,_,_,aft)) -> ifthen keep_wit (Some a) test thn aft
-  | Past.TExists(var,term) ->
-      ctl_exists keep_wit var (ctl_term keep_wit a term)
-
-and ctl_element keep_wit a = function
-    Past.Term(term,ba) ->
-      do_between_dots keep_wit ba (ctl_term keep_wit a term) a
-  | Past.Or(seq1,seq2) ->
-      ctl_seqor (ctl_seq keep_wit a seq1) (ctl_seq keep_wit a seq2)
-  | Past.DInfo(dots) -> ctl_au (guard_ctl_dots keep_wit a dots) a
-  | Past.EExists(var,elem) ->
-      ctl_exists keep_wit var (ctl_element keep_wit a elem)
-
-(* --------------------------------------------------------------------- *)
-
-and guard_ctl_seq keep_wit a = function
-    Past.Seq(elem,Past.Empty) -> guard_ctl_element keep_wit a elem
-  | Past.Seq(elem,seq) ->
-      ctl_element keep_wit (guard_ctl_seq keep_wit a seq) elem
-  | Past.Empty -> ctl_true
-  | Past.SExists(var,seq) ->
-      ctl_exists keep_wit var (guard_ctl_seq keep_wit a seq)
-
-and guard_ctl_term keep_wit = function
-    Past.Atomic(term) -> predmaker keep_wit term
-  | Past.IfThen(test,thn,(_,_,_,aft)) -> ifthen keep_wit None test thn aft
-  | Past.TExists(var,term) ->
-      ctl_exists keep_wit var (guard_ctl_term keep_wit term)
-
-and guard_ctl_element keep_wit a = function
-    Past.Term(term,_) -> guard_ctl_term keep_wit term
-  | Past.Or(seq1,seq2) ->
-      ctl_seqor
-       (guard_ctl_seq keep_wit a seq1) (guard_ctl_seq keep_wit a seq2)
-  | Past.DInfo(dots) -> ctl_au (guard_ctl_dots keep_wit a dots) a
-  | Past.EExists(var,elem) ->
-      ctl_exists keep_wit var (guard_ctl_element keep_wit a elem)
-
-and guard_ctl_dots keep_wit a = function
-    Past.Dots -> ctl_true
-(* | Past.Nest(_) when not keep_wit -> ctl_true
-   a possible optimization, but irrelevant to popl example *)
-  | Past.Nest(seq) ->
-      ctl_or
-       (guard_ctl_seq true a seq)
-       (ctl_not (guard_ctl_seq false a seq))
-  | Past.When(dots,seq) ->
-      ctl_and
-       (guard_ctl_dots keep_wit a dots)
-       (ctl_not (guard_ctl_seq false a seq))
-
-(* --------------------------------------------------------------------- *)
-
-and ifthen keep_wit a test thn aft =
-(* "if (test) thn; after" becomes:
-    if(test) & AX((TrueBranch & AX thn) v FallThrough v (After & AXAX after))
-             & EX After
-    (* doesn't work for C code if (x) return 1; else return 2; *)
-*)
-  let end_code =
-    match (aft,a) with
-      (Ast.CONTEXT(_,Ast.NOTHING),None) -> ctl_true
-    | (Ast.CONTEXT(_,Ast.NOTHING),Some a) -> ctl_ax (ctl_ax a)
-    | (_,None) -> failwith "not possible"
-    | (_,Some a) ->
-       ctl_ax
-         (ctl_and
-            (predmaker keep_wit (make_meta_rule_elem aft))
-            (ctl_ax a)) in
-  let body =
-    ctl_or
-      (ctl_and truepred
-        (ctl_ax
-           (guard_ctl_term keep_wit thn)))
-      (ctl_or fall
-        (ctl_and after end_code)) in
-  ctl_and (ctl_term keep_wit body test)
-    (match a with Some CTL.True | None -> ctl_true | Some _ -> ctl_ex after)
-
-and do_between_dots keep_wit ba term after =
-    match ba with
-      Past.AddingBetweenDots (brace_term,n)
-    | Past.DroppingBetweenDots (brace_term,n) ->
-       (* not sure at all what to do here for after... *)
-       let match_brace = ctl_term keep_wit after brace_term in
-       let v = Printf.sprintf "_r_%d" n in
-       let case1 = ctl_and (CTL.Ref v) match_brace in
-       let case2 = ctl_and (ctl_not (CTL.Ref v)) term in
-       CTL.Let
-         (v,ctl_or
-            (ctl_back_ex truepred)
-            (ctl_back_ex (ctl_back_ex falsepred)),
-          ctl_or case1 case2)   
-    | Past.NoDots -> term
-
-(* --------------------------------------------------------------------- *)
-
-let toctl sl = ctl_seq true ctl_true sl
diff --git a/popl09/popltoctl.mli b/popl09/popltoctl.mli
deleted file mode 100644 (file)
index b1285d1..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
-type formula =
-    (cocci_predicate,Ast_cocci.meta_name, Wrapper_ctl.info) Ast_ctl.generic_ctl
-
-val toctl : Ast_popl.sequence -> formula
diff --git a/popl09/pretty_print_popl.ml b/popl09/pretty_print_popl.ml
deleted file mode 100644 (file)
index 86ca8fe..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
-open Format
-module Past = Ast_popl
-module Ast = Ast_cocci
-
-let start_block str =
-  force_newline(); print_string "  "; open_box 0
-
-let end_block str =
-  close_box(); force_newline ()
-
-(* --------------------------------------------------------------------- *)
-
-let print_around printer term = function
-    Ast.NOTHING -> printer term
-  | Ast.BEFORE(bef) ->
-      Pretty_print_cocci.print_anything "<<< " bef; printer term
-  | Ast.AFTER(aft) ->
-      printer term; Pretty_print_cocci.print_anything ">>> " aft
-  | Ast.BEFOREAFTER(bef,aft) ->
-      Pretty_print_cocci.print_anything "<<< " bef; printer term;
-      Pretty_print_cocci.print_anything ">>> " aft
-
-let mcode fn = function
-    (x, _, Ast.MINUS(_,plus_stream), pos) ->
-      print_string "-"; fn x;
-      Pretty_print_cocci.print_anything ">>> " plus_stream
-  | (x, _, Ast.CONTEXT(_,plus_streams), pos) -> 
-       print_around fn x plus_streams
-  | (x, info, Ast.PLUS, pos) -> fn x
-
-(* --------------------------------------------------------------------- *)
-
-let rec print_sequence = function
-    Past.Seq(e,seq) -> print_element e; force_newline(); print_sequence seq
-  | Past.Empty -> ()
-  | Past.SExists((_,v),seq) -> print_string "exists "; print_string v;
-      print_string " ."; force_newline(); print_sequence seq
-
-and print_term = function
-    Past.Atomic(term) -> Pretty_print_cocci.rule_elem "" term
-  | Past.IfThen(test,thn,(_,_,_,aft)) ->
-      print_term test; print_term thn;
-      mcode (function _ -> ()) ((),Ast.no_info,aft,Ast.NoMetaPos)
-  | Past.TExists((_,v),term) -> print_string "exists "; print_string v;
-      print_string " ."; force_newline(); print_term term
-
-and print_element = function
-    Past.Term(term,_) -> print_term term
-  | Past.Or(seq1,seq2) ->
-      force_newline(); print_string "("; force_newline(); print_sequence seq1;
-      print_string "|"; force_newline(); print_sequence seq2; print_string ")"
-  | Past.DInfo(dots) ->
-      start_block();
-      print_dots dots;
-      end_block()
-  | Past.EExists((_,v),elem) -> print_string "exists "; print_string v;
-      print_string " ."; force_newline(); print_element elem
-
-and print_dots = function
-    Past.Dots -> print_string "..."
-  | Past.Nest(seq)-> print_string "<..."; start_block(); print_sequence seq;
-      end_block(); print_string "...>"
-  | Past.When(dots,seq) -> print_dots dots; print_string " when != ";
-      open_box 0; print_sequence seq; close_box()
-
-(* --------------------------------------------------------------------- *)
-
-let pretty_print_e e =
-  print_element e;
-  print_newline()
-
-let pretty_print sl =
-  print_sequence sl;
-  print_newline()
-
diff --git a/popl09/pretty_print_popl.mli b/popl09/pretty_print_popl.mli
deleted file mode 100644 (file)
index 5b3399a..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-val pretty_print : Ast_popl.sequence -> unit
-val pretty_print_e : Ast_popl.element -> unit
index 58f217a..aa0a21b 100644 (file)
@@ -23,9 +23,11 @@ pycaml.customtop: byte-code-library
        cp -f dllpycaml_stubs.so ../
        ocamlmktop -o pycaml.customtop pycaml.cma
 
-clean:: 
+clean::
        rm -f pycaml.customtop
 
+distclean:: clean
+
 depend: # added by julia, undoubtedly wrong
 
 -include $(OCAMLMAKEFILE)
index f6f1ff2..e807966 100644 (file)
@@ -1,18 +1,12 @@
-no_pycocci.cmo: pycocci_aux.cmo ../commons/common.cmi ../parsing_c/ast_c.cmo 
-no_pycocci.cmx: pycocci_aux.cmx ../commons/common.cmx ../parsing_c/ast_c.cmx 
+no_pycocci.cmo: ../commons/common.cmi ../parsing_c/ast_c.cmo 
+no_pycocci.cmx: ../commons/common.cmx ../parsing_c/ast_c.cmx 
 no_pycocci_aux.cmo: ../parsing_c/pretty_print_c.cmi ../commons/common.cmi \
     ../parsing_c/ast_c.cmo 
 no_pycocci_aux.cmx: ../parsing_c/pretty_print_c.cmx ../commons/common.cmx \
     ../parsing_c/ast_c.cmx 
-pycocci.cmo: pycocci_aux.cmo ../commons/common.cmi ../parsing_c/ast_c.cmo 
-pycocci.cmx: pycocci_aux.cmx ../commons/common.cmx ../parsing_c/ast_c.cmx 
-pycocci_aux.cmo: ../parsing_c/pretty_print_c.cmi ../commons/common.cmi \
-    ../parsing_c/ast_c.cmo 
-pycocci_aux.cmx: ../parsing_c/pretty_print_c.cmx ../commons/common.cmx \
-    ../parsing_c/ast_c.cmx 
-yes_pycocci.cmo: pycocci_aux.cmo ../pycaml/pycaml.cmo ../globals/flag.cmo \
+yes_pycocci.cmo: ../pycaml/pycaml.cmo ../globals/flag.cmo \
     ../commons/common.cmi ../parsing_c/ast_c.cmo 
-yes_pycocci.cmx: pycocci_aux.cmx ../pycaml/pycaml.cmx ../globals/flag.cmx \
+yes_pycocci.cmx: ../pycaml/pycaml.cmx ../globals/flag.cmx \
     ../commons/common.cmx ../parsing_c/ast_c.cmx 
 yes_pycocci_aux.cmo: ../pycaml/pycaml.cmo ../parsing_c/pretty_print_c.cmi \
     ../commons/common.cmi ../parsing_cocci/ast_cocci.cmi \
index 9f16961..16a9407 100644 (file)
 ##############################################################################
 TARGET=coccipython
 
-SOURCES= pycocci_aux.ml pycocci.ml 
+SOURCES= pycocci_aux.ml pycocci.ml
 
 INCLUDEDIRS = ../commons ../commons/ocamlextra ../globals ../pycaml \
              ../parsing_c ../parsing_cocci
 
 SYSLIBS = str.cma unix.cma
-LIBS=../commons/commons.cma ../globals/globals.cma 
+LIBS=../commons/commons.cma ../globals/globals.cma
 
 #     ../ctl/ctl.cma \
-#     ../parsing_c/c_parser.cma ../parsing_cocci/cocci_parser.cma 
-#pycaml/pycaml.cma 
+#     ../parsing_c/c_parser.cma ../parsing_cocci/cocci_parser.cma
+#pycaml/pycaml.cma
 
 
 ##############################################################################
@@ -90,7 +90,7 @@ clean::
        rm -f $(LIB)
 
 
-$(OPTLIB): $(OPTOBJS) 
+$(OPTLIB): $(OPTOBJS)
        $(OCAMLOPT) -a -o $(OPTLIB) $(OPTOBJS)
 
 
@@ -102,13 +102,15 @@ $(CTLEXEC): $(CTLOBJS) $(LIBS)
 
 
 clean::
-       rm -f $(OPTLIB) $(LIB:.cma=.a)  
+       rm -f $(OPTLIB) $(LIB:.cma=.a)
        rm -f $(TARGET) rm -f $(TARGET).byte
        rm -f $(CTLTARGET)
 
 
 #pycocci.ml: ../pycaml/pycaml.ml ../pycaml/pycaml_ml.c
 #pycocci_aux.ml:  ../pycaml/pycaml.ml ../pycaml/pycaml_ml.c
+pycocci_aux.ml:
+       @echo "\n\n\t*** pycocci_aux.ml not found ! ***\n\n\tRun 'configure && make depend' first.\n\n"
 
 rmlinks:
        rm -f pycocci.ml pycocci_aux.ml
@@ -133,14 +135,17 @@ rmlinks:
 # clean rule for others files
 clean::
        rm -f *.cm[iox] *.o  *.annot
-       rm -f *~ .*~ #*# 
+       rm -f *~ .*~ #*#
+
+distclean::
+       rm -f .depend
 
 beforedepend:
 
 depend: beforedepend
        $(OCAMLDEP) *.mli *.ml > .depend
 
-.depend: 
+.depend:
        $(OCAMLDEP) *.mli *.ml > .depend
 
 -include .depend
index 0170db2..9520e41 100644 (file)
@@ -6,5 +6,5 @@ all.opt:
 depend:
 
 clean:
-       set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i clean; done 
+       set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i clean; done
        rm -f *.pyc
diff --git a/python/coccilib/output.py b/python/coccilib/output.py
deleted file mode 120000 (symlink)
index 9b9e839..0000000
+++ /dev/null
@@ -1 +0,0 @@
-output_base.py
\ No newline at end of file
index 65f0473..0f0a6f0 100644 (file)
@@ -1,7 +1,3 @@
-import pygtk
-import gtk, gobject
-import coccilib.coccigui
-import coccilib.coccigui.coccigui
 from threading import Thread, Lock
 import time
 from copy import deepcopy
diff --git a/python/coccilib/output_gui.py b/python/coccilib/output_gui.py
new file mode 100644 (file)
index 0000000..65f0473
--- /dev/null
@@ -0,0 +1,125 @@
+import pygtk
+import gtk, gobject
+import coccilib.coccigui
+import coccilib.coccigui.coccigui
+from threading import Thread, Lock
+import time
+from copy import deepcopy
+
+class Output:
+       """In order to implement an output class for use with Coccinelle,
+       one can inherit from this class and overload register_match with
+       the same number of arguments.
+
+       include_match will be overwritten by inheriting from your actual
+       class, and thus if your class is a.b.C then Coccinelle will create
+       a Python class "class Coccinelle(a.b.C)" that hooks include_match
+       into the O'Caml internals.
+       """
+       def include_match(self, b):
+               pass
+
+       def register_match(self, include, messages):
+               pass
+
+       def combine(self, meta_variable, locations):
+               nmv = deepcopy(meta_variable)
+               nloc = [deepcopy(loc) for loc in locations]
+               nmv.location = nloc[0]
+               nmv.locations = nloc
+
+               return nmv
+
+       def finalise(self):
+               pass
+
+       def print_main(self, msg, p) :
+               print "* TODO [[view:%s::face=ovl-face1::linb=%s::colb=%s::cole=%s][%s %s::%s]]" % (p[0].file,p[0].line,p[0].column,p[0].column_end,msg,p[0].file,p[0].line)
+
+       def print_sec(self, msg, p) :
+               print "[[view:%s::face=ovl-face2::linb=%s::colb=%s::cole=%s][%s]]" % (p[0].file,p[0].line,p[0].column,p[0].column_end,msg)
+
+       def print_secs(self, msg, ps) :
+               for i in ps:
+                       print "[[view:%s::face=ovl-face2::linb=%s::colb=%s::cole=%s][%s]]" % (i.file,i.line,i.column,i.column_end,msg)
+
+class Console(Output):
+       def __init__(self):
+               pass
+
+       def register_match(self, include, messages):
+               self.include_match(include)
+               if include:
+                       for variable, message in messages:
+                               print "%s:%s:%s: %s - %s" % (variable.location.file, variable.location.line, variable.location.column, message, variable)
+
+class GtkRunner(Thread):
+       def __init__(self):
+               Thread.__init__(self)
+               self.lock = Lock()
+               self.rows = []
+
+       def add_row(self, cocci, l):
+               for i in xrange(0, len(l)):
+                       l[i] = (l[i][1], l[i][0].location.file, l[i][0].location.line, l[i][0].location.column)
+
+               self.lock.acquire()
+               try:
+                       self.rows.append((cocci, l))
+               finally:
+                       self.lock.release()
+
+       def has_row(self):
+               self.lock.acquire()
+               try:
+                       return len(self.rows) > 0
+               finally:
+                       self.lock.release()
+
+       def get_row(self):
+               self.lock.acquire()
+               try:
+                       return self.rows.pop(0)
+               finally:
+                       self.lock.release()
+
+       def update(self):
+               while self.has_row():
+                       cocci, l = self.get_row()
+                       self.gui.add_result(cocci, l)
+               gobject.timeout_add(1000, self.update)
+
+       def run(self):
+               self.gui = coccilib.coccigui.coccigui.pycocci()
+               globals()['gtk_sock'] = self.gui
+               gobject.timeout_add(1000, self.update)
+
+               gtk.gdk.threads_init()
+               gtk.gdk.threads_enter()
+
+               gtk.main()
+
+               gtk.gdk.threads_leave()
+
+               globals().pop('gtk_thread')
+               globals().pop('gtk_sock')
+
+class Gtk(Output):
+       def check_availability(self):
+               if not globals().has_key('gtk_sock'):
+                       t = GtkRunner()
+                       globals()['gtk_thread'] = t
+                       globals()['gtk_thread'].start()
+                       time.sleep(2)
+
+       def register_match(self, include, messages):
+               self.check_availability()
+
+               self.include_match(include)
+               if include:
+                       globals()['gtk_thread'].add_row(self.cocci_file, messages)
+
+       def finalise(self):
+               self.check_availability()
+
+               globals()['gtk_thread'].join()
index b8efc7c..262b089 100644 (file)
@@ -24,7 +24,7 @@ open Ast_c
 open Common
 
 let rec exprrep expr = match expr with
-  Ast_c.Ident s -> s
+  Ast_c.Ident (ident) -> Ast_c.str_of_name ident
 | Ast_c.Constant c -> constantrep c
 | Ast_c.FunCall (e,args) -> "TODO: FunCall"
 | Ast_c.CondExpr (e1,e2,e3) -> "TODO: CondExpr"
diff --git a/python/pycocci.ml b/python/pycocci.ml
deleted file mode 120000 (symlink)
index 2f2a8da..0000000
+++ /dev/null
@@ -1 +0,0 @@
-no_pycocci.ml
\ No newline at end of file
diff --git a/python/pycocci_aux.ml b/python/pycocci_aux.ml
deleted file mode 120000 (symlink)
index 003ba79..0000000
+++ /dev/null
@@ -1 +0,0 @@
-no_pycocci_aux.ml
\ No newline at end of file
index bb877d5..2ef2807 100644 (file)
@@ -29,12 +29,12 @@ module StringMap = Map.Make (String)
 exception Pycocciexception
 
 let check_return_value v =
-  if v = (pynull ()) then 
+  if v =*= (pynull ()) then 
          (pyerr_print ();
          raise Pycocciexception)
   else ()
 let check_int_return_value v =
-  if v = -1 then
+  if v =|= -1 then
          (pyerr_print ();
          raise Pycocciexception)
   else ()
@@ -142,7 +142,7 @@ let has_environment_binding env name =
   let (rule, name) = (Array.get a 1, Array.get a 2) in
   let orule = pystring_asstring rule in
   let oname = pystring_asstring name in
-  let e = List.exists (function (x,y) -> orule = x && oname = y) env in
+  let e = List.exists (function (x,y) -> orule =$= x && oname =$= y) env in
   if e then pytrue () else pyfalse ()
 
 let pyoutputinstance = ref (pynone ())
@@ -175,13 +175,13 @@ let build_variable name value =
 
 let contains_binding e (_,(r,m)) =
   try
-    let _ = List.find (function ((re, rm), _) -> r = re && m = rm) e in true
+    let _ = List.find (function ((re, rm), _) -> r =$= re && m =$= rm) e in true
   with Not_found -> false
 
 let construct_variables mv e =
   let find_binding (r,m) =
     try
-      let elem = List.find (function ((re,rm),_) -> r = re && m = rm) e in
+      let elem = List.find (function ((re,rm),_) -> r =$= re && m =$= rm) e in
       Some elem
     with Not_found -> None
   in
index 9d24034..bcc2b2d 100644 (file)
@@ -3,7 +3,10 @@ style-preserving source-to-source transformations on C source code,
 like for instance to perform some refactorings.
 
 To install Coccinelle from its source, see the instructions in install.txt.
-For more information on Coccinelle see the files in the docs/ directory.
+For more information on Coccinelle, type 'make docs' and see look at the 
+files in the docs/ directory. You may need to install the texlive-fonts-extra
+packages from your distribution to compile some of the LaTeX documentation
+files.
 
 Once you have installed Coccinelle (either from the source or from one
 of the binary form available on the Coccinelle website), You may have
index dd53353..05dc0ab 100644 (file)
@@ -9,9 +9,9 @@ if [ ! -r "$COCCINELLE_HOME"/standard.iso ] ; then
 else
 
  export COCCINELLE_HOME
- export LD_LIBRARY_PATH="$COCCINELLE_HOME:$LD_LIBRARY_PATH"
+ export LD_LIBRARY_PATH="LIBDIR:$LD_LIBRARY_PATH"
  export PYTHONPATH="$COCCINELLE_HOME/python:$PYTHONPATH"
+
 # echo setting LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
 # echo setting PYTHONPATH="$PYTHONPATH"
 
index 854f414..ff30864 100644 (file)
@@ -13,6 +13,7 @@
  *     but where we cant detect that it will be a "bad macro"
  *   - macros found in .c; macros correctly parsed
  *     but where we cant detect that it will be a "bad macro"
+ *   - hints, cf below.
  *
  * Some of those macros could be deleted and the C code rewritten because
  * they are "bad" macros.
  * handled builtin apparently by gcc.
  */
 
+// ****************************************************************************
+// Hints
+// ****************************************************************************
+
+/* Cooperation with parsing_hack.ml: some body of macros in this file, such  
+ * as MACROSTATEMENT, are considered as magic strings.
+ * I can't just expand those macros into some 'whatever();' because I need 
+ * to generate a TMacroStmt for solving some ambiguities in the grammar
+ * for the toplevel stuff I think.
+ * Right now a set of special strings are used as "hints" to the parser
+ * to help it parse code. Those hints are specified in parsing_hack.ml:
+ *
+ *   - YACFE_ITERATOR
+ *   - YACFE_DECLARATOR
+ *   - YACFE_STRING
+ *   - YACFE_STATEMENT, or MACROSTATEMENT
+ *   - YACFE_ATTRIBUTE
+ *   - YACFE_IDENT_BUILDER
+ */
+
 // ****************************************************************************
 // Test macros
 // ****************************************************************************
 
 // #define FOO(a, OP, b) a OP b
 // #define FOO(a,b) fn(a,b)
-
+#define FOO_METH_TEST(a) YACFE_IDENT_BUILDER
 
 // ****************************************************************************
 // Generic macros
@@ -587,10 +608,6 @@ do {                                                                       \
 
 
 
-// Cooperation with parsing_hack.ml: MACROSTATEMENT is a magic string.
-// I can't just expand those macros into some 'whatever();' because I need 
-// to generate a TMacroStmt for solving some ambiguities in the grammar
-// for the toplevel stuff I think.
 #define ASSERT(x) MACROSTATEMENT
 #define IRDA_ASSERT(x) MACROSTATEMENT
 
index 31abbe3..8dffbb7 100644 (file)
@@ -41,7 +41,9 @@ let testone x compare_with_expected_flag =
 
   let expected_res   = "tests/" ^ x ^ ".res" in
   begin
-    let res = Cocci.full_engine (cocci_file, !Config.std_iso) [cfile] in
+    let cocci_infos = Cocci.pre_engine (cocci_file, !Config.std_iso) in
+    let res = Cocci.full_engine cocci_infos [cfile] in
+    Cocci.post_engine cocci_infos;
     let generated = 
       match Common.optionise (fun () -> List.assoc cfile res) with
       | Some (Some outfile) -> 
@@ -68,7 +70,7 @@ let testone x compare_with_expected_flag =
 (* ------------------------------------------------------------------------ *)
 let testall () =
 
-  let newscore  = empty_score () in
+  let score  = empty_score () in
 
   let expected_result_files = 
     Common.glob "tests/*.res" 
@@ -79,8 +81,8 @@ let testall () =
 
   begin
     expected_result_files +> List.iter (fun res -> 
-      let x = if res =~ "\\(.*\\).res" then matched1 res else raise Impossible 
-      in
+      let x = 
+        if res =~ "\\(.*\\).res" then matched1 res else raise Impossible in
       let base = if x =~ "\\(.*\\)_ver[0-9]+" then matched1 x else x in 
       let cfile      = "tests/" ^ x ^ ".c" in
       let cocci_file = "tests/" ^ base ^ ".cocci" in
@@ -90,8 +92,11 @@ let testall () =
 
       try (
         Common.timeout_function timeout_testall  (fun () -> 
-          
-          let xs = Cocci.full_engine (cocci_file, !Config.std_iso) [cfile] in
+
+         let cocci_infos = Cocci.pre_engine (cocci_file, !Config.std_iso) in
+          let xs = Cocci.full_engine cocci_infos [cfile] in
+         Cocci.post_engine cocci_infos;
+
           let generated = 
             match List.assoc cfile xs with
             | Some generated -> generated
@@ -106,7 +111,7 @@ let testall () =
            * I want to indent a little more the messages.
            *)
           (match correct with
-          | Compare_c.Correct -> Hashtbl.add newscore res Common.Ok;
+          | Compare_c.Correct -> Hashtbl.add score res Common.Ok;
           | Compare_c.Pb s -> 
               let s = Str.global_replace 
                 (Str.regexp "\"/tmp/cocci-output.*\"") "<COCCIOUTPUTFILE>" s
@@ -116,20 +121,20 @@ let testall () =
                 "    diff (result(<) vs expected_result(>)) = \n" ^
                 (diffxs +> List.map(fun s -> "    "^s^"\n") +> Common.join "")
               in
-              Hashtbl.add newscore res (Common.Pb s)
+              Hashtbl.add score res (Common.Pb s)
           | Compare_c.PbOnlyInNotParsedCorrectly s -> 
               let s = 
                 "seems incorrect, but only because of code that " ^
                 "was not parsable" ^ s
               in
-              Hashtbl.add newscore res (Common.Pb s)
+              Hashtbl.add score res (Common.Pb s)
           )
         )
       )
       with exn -> 
         Common.reset_pr_indent();
         let s = "PROBLEM\n" ^ ("   exn = " ^ Printexc.to_string exn ^ "\n") in
-        Hashtbl.add newscore res (Common.Pb s)
+        Hashtbl.add score res (Common.Pb s)
     );
 
 
@@ -137,7 +142,7 @@ let testall () =
     pr2 "statistics";
     pr2 "--------------------------------";
 
-    Common.hash_to_list newscore +> List.iter (fun (s, v) -> 
+    Common.hash_to_list score +> List.iter (fun (s, v) -> 
       pr_no_nl (Printf.sprintf "%-30s: " s);
       pr_no_nl (
         match v with
@@ -150,20 +155,63 @@ let testall () =
     pr2 "--------------------------------";
     pr2 "regression testing  information";
     pr2 "--------------------------------";
-    Common.regression_testing newscore 
-      (Filename.concat Config.path "tests/score_cocci_best.marshalled");
-
 
-    pr2 "--------------------------------";
-    pr2 "total score";
-    pr2 "--------------------------------";
-    let total = Common.hash_to_list newscore +> List.length in
-    let good  = Common.hash_to_list newscore +> List.filter 
-      (fun (s, v) -> v = Ok) +> List.length 
-    in
+    let expected_score_file = "tests/SCORE_expected.sexp" in
+    let best_of_both_file = "tests/SCORE_best_of_both.sexp" in
+    let actual_score_file = "tests/SCORE_actual.sexp" in
     
-    pr2 (sprintf "good = %d/%d" good total);
+    pr2 ("regression file: "^ expected_score_file);
+    let (expected_score : score) = 
+      if Sys.file_exists expected_score_file
+      then 
+        let sexp = Sexp.load_sexp expected_score_file in
+        Sexp_common.score_of_sexp sexp
+      else empty_score()
+    in
 
+    let new_bestscore = Common.regression_testing_vs score expected_score in
+
+
+    let xs = Common.hash_to_list score in
+    let sexp = Sexp_common.sexp_of_score_list xs in
+    let s_score = Sexp.to_string_hum sexp in
+    Common.write_file ~file:(actual_score_file) s_score;
+
+    let xs2 = Common.hash_to_list new_bestscore in
+    let sexp2 = Sexp_common.sexp_of_score_list xs2 in
+    let s_score2 = Sexp.to_string_hum sexp2 in
+    Common.write_file ~file:(best_of_both_file) s_score2;
+
+    Common.print_total_score score;
+
+    let (good, total)                   = Common.total_scores score in
+    let (expected_good, expected_total) = Common.total_scores expected_score in
+
+    if good = expected_good 
+    then begin 
+      pr2 "Current score is equal to expected score; everything is fine";
+      raise (UnixExit 0);
+    end
+    else 
+      if good < expected_good
+      then begin 
+        pr2 "Current score is lower than expected, :(";
+        pr2 "";
+        pr2 "If you think it's normal, then maybe you need to update the";
+        pr2 (spf "score file %s, copying info from %s."
+                expected_score_file actual_score_file);
+        raise (UnixExit 1);
+      end
+      else begin
+        pr2 "Current score is greater than expected, :)";
+        pr2 "Generating new expected score file and saving old one";
+        Common.command2_y_or_no_exit_if_no
+          (spf "mv %s %s" expected_score_file (expected_score_file ^ ".save"));
+        Common.command2_y_or_no_exit_if_no
+          (spf "mv %s %s" best_of_both_file expected_score_file);
+        raise (UnixExit 0);
+      end
+     
   end
 
 (* ------------------------------------------------------------------------ *)
@@ -208,9 +256,9 @@ let test_okfailed cocci_file cfiles =
     try (
       Common.timeout_function_opt !Flag_cocci.timeout (fun () ->
 
-        
-        let outfiles = Cocci.full_engine (cocci_file, !Config.std_iso) cfiles
-        in
+       let cocci_infos = Cocci.pre_engine (cocci_file, !Config.std_iso) in
+        let outfiles = Cocci.full_engine cocci_infos cfiles in
+       Cocci.post_engine cocci_infos;
 
         let time_str = time_per_file_str () in
           
@@ -251,14 +299,14 @@ let test_okfailed cocci_file cfiles =
               
               let diff = Compare_c.compare_default outfile expected_res in
               let s1 = (Compare_c.compare_result_to_string diff) in
-              if fst diff = Compare_c.Correct
+              if fst diff =*= Compare_c.Correct
               then push2 (infile ^ (t_to_s Ok), [s1;time_str]) final_files
               else 
                 if Common.lfile_exists expected_res2
                 then begin
                   let diff = Compare_c.compare_default outfile expected_res2 in
                   let s2 = Compare_c.compare_result_to_string diff in
-                  if fst diff = Compare_c.Correct
+                  if fst diff =*= Compare_c.Correct
                   then push2 (infile ^ (t_to_s SpatchOK),[s2;s1;time_str]) 
                       final_files
                   else push2 (infile ^ (t_to_s Failed), [s2;s1;time_str]) 
@@ -354,14 +402,14 @@ let compare_with_expected outfiles =
         in
         let diff = Compare_c.compare_default outfile expected_res in
         let s1 = (Compare_c.compare_result_to_string diff) in
-        if fst diff = Compare_c.Correct
+        if fst diff =*= Compare_c.Correct
         then pr2_no_nl (infile ^ " " ^ s1)
         else 
           if Common.lfile_exists expected_res2
           then begin
             let diff = Compare_c.compare_default outfile expected_res2 in
             let s2 = Compare_c.compare_result_to_string diff in
-            if fst diff = Compare_c.Correct
+            if fst diff =*= Compare_c.Correct
             then pr2 (infile ^ " is spatchOK " ^ s2)
             else pr2 (infile ^ " is failed " ^ s2)
           end
diff --git a/tests/SCORE_expected.sexp b/tests/SCORE_expected.sexp
new file mode 100644 (file)
index 0000000..74987fd
--- /dev/null
@@ -0,0 +1,145 @@
+((a3d.res Ok) (a_and_e.res Ok) (a_and_e_ver1.res Ok) (addelse.res Ok)
+ (addif.res Ok) (addif1.res Ok) (addif2.res Ok) (after_if.res Ok)
+ (anon.res Ok) (ar.res Ok) (arg.res Ok) (argument.res Ok) (array_init.res Ok)
+ (array_size.res Ok) (arraysz.res Ok) (b1.res Ok) (b2.res Ok)
+ (bad_iso_example.res
+  (Pb
+   "INCORRECT:diff token: ( VS x\nFile \"tests/bad_iso_example.c\", line 2, column 6,  charpos = 19\n    around = '(', whole content =   if ((x = 3)) return;\nFile \"tests/bad_iso_example.res\", line 2, column 6,  charpos = 19\n    around = 'x', whole content =   if (x) return;\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,4 +1,4 @@\n     int main() {\n    -  if ((x = 3)) return;\n    +  if (x) return;\n     }\n     \n"))
+ (bad_ptr_print.res Ok) (bad_typedef.res Ok) (badexp.res Ok)
+ (badpos.res
+  (Pb
+   "PROBLEM\n   exn = Failure(\"rule starting on line 1: already tagged token:\\nFile \\\"tests/badpos.c\\\", line 5, column 30,  charpos = 139\\n    around = 'reg_ptr', whole content = \\t (int) -(((struct pt_regs *) reg_ptr)->orig_eax + 2));\")\n"))
+ (badtypedef.res Ok) (ben.res Ok) (bitfield.res Ok) (braces.res Ok)
+ (break.res Ok) (bug1.res Ok)
+ (bugloop.res
+  (Pb
+   "PROBLEM\n   exn = Failure(\"try to delete an expanded token: flags\")\n"))
+ (bugon.res Ok) (cards.res Ok) (cast.res Ok) (cast_iso.res Ok)
+ (compare.res Ok) (const.res Ok) (const1bis.res Ok) (const_adding.res Ok)
+ (const_array.res Ok) (const_implicit_iso.res Ok) (constty.res Ok)
+ (constx.res Ok) (cs_check.res Ok) (cst.res Ok) (csw.res Ok)
+ (dbg.res
+  (Pb
+   "INCORRECT:diff token: else VS (\nFile <COCCIOUTPUTFILE>, line 8, column 2,  charpos = 133\n    around = 'else', whole content = \t\telse pr = NULL;;\nFile \"tests/dbg.res\", line 7, column 5,  charpos = 130\n    around = '(', whole content = \t\tDBG(\"PCI\");\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -4,6 +4,6 @@\n     \tstruct resource *pr, *r = &dev->resource[idx];\n     \n     \tif (pr)\n    -\t\tDBG\n    -\t\telse pr = NULL;;\n    +\t\tDBG(\"PCI\");\n    +\telse pr = NULL;\n     }\n"))
+ (dc_close.res Ok) (debug.res Ok) (dec.res Ok) (decl.res Ok) (decl2.res Ok)
+ (decl_space.res Ok)
+ (decl_split.res
+  (Pb
+   "INCORRECT:diff token: int VS }\nFile \"tests/decl_split.c\", line 2, column 8,  charpos = 27\n    around = 'int', whole content =         int x, y;\nFile \"tests/decl_split.res\", line 2, column 0,  charpos = 19\n    around = '}', whole content = }\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,3 +1,2 @@\n     int func(int i) { \n    -        int x, y;\n     }\n"))
+ (define_exp.res Ok) (define_param.res Ok) (deftodo.res Ok) (deref.res Ok)
+ (devlink.res Ok) (disjexpr.res Ok) (disjexpr_ver1.res Ok)
+ (disjexpr_ver2.res Ok) (distribute.res Ok) (double.res Ok)
+ (double_assign.res Ok)
+ (double_switch.res (Pb "PROBLEM\n   exn = Common.Impossible\n"))
+ (doublepos.res Ok)
+ (doubleswitch.res (Pb "PROBLEM\n   exn = Common.Impossible\n"))
+ (dowhile.res Ok) (dropf.res Ok) (dropparam.res Ok) (edots.res Ok)
+ (edots_ver1.res Ok) (empty.res Ok) (end_commas.res Ok) (endif.res Ok)
+ (exp.res Ok) (expnest.res Ok) (expopt.res Ok) (expopt2.res Ok)
+ (expopt3.res Ok) (expopt3_ver1.res Ok) (expopt3_ver2.res Ok) (fields.res Ok)
+ (fieldsmin.res Ok) (fix_flow_need.res Ok) (fn_todo.res Ok) (fnptr.res Ok)
+ (fnret.res Ok) (four.res Ok) (foura.res Ok) (fp.res Ok) (fun.res Ok)
+ (gilles-question.res Ok) (gotobreak.res Ok) (hd.res Ok) (headers.res Ok)
+ (hex.res Ok)
+ (hil1.res Ok) (if.res Ok) (ifbr.res Ok) (ifdef1.res Ok) (ifdef2.res Ok)
+ (ifdef3.res
+  (Pb
+   "PROBLEM\n   exn = Lexer_cocci.Lexical(\"unrecognised symbol, in token rule: #\")\n"))
+ (ifdef4.res Ok) (ifdef5.res Ok) (ifdef6.res Ok) (ifdef6a.res Ok)
+ (ifend.res Ok) (ifzer.res Ok) (inc.res Ok)
+ (incdir.res
+  (Pb
+   "INCORRECT:diff token: x VS 12\nFile \"tests/incdir.c\", line 4, column 6,  charpos = 46\n    around = 'x', whole content =   foo(x);\nFile \"tests/incdir.res\", line 4, column 6,  charpos = 46\n    around = '12', whole content =   foo(12);\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,5 +1,5 @@\n     #include \"sub/incdir2.c\"\n     \n     int main () {\n    -  foo(x);\n    +  foo(12);\n     }\n"))
+ (incl.res Ok) (inclifdef.res Ok) (include.res Ok)
+ (incompatible_value.res Ok) (inherited.res Ok) (inherited_ver1.res Ok)
+ (inhpos.res Ok) (initializer.res Ok) (initializer_many_fields.res Ok)
+ (inline.res Ok) (isococci.res Ok) (isotest.res Ok) (isotest2.res Ok)
+ (iterator.res Ok)
+ (jloop1.res
+  (Pb
+   "PROBLEM\n   exn = Failure(\"minus: parse error: \\n = File \\\"tests/jloop1.cocci\\\", line 10, column 3,  charpos = 129\\n    around = '...>', whole content =    ...>\\n\")\n"))
+ (julia10.res Ok) (julia7.res Ok) (keep_comma.res Ok)
+ (km.res
+  (Pb
+   "INCORRECT:diff token: } VS memset\nFile <COCCIOUTPUTFILE>, line 4, column 0,  charpos = 85\n    around = '}', whole content = }\nFile \"tests/km.res\", line 4, column 2,  charpos = 87\n    around = 'memset', whole content =   memset(data, 0, element->string.length + 1);\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,4 +1,5 @@\n     int main() {\n       int *data = kzalloc(element->string.length + 1, GFP_KERNEL);\n       foo();\n    +  memset(data, 0, element->string.length + 1);\n     }\n"))
+ (kmalloc.res Ok) (kmc.res Ok) (ktype.res Ok)
+ (labels_metastatement.res
+  (Pb
+   "INCORRECT:diff token: { VS x\nFile <COCCIOUTPUTFILE>, line 4, column 2,  charpos = 30\n    around = '{', whole content =   {\nFile \"tests/labels_metastatement.res\", line 4, column 4,  charpos = 32\n    around = 'x', whole content =     x = 3; foo();\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,15 +1,10 @@\n     int foo(int i) {\n     \n       if(1) {\n    -  {\n    -    x = 3;\n    -    foo();\n    -    z = 4;\n    -    foo();\n    -  }\n    -  foo();\n    -  }\n    -  foo(); // we dont want that it add both foo on the } and on the endif\n    +    x = 3; foo();\n    +    z = 4; foo();\n    +  } // we dont want that it add both foo on the } and on the endif\n         // (note: but need correct endif accrochage)\n    +  foo();\n     \n     }\n"))
+ (labels_metastatement_ver1.res Ok) (local.res Ok) (localid.res Ok)
+ (longlong.res Ok) (longlongint.res Ok) (loop.res Ok) (lvalue.res Ok)
+ (macro.res Ok) (match_no_meta.res Ok) (max.res Ok)
+ (metahex.res
+  (Pb
+   "INCORRECT:diff token: f VS }\nFile \"tests/metahex.c\", line 2, column 2,  charpos = 15\n    around = 'f', whole content =   f(3);\nFile \"tests/metahex.res\", line 2, column 0,  charpos = 13\n    around = '}', whole content = }\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,4 +1,2 @@\n     int main() {\n    -  f(3);\n    -  g(0x03);\n     }\n"))
+ (metaruleelem.res Ok) (metastatement2.res Ok) (metastatement_for.res Ok)
+ (metastatement_if.res Ok) (minstruct.res Ok) (minusdots.res Ok)
+ (minusdots_ver1.res Ok)
+ (multi_func1.res
+  (Pb
+   "PROBLEM\n   exn = Failure(\"minus: parse error: \\n = File \\\"tests/multi_func1.cocci\\\", line 12, column 2,  charpos = 102\\n    around = 'fn2', whole content =   fn2(...) {\\n\")\n"))
+ (multiplus.res Ok) (multitype.res Ok) (multitypedef.res Ok)
+ (multivars.res Ok) (nest.res Ok) (nestone.res Ok) (nestseq.res Ok)
+ (neststruct.res Ok) (nl.res Ok) (nocast.res Ok) (not.res Ok) (noty.res Ok)
+ (null_type.res Ok) (of.res Ok) (oneline.res Ok) (opt.res Ok)
+ (optional_qualifier.res Ok) (optional_storage.res Ok) (orexp.res Ok)
+ (param.res Ok) (param_end.res Ok) (param_ver1.res Ok)
+ (parameters_dots.res Ok) (partial.res Ok)
+ (pb_distribute_type.res
+  (Pb
+   "INCORRECT:PB parsing only in generated-file\n    diff (result(<) vs expected_result(>)) = \n    @@ -5,11 +5,11 @@\n     \n     \n     int foo() {\n    -  int * *x;\n    +  int **x;\n       return 0;\n     }\n     \n     int foo() {\n    -  int[45] *x;\n    +  int (*x)[45];\n       return 0;\n     }\n"))
+ (pb_distribute_type2.res
+  (Pb
+   "INCORRECT:PB parsing only in generated-file\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,5 +1,5 @@\n     int foo() {\n    -  int* x;\n    +  int *x;\n       return 0;\n     }\n     \n    @@ -10,6 +10,6 @@\n     }\n     \n     int foo() {\n    -  int x[45]*;\n    +  int (*x)[45];\n       return 0;\n     }\n"))
+ (pb_distribute_type3.res
+  (Pb "PROBLEM\n   exn = Failure(\"line 7: index 53 53 already used\\n\")\n"))
+ (pb_distribute_type4.res Ok) (pb_params_iso.res Ok)
+ (pb_parsing_macro.res Ok) (pb_tag_symbols.res Ok) (pmac.res Ok)
+ (posiso.res Ok) (positionc.res Ok) (post.res Ok) (print_return.res Ok)
+ (proto.res Ok) (proto2.res Ok) (proto_ver1.res Ok) (proto_ver2.res Ok)
+ (protoassert.res Ok) (protox.res Ok) (rcu3.res Ok)
+ (remstruct.res
+  (Pb
+   "INCORRECT:not same number of entities (func, decl, ...)\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,10 +1,3 @@\n    -\n    -      .ack    = mpuio_ack_irq,\n    -      .mask   = mpuio_mask_irq,\n    -      .unmask = mpuio_unmask_irq\n    -\n    -  .b = 15,\n    -\n     int hello ( String input )\n     {\n       String input = input.lowercase();\n"))
+ (replace_typedef.res Ok) (reserved.res Ok) (retmacro.res Ok) (rets.res Ok)
+ (return.res Ok) (return_implicit.res Ok) (same_expr.res Ok)
+ (scope_problem.res
+  (Pb
+   "INCORRECT:diff token: } VS a\nFile <COCCIOUTPUTFILE>, line 6, column 2,  charpos = 44\n    around = '}', whole content =   }\nFile \"tests/scope_problem.res\", line 7, column 4,  charpos = 49\n    around = 'a', whole content =     a = 2;\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,8 +1,10 @@\n     void main(int i) {\n     \n     \n    +\n       if(1) {\n         int a;\n    +    a = 2;\n       }\n     \n     \n"))
+ (serio.res
+  (Pb
+   "INCORRECT:diff token: init_MUTEX VS mutex_init\nFile \"tests/serio.c\", line 7, column 1,  charpos = 130\n    around = 'init_MUTEX', whole content = \tinit_MUTEX(&serio->drv_sem);\nFile \"tests/serio.res\", line 7, column 1,  charpos = 130\n    around = 'mutex_init', whole content = \tmutex_init(&serio->new_lock);\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -4,5 +4,5 @@\n     \n     static void serio_init_port(struct serio *serio)\n     {\n    -\tinit_MUTEX(&serio->drv_sem);\n    +\tmutex_init(&serio->new_lock);\n     }\n"))
+ (shared_brace.res Ok) (signed.res Ok) (sis.res Ok) (sizeof.res Ok)
+ (sizeof_julia.res Ok) (skip.res Ok) (sp.res Ok) (spaces.res Ok) (spl.res Ok)
+ (static.res (Pb "PROBLEM\n   exn = Common.Impossible\n")) (stm1.res Ok)
+ (stm10.res Ok) (stm10_ver1.res Ok) (stm2.res Ok) (stm3.res Ok) (stm4.res Ok)
+ (stm5.res Ok) (stm6.res Ok) (stm7.res Ok) (stm8.res Ok) (stmt.res Ok)
+ (strangeorder.res Ok) (string.res Ok) (struct.res Ok)
+ (struct_metavar.res Ok) (struct_typedef.res Ok) (structfoo.res Ok)
+ (substruct.res Ok) (sw.res Ok) (switch.res Ok) (td.res Ok) (test0.res Ok)
+ (test1.res Ok) (test10.res Ok) (test10_ver1.res Ok) (test11.res Ok)
+ (test11_ver1.res Ok) (test12.res Ok) (test2.res Ok) (test3.res Ok)
+ (test4.res Ok) (test5.res Ok) (test5_ver1.res Ok) (test6.res Ok)
+ (test7.res Ok) (test8.res Ok) (test9.res Ok) (test_unsigned_meta.res Ok)
+ (three_types.res Ok) (threea.res Ok) (top.res Ok) (topdec.res Ok)
+ (topdec_ver1.res Ok) (topdec_ver2.res Ok) (toplevel_macrostmt.res Ok)
+ (toplevel_struct.res Ok) (tup.res Ok) (twoproto.res Ok) (ty.res Ok)
+ (ty1.res Ok) (ty_tyexp.res Ok) (type.res Ok) (type1.res Ok)
+ (type_annotated.res Ok) (type_ver1.res Ok)
+ (type_ver2.res
+  (Pb
+   "INCORRECT:PB parsing only in generated-file\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,5 +1,5 @@\n     int foo() {\n    -  int[10] *x;\n    +  int *x[10];\n       return 0;\n     }\n     \n"))
+ (typedef.res Ok)
+ (typedef3.res
+  (Pb
+   "INCORRECT:diff token: link VS p_dev\nFile <COCCIOUTPUTFILE>, line 7, column 29,  charpos = 137\n    around = 'link', whole content = \tunsigned int iobase = info->link.io.BasePort1;\nFile \"tests/typedef3.res\", line 7, column 29,  charpos = 137\n    around = 'p_dev', whole content = \tunsigned int iobase = info->p_dev->io.BasePort1;\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -4,7 +4,7 @@\n     \n     static void should_work(foo *info)\n     {\n    -\tunsigned int iobase = info->link.io.BasePort1;\n    +\tunsigned int iobase = info->p_dev->io.BasePort1;\n     }\n     \n     static void does_work(struct bluecard_info_t *info)\n"))
+ (typedef_double.res Ok)
+ (typeof.res
+  (Pb
+   "INCORRECT:diff token: x VS sizeof\nFile <COCCIOUTPUTFILE>, line 3, column 4,  charpos = 26\n    around = 'x', whole content =   f(x);\nFile \"tests/typeof.res\", line 3, column 4,  charpos = 26\n    around = 'sizeof', whole content =   f(sizeof(struct foo));\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,4 +1,4 @@\n     int main() {\n       int x;\n    -  f(x);\n    +  f(sizeof(struct foo));\n     }\n"))
+ (useless_cast.res Ok) (varargs.res Ok) (video1bis.res Ok) (void.res Ok)
+ (vpos.res Ok) (whitespace.res Ok) (wierd_argument.res Ok)
+ (wierdinit.res
+  (Pb
+   "seems incorrect, but only because of code that was not parsablediff token: dev_link_t VS struct\nFile \"tests/wierdinit.c\", line 4, column 1,  charpos = 27\n    around = 'dev_link_t', whole content = \tdev_link_t *link;\nFile \"tests/wierdinit.res\", line 4, column 1,  charpos = 27\n    around = 'struct', whole content = \tstruct pcmcia_device *link;\n"))
+ (ws2.res Ok) (y2.res Ok) (zero.res Ok))
\ No newline at end of file
similarity index 100%
rename from tests/A_and_E.c
rename to tests/a_and_e.c
similarity index 100%
rename from tests/A_and_E.cocci
rename to tests/a_and_e.cocci
similarity index 100%
rename from tests/A_and_E.res
rename to tests/a_and_e.res
similarity index 100%
rename from tests/A_and_E_ver1.c
rename to tests/a_and_e_ver1.c
index bc478a4..e03afca 100644 (file)
@@ -1,4 +1,4 @@
-@@ expression E; @@
+@disable unlikely@ expression E; @@
 
 - if (unlikely(E)) { BUG(); }
 + BUG_ON(E);
index 047bb23..8276c07 100644 (file)
@@ -1,4 +1,4 @@
 static void b44_tx(struct b44 *bp)
 {
-                       BUG(skb == NULL);
+                       BUG_ON(skb == NULL);
 }
diff --git a/tests/double_switch.c b/tests/double_switch.c
new file mode 100644 (file)
index 0000000..e86ce11
--- /dev/null
@@ -0,0 +1,15 @@
+
+static NTSTATUS get_line_control(int fd, SERIAL_LINE_CONTROL* slc)
+{
+#ifdef CMSPAR
+    switch (port.c_cflag & (PARENB | PARODD | CMSPAR))
+#else
+    switch (port.c_cflag & (PARENB | PARODD))
+#endif
+    {
+    case 0:                     slc->Parity = NOPARITY;         break;
+    case PARENB:                slc->Parity = EVENPARITY;       break;
+    case PARENB|PARODD:         slc->Parity = ODDPARITY;        break;
+    }
+    return STATUS_SUCCESS;
+}
diff --git a/tests/double_switch.cocci b/tests/double_switch.cocci
new file mode 100644 (file)
index 0000000..06b3d0b
--- /dev/null
@@ -0,0 +1,7 @@
+@s@
+expression E;
+position p;
+@@
+
+- E@p < 0
++ 12
diff --git a/tests/double_switch.res b/tests/double_switch.res
new file mode 100644 (file)
index 0000000..e86ce11
--- /dev/null
@@ -0,0 +1,15 @@
+
+static NTSTATUS get_line_control(int fd, SERIAL_LINE_CONTROL* slc)
+{
+#ifdef CMSPAR
+    switch (port.c_cflag & (PARENB | PARODD | CMSPAR))
+#else
+    switch (port.c_cflag & (PARENB | PARODD))
+#endif
+    {
+    case 0:                     slc->Parity = NOPARITY;         break;
+    case PARENB:                slc->Parity = EVENPARITY;       break;
+    case PARENB|PARODD:         slc->Parity = ODDPARITY;        break;
+    }
+    return STATUS_SUCCESS;
+}
diff --git a/tests/longlongint.c b/tests/longlongint.c
new file mode 100644 (file)
index 0000000..5710250
--- /dev/null
@@ -0,0 +1,9 @@
+int main() {
+  unsigned int x;
+  int y;
+  unsigned long long int a;
+  long long int b;
+  unsigned long long m;
+  long long n;
+  return 0;
+}
diff --git a/tests/longlongint.cocci b/tests/longlongint.cocci
new file mode 100644 (file)
index 0000000..05ee26b
--- /dev/null
@@ -0,0 +1,8 @@
+@@
+type T;
+identifier x,y;
+@@
+
+- unsigned T x;
+- T y;
+  ... when any
similarity index 55%
rename from tests/hex2.res
rename to tests/longlongint.res
index b2f9976..4cce7f6 100644 (file)
@@ -1,2 +1,3 @@
 int main() {
+  return 0;
 }
diff --git a/tests/not_converted.c b/tests/not_converted.c
new file mode 100644 (file)
index 0000000..1e11ed2
--- /dev/null
@@ -0,0 +1,14 @@
+// -ifdef_to_if doesn't convert this ifdef
+
+ssize_t __net_Write( vlc_object_t *p_this, int fd, const v_socket_t *p_vs,
+                     const uint8_t *p_data, size_t i_data )
+{
+        if (p_vs != NULL)
+            val = p_vs->pf_send (p_vs->p_sys, p_data, i_data);
+        else
+#ifdef WIN32
+            val = send (fd, p_data, i_data, 0);
+#else
+            val = write (fd, p_data, i_data);
+#endif
+}
diff --git a/tests/not_converted.cocci b/tests/not_converted.cocci
new file mode 100644 (file)
index 0000000..927f0ea
--- /dev/null
@@ -0,0 +1,46 @@
+// A variable is used between two affectations. 
+//
+// Confidence: High
+// Copyright: (C) Nicolas Palix, Julia Lawall, DIKU.  GPLv2.
+// URL: 
+// Options: -ifdef_to_if
+
+@filter@
+local idexpression E;
+expression Er;
+@@
+
+E = Er;
+
+@r @
+local idexpression filter.E;
+position b;
+position e,f;
+expression E1;
+expression E2;
+@@
+
+E@b = E1;
+... when != E
+    when strict
+(
+E@f = <+...E...+>;
+|
+E@e = E2;
+)
+
+@script:python@
+p1 << r.b;
+p2 << r.e;
+p3 << r.f;
+@@
+
+cocci.include_match(False)
+
+@script:python@
+p1 << r.b;
+p2 << r.e;
+@@
+
+cocci.print_main("",p1)
+cocci.print_secs("",p2)
diff --git a/tests/not_converted_ver1.c b/tests/not_converted_ver1.c
new file mode 100644 (file)
index 0000000..93de545
--- /dev/null
@@ -0,0 +1,92 @@
+// -ifdef_to_if doesn't convert this ifdef
+
+static int do_accept(int acc_sock, int *sock, char **host)
+       {
+       int ret,i;
+       struct hostent *h1,*h2;
+       static struct sockaddr_in from;
+       int len;
+/*     struct linger ling; */
+
+       if (!ssl_sock_init()) return(0);
+
+#ifndef OPENSSL_SYS_WINDOWS
+redoit:
+#endif
+
+       memset((char *)&from,0,sizeof(from));
+       len=sizeof(from);
+       /* Note: under VMS with SOCKETSHR the fourth parameter is currently
+        * of type (int *) whereas under other systems it is (void *) if
+        * you don't have a cast it will choke the compiler: if you do
+        * have a cast then you can either go for (int *) or (void *).
+        */
+       ret=accept(acc_sock,(struct sockaddr *)&from,(void *)&len);
+       if (ret == INVALID_SOCKET)
+               {
+#if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK))
+               i=WSAGetLastError();
+               BIO_printf(bio_err,"accept error %d\n",i);
+#else
+               if (errno == EINTR)
+                       {
+                       /*check_timeout(); */
+                       goto redoit;
+                       }
+               fprintf(stderr,"errno=%d ",errno);
+               perror("accept");
+#endif
+               return(0);
+               }
+
+/*
+       ling.l_onoff=1;
+       ling.l_linger=0;
+       i=setsockopt(ret,SOL_SOCKET,SO_LINGER,(char *)&ling,sizeof(ling));
+       if (i < 0) { perror("linger"); return(0); }
+       i=0;
+       i=setsockopt(ret,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i));
+       if (i < 0) { perror("keepalive"); return(0); }
+*/
+
+       if (host == NULL) goto end;
+#ifndef BIT_FIELD_LIMITS
+       /* I should use WSAAsyncGetHostByName() under windows */
+       h1=gethostbyaddr((char *)&from.sin_addr.s_addr,
+               sizeof(from.sin_addr.s_addr),AF_INET);
+#else
+       h1=gethostbyaddr((char *)&from.sin_addr,
+               sizeof(struct in_addr),AF_INET);
+#endif
+       if (h1 == NULL)
+               {
+               BIO_printf(bio_err,"bad gethostbyaddr\n");
+               *host=NULL;
+               /* return(0); */
+               }
+       else
+               {
+               if ((*host=(char *)OPENSSL_malloc(strlen(h1->h_name)+1)) == NULL)
+                       {
+                       perror("OPENSSL_malloc");
+                       return(0);
+                       }
+               BUF_strlcpy(*host,h1->h_name,strlen(h1->h_name)+1);
+
+               h2=GetHostByName(*host);
+               if (h2 == NULL)
+                       {
+                       BIO_printf(bio_err,"gethostbyname failure\n");
+                       return(0);
+                       }
+               i=0;
+               if (h2->h_addrtype != AF_INET)
+                       {
+                       BIO_printf(bio_err,"gethostbyname addr is not AF_INET\n");
+                       return(0);
+                       }
+               }
+end:
+       *sock=ret;
+       return(1);
+       }
diff --git a/tests/pb_parsing_macro.c b/tests/pb_parsing_macro.c
new file mode 100644 (file)
index 0000000..5552f55
--- /dev/null
@@ -0,0 +1,4 @@
+#define FOO_METH_TEST(a) prefix_##a
+void FOO_METH_TEST(foo)(int x){
+ alloca(x);
+}
diff --git a/tests/pb_parsing_macro.cocci b/tests/pb_parsing_macro.cocci
new file mode 100644 (file)
index 0000000..fc9db81
--- /dev/null
@@ -0,0 +1,5 @@
+@@  expression E; @@
+
+-alloca(E)
++malloc(E)
+
diff --git a/tests/pb_parsing_macro.res b/tests/pb_parsing_macro.res
new file mode 100644 (file)
index 0000000..aa1042d
--- /dev/null
@@ -0,0 +1,4 @@
+#define FOO_METH_TEST(a) prefix_##a
+void FOO_METH_TEST(foo)(int x){
+ malloc(x);
+}
index 3ef9dfc..cd6da6a 100644 (file)
@@ -29,13 +29,13 @@ install_bridge: bridge
 .PHONY: $(SUBDIRS)
 
 
-SYSLIBS = str.cma unix.cma 
+SYSLIBS = str.cma unix.cma
 
 INCLUDE=-I ../commons -I ../extra -I  ../parsing_c
 LIBS=../commons/commons.cma ../globals/globals.cma \
-     ../parsing_c/parsing_c.cma ../extra/extra.cma 
+     ../parsing_c/parsing_c.cma ../extra/extra.cma
 
-OCAMLC=ocamlc$(OPTBIN) -g -dtypes   $(INCLUDE) 
+OCAMLC=ocamlc$(OPTBIN) -g -dtypes   $(INCLUDE)
 OCAMLOPT=ocamlopt$(OPTBIN)   $(INCLUDE) $(OPTFLAGS)
 #OCAMLLEX=ocamllex$(OPTBIN) -ml
 OCAMLLEX=ocamllex$(OPTBIN)
@@ -70,4 +70,7 @@ beforedepend::
 depend:: beforedepend
        ocamldep $(INCLUDE) *.mli *.ml    > .depend
 
+distclean::
+       rm -f .depend
+
 -include .depend