+++ /dev/null
-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
-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
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=
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
##############################################################################
# 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
$(MAKESUBDIRS:%=%.opt):
$(MAKE) -C $(@:%.opt=%) OCAMLCFLAGS="$(OCAMLCFLAGS)" all.opt
+#dependencies:
# commons:
# globals:
# menhirlib:
# 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)
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
$(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
##############################################################################
$(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
rm -rf $(DESTDIR)$(SHAREDIR)/python/coccilib
rm -f $(DESTDIR)$(MANDIR)/man1/spatch.1
-
-
version:
@echo $(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)/%)
# 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
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)
-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
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
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
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
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
-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.
-*- 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
/* {{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.
(* --------------------------------------------------------------------- *)
(* 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)
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 =
(* 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 ->
(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 ()
(* 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);
| _ ->
* 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 ->
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
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
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;
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
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 (
(* 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
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
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;
(* 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.
(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
[] 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 =
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 =
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 *)
| 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
* 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
-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.
+++ /dev/null
-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
##############################################################################
# Variables
##############################################################################
+
+# The main library
-include ../Makefile.config
TARGET=commons
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
# 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
# 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.
# if need C code
OCAMLMKLIB=ocamlmklib
-CC=gcc
+CC=gcc
##############################################################################
# Top rules
# Other commons libs target
##############################################################################
-all_libs: gdbm bdb gui mpi backtrace
+all_libs: gdbm bdb gui mpi regexp backtrace
#-----------------------------------------------------------------------------
gdbm: commons_gdbm.cma
#-----------------------------------------------------------------------------
-bdb:
+bdb:
$(MAKE) INCLUDESEXTRA="$(BDBINCLUDES)" commons_bdb.cma
-bdb.opt:
+bdb.opt:
$(MAKE) INCLUDESEXTRA="$(BDBINCLUDES)" commons_bdb.cmxa
commons_bdb.cma: $(MYBDBSRC:.ml=.cmo)
#-----------------------------------------------------------------------------
-mpi:
+mpi:
$(MAKE) INCLUDESEXTRA="$(MPIINCLUDES)" commons_mpi.cma
-mpi.opt:
+mpi.opt:
$(MAKE) INCLUDESEXTRA="$(MPIINCLUDES)" commons_mpi.cmxa
commons_mpi.cma: $(MYMPISRC:.ml=.cmo)
#-----------------------------------------------------------------------------
-python:
+python:
$(MAKE) INCLUDESEXTRA="$(PYINCLUDES)" commons_python.cma
-python.opt:
+python.opt:
$(MAKE) INCLUDESEXTRA="$(PYINCLUDES)" commons_python.cmxa
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
##############################################################################
otags -no-mli-tags -r .
clean::
- rm -f gmon.out
+ rm -f gmon.out
forprofiling:
$(MAKE) OPTFLAGS="-p -inline 0 " opt
clean::
rm -f *.cm[iox] *.o *.a *.cma *.cmxa *.annot
- rm -f *~ .*~ #*#
+ rm -f *~ .*~ #*#
clean::
for i in $(SUBDIRS); do (cd $$i; \
cd ..; ) \
done
-depend:
+depend:
$(OCAMLDEP) *.mli *.ml > .depend
for i in $(SUBDIRS); do $(OCAMLDEP) $$i/*.ml $$i/*.mli >> .depend; done
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.
-(* 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
let push2 v l =
l := v :: !l
+let null xs = match xs with [] -> true | _ -> false
* 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 *)
(* if really want to forbid to use '='
let (=) = (=|=)
*)
+let (=) () () = false
(*****************************************************************************)
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)
(*****************************************************************************)
(*****************************************************************************)
(* 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 ->
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
(* 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
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
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
(* 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
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
| [] -> ""
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)
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 =
* 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
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
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)
(*****************************************************************************)
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
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)
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
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)
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
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 *)
(*
* (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) =
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
(* 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 *)
let do_in_fork f =
let pid = Unix.fork () in
- if pid = 0
+ if pid =|= 0
then
begin
(* Unix.setsid(); *)
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 *)
+> 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
+> 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
)
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);
(* 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
| [] -> []
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)
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
| [] -> []
| 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)
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)=
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) =
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) ->
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
)
(* 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
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))
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
| 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
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
| 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
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 =
| 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
| [] -> ([],[])
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
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
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']
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 =
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 =
(* 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 *)
(*****************************************************************************)
[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)
(*****************************************************************************)
(* 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 ->
(* 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 ->
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 =
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 =
(*****************************************************************************)
type 'a hashset = ('a, bool) Hashtbl.t
+ (* with sexp *)
let hash_hashset_add k e h =
(* 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
(* 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))
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
(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
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) *)
column: int;
file: filename;
}
+ (* with sexp *)
let fake_parse_info = {
charpos = -1; str = "";
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 ->
*)
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 =
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;
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) *)
| [] -> 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)
* 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 ()->
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 *)
(* alias *)
val string_of_exn : exn -> string
+type error = Error of string
+
+type evotype = unit
+val evoval : evotype
+
(*****************************************************************************)
(* Environment *)
(*****************************************************************************)
(* 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 (=)
-
(*###########################################################################*)
(* And now basic types *)
(*###########################################################################*)
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
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
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
(* 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 *)
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
(* 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
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 *)
(* 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
--- /dev/null
+(* 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
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 >}
(* 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:
--- /dev/null
+
+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.
+
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
| [] -> [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
)
| 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 ->
(
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
| 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
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
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) ->
--- /dev/null
+(* 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
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
`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`;
#
- 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
#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)
# clean rule for others files
clean::
rm -f *.cm[iox] *.o *.annot
- rm -f *~ .*~ #*#
+ rm -f *~ .*~ #*#
-depend:
+depend:
$(OCAMLDEP) *.mli *.ml > .depend
distclean::
--- /dev/null
+// 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)
--- /dev/null
+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)
\usepackage[pdfborder={0 0 0}]{hyperref}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color}
+\usepackage{times}
\usepackage[T1]{fontenc}
\usepackage{multirow}
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
\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
\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}}
\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
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,
\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 $|$}}
\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$}
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
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
+++ /dev/null
-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
#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
# Generic variables
##############################################################################
-#for warning: -w A
+#for warning: -w A
#for profiling: -p -inline 0 with OCAMLOPT
OCAMLCFLAGS ?= -g -dtypes
.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
(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
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]
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
| _ -> 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
(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) ->
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
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)
)
)
| 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
)
) >&&>
| 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)) ->
(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
)
* 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
* The authors reserve the right to distribute this or future versions of
* Coccinelle under other licenses.
*)
-
-
open Common
module A = Ast_cocci
(* 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
(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
| 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)))
(*---------------------------------------------------------------------------*)
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
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
(* 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 =
| (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
| 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)
))
(* 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])
))))
(* ------------------------------------------------------------------------- *)
+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) >&&>
* 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
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
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')
)
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)
startendxs +> List.fold_left (fun acc (startxs, endxs) ->
acc >||> (
- (if startxs = []
+ (if null startxs
then
if mcode_contain_plus (mcodekind mcode)
then fail
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
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 ->
| 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
+(*
+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;}
)
)
*)
- | Some _, Right _ -> fail
- | None, Left _ -> fail
+ | Some _, None -> fail
+ | None, Some _ -> fail
)
)))
| _, (B.DeclList (xs, iiptvirgb::iifakestart::iisto)) ->
- if X.mode = PatternMode
+ if X.mode =*= PatternMode
then
xs +> List.fold_left (fun acc var ->
acc >||> (
* 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;
| 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
(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 ->
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;
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;
)
| 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;
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;
)))))
| 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;
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;
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 ->
| 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;
| 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;
| A.OptDecl _, _ | A.UniqueDecl _, _ ->
failwith "not handling Opt/Unique Decl"
- | _, ({B.v_namei=Some _}, _)
- -> fail
+ | _, ({B.v_namei=Some _}, _) ->
+ fail
startendxs +> List.fold_left (fun acc (startxs, endxs) ->
acc >||> (
- (if startxs = []
+ (if null startxs
then
if mcode_contain_plus (mcodekind mcode)
then fail
| [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;
(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),
| 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 ->
(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 ->
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
(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)))
)
* 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
| _, (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 _),
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
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";
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
)
(* 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)
| _, 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
startendxs +> List.fold_left (fun acc (startxs, endxs) ->
acc >||> (
- (if startxs = []
+ (if null startxs
then
if mcode_contain_plus (mcodekind mcode)
then fail
| 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)
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)
))
| 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 (
| 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;
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 ->
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
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
| _, 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 *)
(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 (_, _)|
| 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 , _ -> []
(* 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);
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
| (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
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
* The authors reserve the right to distribute this or future versions of
* Coccinelle under other licenses.
*)
-
-
open Common
module Flag_engine = Flag_matcher
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)
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()
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
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
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
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 ->
(match get_pos mck with
| Ast_cocci.DontCarePos -> true
| Ast_cocci.FixPos (i1, i2) ->
- i1 = min && i2 = max
+ i1 =*= min && i2 =*= max
| _ -> raise Impossible
)
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 ->
+++ /dev/null
-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
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)
.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
| 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))
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
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
*)
.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
-let version = "0.1.6a"
+let version = "0.1.7"
let path =
try (Sys.getenv "COCCINELLE_HOME")
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.
+
" 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,
" 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";
" <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"
];
"change of algorithm options",
"",
[
+(* no popl in official version
"-popl", Arg.Set FC.popl,
" simplified SmPL, for the popl paper";
Arg.Unit
(function _ -> FC.popl := true; Flag_popl.keep_all_wits := true),
" simplified SmPL, for the popl paper";
+*)
"-hrule", Arg.String
(function s ->
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
-
(*****************************************************************************)
-(* 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
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
| _ -> 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
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);
));
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
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 *)
(* --------------------------------------------------------- *)
+++ /dev/null
-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
engine.ml tableFormat.ml tableInterpreter.ml convert.ml
LIBS=
-INCLUDES=
+INCLUDES=
# copy what the menhir authors do
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)
$(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.
.ml.cmx:
$(OCAMLOPT) -c $<
-.ml.mldepend:
+.ml.mldepend:
$(OCAMLC) -i $<
clean::
depend:: beforedepend
$(OCAMLDEP) *.mli *.ml > .depend
+distclean::
+ rm -f .depend
+
-include .depend
--- /dev/null
+##############################################################################
+# 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
--- /dev/null
+(* 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))
--- /dev/null
+(* 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]. *)
--- /dev/null
+(* 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
--- /dev/null
+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
--- /dev/null
+{
+ (* 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
+}
--- /dev/null
+---------------------------------------------------------------------------\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
--- /dev/null
+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!
--- /dev/null
+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
--- /dev/null
+%{
+ (* 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 { [] }
--- /dev/null
+(* 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
--- /dev/null
+(* 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]. *)
--- /dev/null
+(*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"
--- /dev/null
+include Pre_sexp
--- /dev/null
+(* 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
--- /dev/null
+(* 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
--- /dev/null
+(* 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
+++ /dev/null
-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
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 \
# 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
.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
(*****************************************************************************)
(* 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.
* 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
* 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
* 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: *)
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
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 *)
(* ------------------------------------------------------------------------- *)
* 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
| 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;'
* 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
and field = fieldbis wrap
and fieldbis =
| DeclarationField of field_declaration
- | EmptyField (* gccext: *)
+ (* gccext: *)
+ | EmptyField
+
(* cppext: *)
| MacroStructDeclTodo
* 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 *)
(* -------------------------------------- *)
(* 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
(* 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 *)
| 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
* 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. *)
and constExpression = expression (* => int *)
-
(* ------------------------------------------------------------------------- *)
(* C statement *)
(* ------------------------------------------------------------------------- *)
* 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
- 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
* 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
(* 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 ';' *)
(* (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 a 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.
* 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: *)
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
(* 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 (* s ( ) { } 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: *)
(* 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
| DefineFunction of definition
| DefineInit of initialiser (* in practice only { } with possible ',' *)
+
(* TODO DefineMulti of define_val list *)
| DefineText of string wrap
+(* 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 *))
+
+
let noInstr = (ExprStatement (None), [])
let noTypedefDef () = None
+
let emptyMetavarsBinding =
([]: metavars_binding)
(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
let is_test (e : expression) =
let (_,info) = unwrap e in
let (_,test) = !info in
- test = Test
+ test =*= Test
(*****************************************************************************)
(* Abstract line *)
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 *)
-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 *)
(*****************************************************************************)
| 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)
+
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));
(* ------------------------- *)
- | 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);
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 =
| 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"
)
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
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
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
let lbl_start = [!counter_for_labels] in
- let ({f_name = funcs;
+ let ({f_name = namefuncs;
f_type = functype;
f_storage= sto;
f_body= compound;
}, 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
)
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
*)
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])
(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
in
- if children#tolist = []
+ if null children#tolist
then
if (* (depth = 0) *) startbraces <> []
then print_trace_error trace2
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
);
(match () with
- | _ when !pb_notparsed > 0 && !error = 0 ->
+ | _ when !pb_notparsed > 0 && !error =|= 0 ->
PbOnlyInNotParsedCorrectly ""
| _ when !error > 0 -> Pb ""
| _ -> Correct
| 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 =
let compare_result_to_bool correct =
- correct = Correct
+ correct =*= Correct
(*****************************************************************************)
+type fullstatement = statement
(* ---------------------------------------------------------------------- *)
(* The string is for debugging. Used by Ograph_extended.print_graph.
| 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
| 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,_)
(* 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
let is_ifdef_and_same_tag tag x =
match x with
| IfdefStmt (IfdefDirective ((_, tag2),_)) ->
- tag = tag2
+ tag =*= tag2
| StmtElem _ | CppDirectiveStmt _ -> false
| IfdefStmt2 _ -> raise Impossible
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) ->
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 *)
* 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
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
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')
* | _ { 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
* 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'
(* 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
{ 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)
- }
(* 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
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
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)
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 ->
| [] -> 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
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
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)
(*****************************************************************************)
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;
| 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 =
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)
);
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)
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
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
(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
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
| _ ->
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
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
* 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");
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");
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
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 *)
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"
);
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
%{
(* 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)
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
* 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 *)
| _ ->
let (cp,iicp) = compound in
match typ with
- | ((s,iis),
+ | (name,
(nQ, (FunctionType (fullt, (params,bool)),iifunc)),
(st,iist),
attrs)
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" *)
)
*)
(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
| ((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" *)
+ )
+ )
| _ -> ()
(*-------------------------------------------------------------------------- *)
let mk_e e ii = ((e, Ast_c.noType()), ii)
+
+let mk_string_wrap (s,info) = (s, [info])
%}
/*(* 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
%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
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 *)*/
/*(*************************************************************************)*/
| 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] }
{ 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] }
* 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 *)*/
* 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] }
| 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
/*(* 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] }
* 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] }
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]))) }
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;
+ }
}
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 }
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;
/*(*----------------------------*)*/
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 *) }
if fst (unwrap storage) <> NoSto
then internal_error "parsing dont allow this";
- FieldDeclList ([(Simple (None, returnType), []) , []], [$2])
+ FieldDeclList ([(Simple (None, returnType)) , []], [$2])
}
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)) }
/*(*----------------------------*)*/
{ 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 }
(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
*)*/
| /*(* 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] }
| HintMacroString
| HintMacroStatement
| HintAttribute
+ | HintMacroIdentBuilder
(* cf also data/test.h *)
"YACFE_STRING" , HintMacroString;
"YACFE_STATEMENT" , HintMacroStatement;
"YACFE_ATTRIBUTE" , HintAttribute;
+ "YACFE_IDENT_BUILDER" , HintMacroIdentBuilder;
+
"MACROSTATEMENT" , HintMacroStatement; (* backward compatibility *)
]
Parser_c.TMacroStmt (s, ii)
| HintAttribute ->
Parser_c.TMacroAttr (s, ii)
+ | HintMacroIdentBuilder ->
+ Parser_c.TMacroIdentBuilder (s, ii)
| 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)
| _ ->
(* 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
)
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
)
| 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)
)
| _ ->
- 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
)
| [] -> ()
(* ) { 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
));
| (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
));
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
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
(* 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
||
(col2 <= col1 &&
(match other.tok, restline2 with
- | TCBrace _, _ when ctx = InFunction -> true
+ | TCBrace _, _ when ctx =*= InFunction -> true
| Treturn _, _ -> true
| Tif _, _ -> true
| Telse _, _ -> true
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);
(* when s ==~ regexp_macro *)
let condition =
- (col1 = col2 &&
+ (col1 =|= col2 &&
col1 <> 0 && (* otherwise can match typedef of fundecl*)
(match other.tok with
| TPtVirg _ -> false
)) ||
(col2 <= col1 &&
(match other.tok with
- | TCBrace _ when ctx = InFunction -> true
+ | TCBrace _ when ctx =*= InFunction -> true
| Treturn _ -> true
| Tif _ -> true
| Telse _ -> true
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)
)
(* 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]) -> *)
->
(* [,(] 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;
(* [(,] 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;
(* 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
->
(* 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
->
(* 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;
| (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
->
*)
(* 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;
| (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)
| (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)
* 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
*)
| HintMacroString
| HintMacroStatement
| HintAttribute
+ | HintMacroIdentBuilder
val regexp_macro: Str.regexp
val regexp_annot: Str.regexp
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
| 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] ->
| 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();
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
| 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
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;
| 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
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);
| (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
| (StructUnion (_, sopt, fields),iis) -> ()
| (StructUnionName (s, structunion), iis) -> ()
| (EnumName s, iis) -> ()
- | (TypeName (s,_typ), iis) -> ()
+ | (TypeName (_name,_typ), iis) -> ()
| TypeOfType _, _ -> ()
| TypeOfExpr _, _ -> ()
| (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) =
| (StructUnion (_, sopt, fields),iis)-> ()
| (StructUnionName (s, structunion), iis) -> ()
| (EnumName s, iis) -> ()
- | (TypeName (s,_typ), iis) -> ()
+ | (TypeName (name,_typ), iis) -> ()
| TypeOfType _, _ -> ()
| TypeOfExpr _, _ -> ()
(* ---------------------- *)
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 *)
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;
returnt Ast_c.noattr;
pp_attributes pr_elem pr_space attrs;
- pr_elem is;
+ pp_name name;
pr_elem iifunc1;
| 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 ->
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)
);
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"))
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
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
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);
| 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
| 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)
| 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)
(* 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
| 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.
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
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
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
| 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);
* 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
))
* 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"
(* 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
* 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) ->
(* -------------------------------------------------- *)
- | 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)
(* -------------------------------------------------- *)
(* 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 *)
(* 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
| 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;
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
| 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;
_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;
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 ->
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 ->
| 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
| StructUnionName (su, s) -> true
(* should have completed with more information *)
- | TypeName (s, typ) ->
+ | TypeName (_name, typ) ->
(match typ with
| None -> false
| Some t ->
(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
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 ()
| 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
(* 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 *)
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 *)
+
(*****************************************************************************)
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)
(* 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
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)
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
(*****************************************************************************)
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
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) ->
| 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)
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 =
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)
(* 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 ->
| [] -> [(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
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 ""
(* 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
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)::_
| [] -> []
(* 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 ->
(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)
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 *)
(* 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 *)
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);
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
(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
| (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::_) ->
(* 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 ->
| 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"
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) ->
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) ->
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
(* 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);
*
* 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,
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;
}
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);
}
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;
| 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
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) ->
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;
)
| 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
| 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
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
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
)
| 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
-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
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;
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);
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,
| 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)
(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
| 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
+(* ------------------------------------------------------------------------ *)
))
- | 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));
| 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')
| 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)
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;
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
)
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;
| 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)
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
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;
}
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
-
+(* ------------------------------------------------------------------------ *)
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.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
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 \
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 \
../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
../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
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 \
$(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)
$(OCAMLC) -I $(MENHIR_PATH) -a -o $(LIB) $(MENHIR) $(OBJS)
-$(OPTLIB): $(GENERATED) $(OPTOBJS)
+$(OPTLIB): $(GENERATED) $(OPTOBJS)
$(OCAMLOPT) -I $(MENHIR_PATH) -a -o $(OPTLIB) $(MENHIRO) $(OPTOBJS)
clean::
rm -f $(LIB)
- rm -f $(OPTLIB) $(LIB:.cma=.a)
+ rm -f $(OPTLIB) $(LIB:.cma=.a)
rm -f $(TARGET)
# 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
module Ast0 = Ast0_cocci
module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
let call_right processor data s cont =
match processor data with
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
| _ -> 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
(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
(* --------------------------------------------------------------------- *)
| ScriptRule of
string * Ast_cocci.dependency * (string * Ast_cocci.meta_name) list *
string
+ | InitialScriptRule of string * string
+ | FinalScriptRule of string * string
(* --------------------------------------------------------------------- *)
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
(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
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
(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)
| 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
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
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)),
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)
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;
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 *)
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 *)
| 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
| 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
(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 *)
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
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;
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 *)
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 *)
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
(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 *)
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
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
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)
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 =
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
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 ->
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);
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
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
module Ast = Ast_cocci
module Ast0 = Ast0_cocci
module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
module U = Unparse_ast0
(* --------------------------------------------------------------------- *)
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
(* --------------------------------------------------------------------- *)
| 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
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
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 =
(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 =
| 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),_,_,_,_,_,_,_,_)
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
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
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;
| 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;
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
(* --------------------------------------------------------------------- *)
(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")
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
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
let show_SP = ref false
let show_iso_failures = ref true
+
+let iso_limit = ref (None : int option) (*(Some 3)*)
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 =
[] -> []
| (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)
"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*) []
(* ---------------------------------------------------------------- *)
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
(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
)
List.map
(function (mv, r) ->
match r with
- Ast.ScriptRule _ -> []
+ Ast.ScriptRule _
+ | Ast.InitialScriptRule _ | Ast.FinalScriptRule _ -> []
| Ast.CocciRule (_,_,rule,_,_) ->
let positions =
List.fold_left
(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),
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)
| _ -> [] 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
(* --------------------------------------------------------------------- *)
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
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 *)
| 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
(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 =
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
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
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)
(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
(* --------------------------------------------------------------------- *)
(* --------------------------------------------------------------------- *)
| 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 *)
(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 =
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
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"
(* 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) ->
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)
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"
| _ -> 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
(* --------------------------------------------------------------------- *)
(* --------------------------------------------------------------------- *)
module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
module Ast0 = Ast0_cocci
module Ast = Ast_cocci
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
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
module Ast = Ast_cocci
module Ast0 = Ast0_cocci
module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
let current_rule = ref ""
{(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
| (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(_)) ->
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
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
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"
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 ->
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
(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 ->
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 ->
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"
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"
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
| 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 =
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
(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
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}
(* --------------------------------------------------------------------- *)
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"
| 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
[] -> []
| 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
[] -> []
| 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
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"
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"
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"
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"
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"
(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
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) ->
(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
(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 =
(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 =
(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
(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
(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 =
| _ -> 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 *)
(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)
(* --------------------------------------------------------------------- *)
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
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)
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
| "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
(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
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")
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
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)
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
| 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)
| 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)
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)))
| 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;
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
| _ -> 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
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
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)),
(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
| 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
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
Obj.repr ()
| TExtends ->
Obj.repr ()
+ | TFinalize ->
+ Obj.repr ()
| TFloat _v ->
Obj.repr _v
| TFor _v ->
Obj.repr _v
| TInitialiser ->
Obj.repr ()
+ | TInitialize ->
+ Obj.repr ()
| TInt _v ->
Obj.repr _v
| TInvalid ->
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 =
[|
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;
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 =
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
# 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;
# 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;
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
# 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;
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
# 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;
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;
# 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;
# 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;
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
# 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;
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
# 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;
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;
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
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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 ->
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;
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;
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;
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;
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 []
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;
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;
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
# 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;
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
# 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;
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;
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
# 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;
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
# 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;
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
# 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;
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
# 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;
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
# 39 "standard.mly"
( None )
-# 7593 "parser_cocci_menhir.ml"
+# 7627 "parser_cocci_menhir.ml"
in
let s =
# 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;
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
# 41 "standard.mly"
( Some x )
-# 7666 "parser_cocci_menhir.ml"
+# 7700 "parser_cocci_menhir.ml"
in
let s =
# 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;
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
# 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;
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
# 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;
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
# 39 "standard.mly"
( None )
-# 7903 "parser_cocci_menhir.ml"
+# 7937 "parser_cocci_menhir.ml"
in
let s =
# 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;
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
# 41 "standard.mly"
( Some x )
-# 7991 "parser_cocci_menhir.ml"
+# 8025 "parser_cocci_menhir.ml"
in
let s =
# 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;
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
# 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
(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;
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
# 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
(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;
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;
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
# 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
(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;
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
# 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
(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;
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;
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;
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;
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;
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;
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;
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;
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
"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;
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 =
(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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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 =
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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
# 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,
(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;
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
# 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,
(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;
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
# 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
(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;
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
# 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
(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;
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;
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;
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;
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
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;
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
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;
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;
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
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;
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
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;
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;
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
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;
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
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;
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;
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;
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;
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
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;
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
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;
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;
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
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;
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
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;
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;
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;
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;
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
# 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;
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
# 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;
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;
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;
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;
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
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;
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
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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) =
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;
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) =
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;
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;
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] ->
| _ -> 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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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
| _ ->
| 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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
# 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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
# 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 ->
| 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;
# 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 ->
| 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;
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
| 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;
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;
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;
# 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;
# 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;
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;
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
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;
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 =
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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
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;
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;
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;
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
(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;
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
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;
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
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;
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;
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 =
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;
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;
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 =
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;
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;
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
# 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;
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
# 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;
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;
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
# 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;
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
# 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;
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
# 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;
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
# 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;
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
# 39 "standard.mly"
( None )
-# 19810 "parser_cocci_menhir.ml"
+# 19832 "parser_cocci_menhir.ml"
in
let s =
# 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;
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
# 41 "standard.mly"
( Some x )
-# 19880 "parser_cocci_menhir.ml"
+# 19902 "parser_cocci_menhir.ml"
in
let s =
# 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;
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
# 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;
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
# 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;
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
# 39 "standard.mly"
( None )
-# 20114 "parser_cocci_menhir.ml"
+# 20136 "parser_cocci_menhir.ml"
in
let s =
# 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;
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
# 41 "standard.mly"
( Some x )
-# 20202 "parser_cocci_menhir.ml"
+# 20224 "parser_cocci_menhir.ml"
in
let s =
# 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;
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
# 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
(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;
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
# 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
(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;
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;
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
# 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
(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;
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
# 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
(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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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
(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;
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
# 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;
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
# 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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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
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;
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
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;
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
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;
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
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;
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
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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 =
(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 =
(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 =
(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"
))
| TIso
| TInvalid
| TInt of (string * Data.clt)
+ | TInitialize
| TInitialiser
| TIncludeNL of (string * Data.clt)
| TIncludeL of (string * Data.clt)
| TForall
| TFor of (Data.clt)
| TFloat of (string * Data.clt)
+ | TFinalize
| TExtends
| TExpression
| TExists
%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
{ 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 */ { () }
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
!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) }
| 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) }
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;
module Ast0 = Ast0_cocci
module Ast = Ast_cocci
module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
(* find assignments that can match an initialization *)
| _ -> 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
module Ast0 = Ast0_cocci
module Ast = Ast_cocci
module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
(* --------------------------------------------------------------------- *)
(* --------------------------------------------------------------------- *)
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"
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
*)
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) ->
module Ast = Ast_cocci
module Ast0 = Ast0_cocci
module V0 = Visitor_ast0
+module VT0 = Visitor_ast0_types
(* call set_test_pos on test expressions *)
| _ -> 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
| _ -> 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
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
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) ->
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)
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)]
| 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,_,_) ->
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 =
| 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,_,_,_,_) ->
| 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
()
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
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 =
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 =
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
| _ -> 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
(* ----------------------------------------------------------------------- *)
[] -> ([],[])
| (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) ->
*)
+module Ast0 = Ast0_cocci
module Ast = Ast_cocci
(* --------------------------------------------------------------------- *)
-(*
-* 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
-
-(* --------------------------------------------------------------------- *)
-
-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
--- /dev/null
+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}
+++ /dev/null
-# 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
+++ /dev/null
-(*
-* 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
+++ /dev/null
-(*
-* 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"
+++ /dev/null
-val top : Ast_cocci.top_level -> Ast_popl.sequence
+++ /dev/null
-(*
-* 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
+++ /dev/null
-val insert_befaft : Ast_popl.sequence -> Ast_popl.sequence
+++ /dev/null
-(*
-* 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
+++ /dev/null
-val insert_quantifiers : Ast_popl.sequence -> Ast_popl.sequence
+++ /dev/null
-(*
-* 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)
- | _ -> []
+++ /dev/null
-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
+++ /dev/null
-(*
-* 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
+++ /dev/null
-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
+++ /dev/null
-(*
-* 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()
-
+++ /dev/null
-val pretty_print : Ast_popl.sequence -> unit
-val pretty_print_e : Ast_popl.element -> unit
+++ /dev/null
-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
+++ /dev/null
-# 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
+++ /dev/null
-(*
-* 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*)
-
+++ /dev/null
-(*
-* 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"
+++ /dev/null
-val top : Ast_cocci.top_level -> Ast_popl.sequence
+++ /dev/null
-(*
-* 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
+++ /dev/null
-(*
-* 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
+++ /dev/null
-val insert_quantifiers : Ast_popl.sequence -> Ast_popl.sequence
+++ /dev/null
-(*
-* 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)
- | _ -> []
+++ /dev/null
-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
+++ /dev/null
-(*
-* 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
+++ /dev/null
-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
+++ /dev/null
-(*
-* 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()
-
+++ /dev/null
-val pretty_print : Ast_popl.sequence -> unit
-val pretty_print_e : Ast_popl.element -> unit
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)
-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 \
##############################################################################
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
##############################################################################
rm -f $(LIB)
-$(OPTLIB): $(OPTOBJS)
+$(OPTLIB): $(OPTOBJS)
$(OCAMLOPT) -a -o $(OPTLIB) $(OPTOBJS)
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
# 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
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
+++ /dev/null
-output_base.py
\ No newline at end of file
-import pygtk
-import gtk, gobject
-import coccilib.coccigui
-import coccilib.coccigui.coccigui
from threading import Thread, Lock
import time
from copy import deepcopy
--- /dev/null
+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()
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"
+++ /dev/null
-no_pycocci.ml
\ No newline at end of file
+++ /dev/null
-no_pycocci_aux.ml
\ No newline at end of file
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 ()
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 ())
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
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
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"
* 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
-// 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
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) ->
(* ------------------------------------------------------------------------ *)
let testall () =
- let newscore = empty_score () in
+ let score = empty_score () in
let expected_result_files =
Common.glob "tests/*.res"
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
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
* 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
" 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)
);
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
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
(* ------------------------------------------------------------------------ *)
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
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])
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
--- /dev/null
+((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
-@@ expression E; @@
+@disable unlikely@ expression E; @@
- if (unlikely(E)) { BUG(); }
+ BUG_ON(E);
static void b44_tx(struct b44 *bp)
{
- BUG(skb == NULL);
+ BUG_ON(skb == NULL);
}
--- /dev/null
+
+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;
+}
--- /dev/null
+@s@
+expression E;
+position p;
+@@
+
+- E@p < 0
++ 12
--- /dev/null
+
+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;
+}
--- /dev/null
+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;
+}
--- /dev/null
+@@
+type T;
+identifier x,y;
+@@
+
+- unsigned T x;
+- T y;
+ ... when any
int main() {
+ return 0;
}
--- /dev/null
+// -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
+}
--- /dev/null
+// 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)
--- /dev/null
+// -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);
+ }
--- /dev/null
+#define FOO_METH_TEST(a) prefix_##a
+void FOO_METH_TEST(foo)(int x){
+ alloca(x);
+}
--- /dev/null
+@@ expression E; @@
+
+-alloca(E)
++malloc(E)
+
--- /dev/null
+#define FOO_METH_TEST(a) prefix_##a
+void FOO_METH_TEST(foo)(int x){
+ malloc(x);
+}
.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)
depend:: beforedepend
ocamldep $(INCLUDE) *.mli *.ml > .depend
+distclean::
+ rm -f .depend
+
-include .depend