diff options
Diffstat (limited to 'Build/source')
37 files changed, 12012 insertions, 1684 deletions
diff --git a/Build/source/texk/web2c/Makefile.in b/Build/source/texk/web2c/Makefile.in index c1998269c7f..a6e283909e2 100644 --- a/Build/source/texk/web2c/Makefile.in +++ b/Build/source/texk/web2c/Makefile.in @@ -627,7 +627,8 @@ pooltype_OBJECTS = $(nodist_pooltype_OBJECTS) pooltype_LDADD = $(LDADD) pooltype_DEPENDENCIES = $(proglib) $(am__DEPENDENCIES_1) am_synctex_OBJECTS = synctex-synctex_main.$(OBJEXT) \ - synctex-synctex_parser.$(OBJEXT) + synctex-synctex_parser.$(OBJEXT) \ + synctex-synctex_parser_utils.$(OBJEXT) synctex_OBJECTS = $(am_synctex_OBJECTS) nodist_tangle_OBJECTS = tangle.$(OBJEXT) tangle_OBJECTS = $(nodist_tangle_OBJECTS) @@ -1964,6 +1965,8 @@ synctex_SOURCES = \ synctexdir/synctex_main.c \ synctexdir/synctex_parser.c \ synctexdir/synctex_parser.h \ + synctexdir/synctex_parser_utils.c \ + synctexdir/synctex_parser_utils.h \ synctexdir/synctex_parser_local.h synctex_CPPFLAGS = -I$(srcdir)/synctexdir $(ZLIB_INCLUDES) -DSYNCTEX_USE_LOCAL_HEADER @@ -2680,6 +2683,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pooltype.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synctex-synctex_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synctex-synctex_parser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synctex-synctex_parser_utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tangle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tangleboot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tex-synctex.Po@am__quote@ @@ -6604,6 +6608,20 @@ synctex-synctex_parser.obj: synctexdir/synctex_parser.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(synctex_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o synctex-synctex_parser.obj `if test -f 'synctexdir/synctex_parser.c'; then $(CYGPATH_W) 'synctexdir/synctex_parser.c'; else $(CYGPATH_W) '$(srcdir)/synctexdir/synctex_parser.c'; fi` +synctex-synctex_parser_utils.o: synctexdir/synctex_parser_utils.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(synctex_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT synctex-synctex_parser_utils.o -MD -MP -MF $(DEPDIR)/synctex-synctex_parser_utils.Tpo -c -o synctex-synctex_parser_utils.o `test -f 'synctexdir/synctex_parser_utils.c' || echo '$(srcdir)/'`synctexdir/synctex_parser_utils.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/synctex-synctex_parser_utils.Tpo $(DEPDIR)/synctex-synctex_parser_utils.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='synctexdir/synctex_parser_utils.c' object='synctex-synctex_parser_utils.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(synctex_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o synctex-synctex_parser_utils.o `test -f 'synctexdir/synctex_parser_utils.c' || echo '$(srcdir)/'`synctexdir/synctex_parser_utils.c + +synctex-synctex_parser_utils.obj: synctexdir/synctex_parser_utils.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(synctex_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT synctex-synctex_parser_utils.obj -MD -MP -MF $(DEPDIR)/synctex-synctex_parser_utils.Tpo -c -o synctex-synctex_parser_utils.obj `if test -f 'synctexdir/synctex_parser_utils.c'; then $(CYGPATH_W) 'synctexdir/synctex_parser_utils.c'; else $(CYGPATH_W) '$(srcdir)/synctexdir/synctex_parser_utils.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/synctex-synctex_parser_utils.Tpo $(DEPDIR)/synctex-synctex_parser_utils.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='synctexdir/synctex_parser_utils.c' object='synctex-synctex_parser_utils.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(synctex_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o synctex-synctex_parser_utils.obj `if test -f 'synctexdir/synctex_parser_utils.c'; then $(CYGPATH_W) 'synctexdir/synctex_parser_utils.c'; else $(CYGPATH_W) '$(srcdir)/synctexdir/synctex_parser_utils.c'; fi` + tex-texini.o: texini.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(tex_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tex-texini.o -MD -MP -MF $(DEPDIR)/tex-texini.Tpo -c -o tex-texini.o `test -f 'texini.c' || echo '$(srcdir)/'`texini.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tex-texini.Tpo $(DEPDIR)/tex-texini.Po diff --git a/Build/source/texk/web2c/synctexdir/am/synctex.am b/Build/source/texk/web2c/synctexdir/am/synctex.am index 4b0bad7f993..f84750b6cc1 100644 --- a/Build/source/texk/web2c/synctexdir/am/synctex.am +++ b/Build/source/texk/web2c/synctexdir/am/synctex.am @@ -11,6 +11,8 @@ synctex_SOURCES = \ synctexdir/synctex_main.c \ synctexdir/synctex_parser.c \ synctexdir/synctex_parser.h \ + synctexdir/synctex_parser_utils.h \ + synctexdir/synctex_parser_utils.c \ synctexdir/synctex_parser_local.h synctex_CPPFLAGS = -I$(srcdir)/synctexdir $(ZLIB_INCLUDES) -DSYNCTEX_USE_LOCAL_HEADER diff --git a/Build/source/texk/web2c/synctexdir/synctex-common.h b/Build/source/texk/web2c/synctexdir/synctex-common.h index 22a98d7335e..41057363d4c 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-common.h +++ b/Build/source/texk/web2c/synctexdir/synctex-common.h @@ -34,7 +34,7 @@ If you include or use a significant part of the synctex package into a software, I would appreciate to be listed as contributor and see "SyncTeX" highlighted. Version 1 -Thu Jun 19 09:39:21 UTC 2008 +Latest Revision: Wed Jul 1 08:07:50 UTC 2009 */ diff --git a/Build/source/texk/web2c/synctexdir/synctex-e-mem.ch0 b/Build/source/texk/web2c/synctexdir/synctex-e-mem.ch0 index 6fa195a019a..7644e0c6987 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-e-mem.ch0 +++ b/Build/source/texk/web2c/synctexdir/synctex-e-mem.ch0 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:16 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-e-mem.ch1 b/Build/source/texk/web2c/synctexdir/synctex-e-mem.ch1 index 7e6ee124998..159f74d4ab5 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-e-mem.ch1 +++ b/Build/source/texk/web2c/synctexdir/synctex-e-mem.ch1 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:23 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-e-rec.ch0 b/Build/source/texk/web2c/synctexdir/synctex-e-rec.ch0 index 8a240879650..9229ac910ab 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-e-rec.ch0 +++ b/Build/source/texk/web2c/synctexdir/synctex-e-rec.ch0 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:29 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -105,7 +107,7 @@ link(prev_p):=p; @y glue_node: begin r:=get_node(medium_node_size); add_glue_ref(glue_ptr(p)); {{\sl Sync\TeX}: proper size for glue} - @<Copy the glue {\sl Sync\TeX} information@>; + @<Copy the medium sized node {\sl Sync\TeX} information@>; glue_ptr(r):=glue_ptr(p); leader_ptr(r):=null; end; @z diff --git a/Build/source/texk/web2c/synctexdir/synctex-e-rec.ch1 b/Build/source/texk/web2c/synctexdir/synctex-e-rec.ch1 index a52fdefb76c..f975d4f490e 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-e-rec.ch1 +++ b/Build/source/texk/web2c/synctexdir/synctex-e-rec.ch1 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:34 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-etex.h b/Build/source/texk/web2c/synctexdir/synctex-etex.h index 3bdce72bd74..7b720ad49bb 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-etex.h +++ b/Build/source/texk/web2c/synctexdir/synctex-etex.h @@ -1,8 +1,10 @@ /* -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:16:46 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-mem.ch0 b/Build/source/texk/web2c/synctexdir/synctex-mem.ch0 index 0f433728777..bdb585bee7a 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-mem.ch0 +++ b/Build/source/texk/web2c/synctexdir/synctex-mem.ch0 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:37 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -40,12 +42,12 @@ Nota Bene: If you include or use a significant part of the synctex package into a software, I would appreciate to be listed as contributor and see "SyncTeX" highlighted. -Version 1 -Thu Jun 19 09:39:21 UTC 2008 - Notice: ------- +- Fixing the bug pointed out by Hahn The Thanh during the discussion started by Reinhard Kotucha at + http://www.ntg.nl/pipermail/ntg-pdftex/2009-May/003786.html. + The |synctex_field_size| depends on the TeX implementation. pdfTeX uses 2 additional words whereas XeTeX will only use one, because it naturally has bigger words of memory. @@ -70,7 +72,7 @@ because it naturally has bigger words of memory. @y @d small_node_size=2 {number of words to allocate for most node types} @d medium_node_size=small_node_size+synctex_field_size {number of words to - allocate for synchronized node types like math, kern and glue nodes} + allocate for synchronized node types like math, kern, glue and penalty nodes} @z @x tex.web l.3090 @@ -122,6 +124,18 @@ begin p:=get_node(small_node_size); type(p):=kern_node; begin p:=get_node(medium_node_size); type(p):=kern_node; @z +@x tex.web l.3259 +@p function new_penalty(@!m:integer):pointer; +@y +@p function new_penalty(@!m:integer):pointer; +@z + +@x +begin p:=get_node(small_node_size); type(p):=penalty_node; +@y +begin p:=get_node(medium_node_size); type(p):=penalty_node; +@z + @x @p procedure flush_node_list(@!p:pointer); {erase list of nodes starting at |p|} @y @@ -140,39 +154,35 @@ begin p:=get_node(medium_node_size); type(p):=kern_node; end; @z -@x +@x tex.web l.3937: free nodes with proper size kern_node,math_node,penalty_node: do_nothing; @y - kern_node,math_node:begin + kern_node,math_node,penalty_node:begin free_node(p, medium_node_size); goto done; end; - penalty_node: do_nothing; @z -@x tex.web l.4018: +@x tex.web l.4002: @ @<Case statement to copy...@>= @y @ @<Case statement to copy...@>= @z -@x +@x tex.web l.4018: glue_node: begin r:=get_node(small_node_size); add_glue_ref(glue_ptr(p)); @y glue_node: begin r:=get_node(medium_node_size); add_glue_ref(glue_ptr(p)); @z -@x +@x tex.web l.4021: kern_node,math_node,penalty_node: begin r:=get_node(small_node_size); words:=small_node_size; end; @y -kern_node,math_node: begin r:=get_node(medium_node_size); +kern_node,math_node,penalty_node: begin r:=get_node(medium_node_size); words:=medium_node_size; end; -penalty_node: begin r:=get_node(small_node_size); - words:=small_node_size; - end; @z @x tex.web l.4912 @@ -211,13 +221,13 @@ penalty_node: begin r:=get_node(small_node_size); @d synctex_tag==cur_input.synctex_tag_field {{\sl Sync\TeX} tag of the current file} @z -@x +@x tex.web l. 14185 @<Simplify a trivial box@>= @y @<Simplify a trivial box@>= @z -@x tex.web l. 14189 +@x tex.web l. 14191 begin free_node(r,small_node_size); link(q):=null; @y begin free_node(r,medium_node_size); link(q):=null; diff --git a/Build/source/texk/web2c/synctexdir/synctex-mem.ch1 b/Build/source/texk/web2c/synctexdir/synctex-mem.ch1 index 23aabcc16a0..cabaa1084ff 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-mem.ch1 +++ b/Build/source/texk/web2c/synctexdir/synctex-mem.ch1 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:16:57 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-mem.ch2 b/Build/source/texk/web2c/synctexdir/synctex-mem.ch2 index c6a6fa9e3ff..d6e227bc618 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-mem.ch2 +++ b/Build/source/texk/web2c/synctexdir/synctex-mem.ch2 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:41 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-pdf-rec.ch2 b/Build/source/texk/web2c/synctexdir/synctex-pdf-rec.ch2 index ca11466a538..34ba6a79bc8 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-pdf-rec.ch2 +++ b/Build/source/texk/web2c/synctexdir/synctex-pdf-rec.ch2 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:45 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -41,7 +43,12 @@ If you include or use a significant part of the synctex package into a software, I would appreciate to be listed as contributor and see "SyncTeX" highlighted. Version 1 -Thu Jun 19 09:39:21 UTC 2008 +Latest Revision: Wed Jul 1 08:11:50 UTC 2009 + +History: +-------- + +- if the pdf file is removed, the synctex file is removed too. @x margin_kern_node, @@ -194,6 +201,19 @@ end; @z @x +procedure close_files_and_terminate; +@y +procedure close_files_and_terminate; +@z + +@x + remove_pdffile; +@y + remove_pdffile; + synctex_abort(log_opened); +@z + +@x synctex_sheet(mag); @y pdf_output_value:=pdf_output; {{\sl Sync\TeX}: we assume that |pdf_output| is properly set up} diff --git a/Build/source/texk/web2c/synctexdir/synctex-pdftex.h b/Build/source/texk/web2c/synctexdir/synctex-pdftex.h index 4ff5864493c..54ad7e79db8 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-pdftex.h +++ b/Build/source/texk/web2c/synctexdir/synctex-pdftex.h @@ -1,8 +1,10 @@ /* -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:16:42 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-rec.ch0 b/Build/source/texk/web2c/synctexdir/synctex-rec.ch0 index 02cb0fba4db..ce74ce86d0d 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-rec.ch0 +++ b/Build/source/texk/web2c/synctexdir/synctex-rec.ch0 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:04 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -83,7 +85,7 @@ rule_node: begin r:=get_node(rule_node_size); words:=rule_node_size-synctex_fiel glue_node: begin r:=get_node(medium_node_size); add_glue_ref(glue_ptr(p)); @y glue_node: begin r:=get_node(medium_node_size); add_glue_ref(glue_ptr(p)); - @<Copy the glue {\sl Sync\TeX} information@>; + @<Copy the medium sized node {\sl Sync\TeX} information@>; @z @x @@ -405,8 +407,8 @@ MISSING IMPLEMENTATION: copy the synctex information for box node at mem[r] from @ @<Copy the rule {\sl Sync\TeX} information@>= MISSING IMPLEMENTATION: copy the synctex information for rule node at mem[r] from node at mem[p] -@ @<Copy the glue {\sl Sync\TeX} information@>= -MISSING IMPLEMENTATION: copy the synctex information for glue node at mem[r] from node at mem[p] +@ @<Copy the medium sized node {\sl Sync\TeX} information@>= +MISSING IMPLEMENTATION: copy the synctex information for medium sized node at mem[r] from node at mem[p] @ {\sl Nota Bene:} The {\sl Sync\TeX} code is very close to the memory model. @@ -421,4 +423,4 @@ Then all the remaining code should be just harmless. The resulting program would behave exactly the same as if absolutely no {\sl Sync\TeX} related code was there, including memory management. Of course, all this assumes that {\sl Sync\TeX} is turned off from the command line. -@z
\ No newline at end of file +@z diff --git a/Build/source/texk/web2c/synctexdir/synctex-rec.ch1 b/Build/source/texk/web2c/synctexdir/synctex-rec.ch1 index 57bc298302f..929e32d9ff4 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-rec.ch1 +++ b/Build/source/texk/web2c/synctexdir/synctex-rec.ch1 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:50 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -97,7 +99,7 @@ mem[r+box_node_size-synctex_field_size].int:=mem[p+box_node_size-synctex_field_s mem[r+box_node_size-synctex_field_size+1].int:=mem[p+box_node_size-synctex_field_size+1].int; @z -@x It is a do_nothing replacement. To be enhanced later. +@x MISSING IMPLEMENTATION: copy the synctex information for rule node at mem[r] from node at mem[p] @y {mem[r+rule_node_size-synctex_field_size].int:=mem[p+rule_node_size-synctex_field_size].int; @@ -105,7 +107,7 @@ mem[r+rule_node_size-synctex_field_size+1].int:=mem[p+rule_node_size-synctex_fie @z @x -MISSING IMPLEMENTATION: copy the synctex information for glue node at mem[r] from node at mem[p] +MISSING IMPLEMENTATION: copy the synctex information for medium sized node at mem[r] from node at mem[p] @y mem[r+medium_node_size-synctex_field_size].int:=mem[p+medium_node_size-synctex_field_size].int; mem[r+medium_node_size-synctex_field_size+1].int:=mem[p+medium_node_size-synctex_field_size+1].int; diff --git a/Build/source/texk/web2c/synctexdir/synctex-rec.ch2 b/Build/source/texk/web2c/synctexdir/synctex-rec.ch2 index 72af34b54a6..5ba9854c8bc 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-rec.ch2 +++ b/Build/source/texk/web2c/synctexdir/synctex-rec.ch2 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:54 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-tex.h b/Build/source/texk/web2c/synctexdir/synctex-tex.h index 64392b3035a..94ceccf931d 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-tex.h +++ b/Build/source/texk/web2c/synctexdir/synctex-tex.h @@ -1,8 +1,10 @@ /* -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:16:36 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-xe-mem.ch2 b/Build/source/texk/web2c/synctexdir/synctex-xe-mem.ch2 index 4b8b5f5c18f..4bd858c9edc 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-xe-mem.ch2 +++ b/Build/source/texk/web2c/synctexdir/synctex-xe-mem.ch2 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:08 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-xe-rec.ch2 b/Build/source/texk/web2c/synctexdir/synctex-xe-rec.ch2 index 1f68c1ea0a6..a8b5830312d 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-xe-rec.ch2 +++ b/Build/source/texk/web2c/synctexdir/synctex-xe-rec.ch2 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:13 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -83,7 +85,7 @@ mem[r+rule_node_size-synctex_field_size].hh.rh:=mem[p+rule_node_size-synctex_fie @z @x -MISSING IMPLEMENTATION: copy the synctex information for glue node at mem[r] from node at mem[p] +MISSING IMPLEMENTATION: copy the synctex information for medium sized node at mem[r] from node at mem[p] @y mem[r+medium_node_size-synctex_field_size].hh.lh:=mem[p+medium_node_size-synctex_field_size].hh.lh; mem[r+medium_node_size-synctex_field_size].hh.rh:=mem[p+medium_node_size-synctex_field_size].hh.rh; diff --git a/Build/source/texk/web2c/synctexdir/synctex-xe-rec.ch3 b/Build/source/texk/web2c/synctexdir/synctex-xe-rec.ch3 index 9bd9f0ab090..a83faa07648 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-xe-rec.ch3 +++ b/Build/source/texk/web2c/synctexdir/synctex-xe-rec.ch3 @@ -1,7 +1,9 @@ -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:17:59 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex-xetex.h b/Build/source/texk/web2c/synctexdir/synctex-xetex.h index 1dc8a99dd2b..dc6ed17ed9b 100644 --- a/Build/source/texk/web2c/synctexdir/synctex-xetex.h +++ b/Build/source/texk/web2c/synctexdir/synctex-xetex.h @@ -1,8 +1,10 @@ /* -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:16:29 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person diff --git a/Build/source/texk/web2c/synctexdir/synctex.c b/Build/source/texk/web2c/synctexdir/synctex.c index 84f9dd93aeb..d8731911231 100644 --- a/Build/source/texk/web2c/synctexdir/synctex.c +++ b/Build/source/texk/web2c/synctexdir/synctex.c @@ -1,8 +1,10 @@ /* -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:18:09 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -65,7 +67,7 @@ Versioning: ----------- As synctex is embedded into different TeX implementation, there is an independent versionning system. -For TeX implementations, the actual version is: 1 +For TeX implementations, the actual version is: 2 For .synctex file format, the actual version is SYNCTEX_VERSION below Please, do not remove these explanations. @@ -80,8 +82,31 @@ Nota Bene: If you include or use a significant part of the synctex package into a software, I would appreciate to be listed as contributor and see "SyncTeX" highlighted. +History: +-------- +Version 2 +Fri Sep 19 14:55:31 UTC 2008 +- support for file names containing spaces. + This is one thing that xetex and pdftex do not manage the same way. + When the input file name contains a space character ' ', + pdftex will automatically enclose this name between two quote characters '"', + making programs believe that these quotes are really part of the name. + xetex does nothing special. + For that reason, running the command line + xetex --synctex=-1 "my file.tex" + is producing the expected file named <my file.synctex>, (the '<' and '>' are not part of the name) + whereas running the command line + pdftex --synctex=-1 "my file.tex" + was producing the unexpected file named <"my file".synctex> where the two '"' chracters were part of the name. + Of course, that was breaking the typesetting mechanism when pdftex was involved. + To solve this problem, we prefer to rely on the output_file_name instead of the jobname. + In the case when no output_file_name is available, we use jobname and test if the file name + starts and ends with a quote character. Every synctex output file is removed because we consider + TeX encontered a problem. + There is some conditional coding. + Version 1 -Tue Jul 1 15:23:00 UTC 2008 +Latest Revision: Wed Jul 1 08:15:44 UTC 2009 */ @@ -145,7 +170,7 @@ EXTERN char *gettexstring(int n); * IMPORTANT: We can say that the natural unit of .synctex files is SYNCTEX_UNIT_FACTOR sp. * To retrieve the proper bp unit, we'll have to divide by 8.03. To reduce * rounding errors, we'll certainly have to add 0.5 for non negative integers - * and ±0.5 for negative integers. This trick is mainly to gain speed and + * and 0.5 for negative integers. This trick is mainly to gain speed and * size. A binary file would be more appropriate in that respect, but I guess * that some clients like auctex would not like it very much. we cannot use * "<<13" instead of "/SYNCTEX_UNIT_FACTOR" because the integers are signed and we do not @@ -260,10 +285,11 @@ static struct { unsigned int no_gz:1; /* Whether zlib is used or not */ unsigned int not_void:1; /* Whether it really contains synchronization material */ unsigned int warn:1; /* One shot warning flag */ - unsigned int reserved:SYNCTEX_BITS_PER_BYTE*sizeof(int)-5; /* Align */ + unsigned int quoted:1; /* Whether the input file name was quoted by tex or not, for example "\"my input file.tex\"", unused by XeTeX */ + unsigned int reserved:SYNCTEX_BITS_PER_BYTE*sizeof(int)-6; /* Align */ } flags; } synctex_ctxt = { -NULL, NULL, NULL, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, {0,0,0,0,0,0}}; +NULL, NULL, NULL, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, {0,0,0,0,0,0,0}}; #define SYNCTEX_FILE synctex_ctxt.file #define SYNCTEX_IS_OFF (synctex_ctxt.flags.off) @@ -301,9 +327,10 @@ void synctexinitcommand(void) return; } -/* Free all memory used and close the file, - * It is sent locally when there is a problem with synctex output. */ -void synctex_abort(void) +/* Free all memory used, close and remove the file if any, + * It is sent locally when there is a problem with synctex output. + * It is sent by pdftex when a fatal error occurred in pdftex.web. */ +void synctexabort(boolean log_opened) { SYNCTEX_RETURN_IF_DISABLED; #if SYNCTEX_DEBUG @@ -315,11 +342,15 @@ void synctex_abort(void) } else { gzclose((gzFile)SYNCTEX_FILE); } + SYNCTEX_FILE = NULL; + remove(synctex_ctxt.busy_name); SYNCTEX_FREE(synctex_ctxt.busy_name); synctex_ctxt.busy_name = NULL; } - SYNCTEX_FREE(synctex_ctxt.root_name); - synctex_ctxt.root_name = NULL; + if(NULL != synctex_ctxt.root_name) { + SYNCTEX_FREE(synctex_ctxt.root_name); + synctex_ctxt.root_name = NULL; + } SYNCTEX_IS_OFF = SYNCTEX_YES; /* disable synctex */ } @@ -360,15 +391,36 @@ static void *synctex_dot_open(void) either SYNCTEX_FILE is nonnegative or synchronization is definitely disabled. */ { + size_t len; char *tmp = gettexstring(jobname); /* jobname was set by the \jobname command on the *TeX side */ char * the_busy_name = xmalloc(strlen(tmp) + strlen(synctex_suffix) + strlen(synctex_suffix_gz) + strlen(synctex_suffix_busy) + 1); if(!the_busy_name) { SYNCTEX_FREE(tmp); - synctex_abort(); + synctexabort(0); return NULL; } +# if defined(XeTeX) + synctex_ctxt.flags.quoted = 0; strcpy(the_busy_name, tmp); +# else + len = strlen(tmp); + if(len>0 && tmp[0]=='"' && tmp[len-1]=='"') { + /* We are certainly on a pdftex like engine and the input file name did contain spaces inside. + Quotes where added around that file name. We prefer to remove the quotes to have a human readable name. + As of Fri Sep 19 14:00:01 UTC 2008, the file names containing quotes are not supported by pdfTeX + nor SyncTeX. */ + synctex_ctxt.flags.quoted = 1;/* we will have to add quotes around the file name in the log file. */ + strcpy(the_busy_name, tmp+1);/* only copy what follows the leading " character */ + len = strlen(the_busy_name); + if((len>0) && (the_busy_name[len-1]=='"')) { + the_busy_name[len-1]='\0'; + } + } else { + synctex_ctxt.flags.quoted = 0; + strcpy(the_busy_name, tmp); + } +# endif SYNCTEX_FREE(tmp); tmp = NULL; strcat(the_busy_name, synctex_suffix); @@ -390,7 +442,7 @@ static void *synctex_dot_open(void) #endif if (SYNCTEX_FILE) { if(SYNCTEX_NO_ERROR != synctex_record_preamble()) { - synctex_abort(); + synctexabort(0); return NULL; } /* Initialization of the context */ @@ -529,63 +581,121 @@ void synctexterminate(boolean log_opened) #if SYNCTEX_DEBUG printf("\nSynchronize DEBUG: synctexterminate\n"); #endif - tmp = gettexstring(jobname); - the_real_syncname = xmalloc(strlen(tmp) + strlen(synctex_suffix) + strlen(synctex_suffix_gz) + 1); - if(!the_real_syncname) { + if(log_opened && (tmp = gettexstring(texmflogname))) { + /* In version 1, the jobname was used but it caused problems regarding spaces in file names. */ + the_real_syncname = xmalloc(strlen(tmp) + strlen(synctex_suffix) + strlen(synctex_suffix_gz) + 1); + if(!the_real_syncname) { + SYNCTEX_FREE(tmp); + synctexabort(0); + return; + } + strcpy(the_real_syncname, tmp); SYNCTEX_FREE(tmp); - synctex_abort(); - return; - } - strcpy(the_real_syncname, tmp); - strcat(the_real_syncname, synctex_suffix); - if (!SYNCTEX_NO_GZ) { - /* Remove any uncompressed synctex file, from a previous build. */ - remove(the_real_syncname); - strcat(the_real_syncname, synctex_suffix_gz); - } - /* allways remove the synctex output file before renaming it, windows requires it. */ - if(0 != remove(the_real_syncname) && errno == EACCES) { - fprintf(stderr,"SyncTeX: Can't remove %s (file is open or read only)\n",the_real_syncname); - } - if (SYNCTEX_FILE) { - if (SYNCTEX_NOT_VOID) { - synctex_record_postamble(); - /* close the synctex file*/ - if (SYNCTEX_NO_GZ) { - xfclose((FILE *)SYNCTEX_FILE, synctex_ctxt.busy_name); - } else { - gzclose((gzFile)SYNCTEX_FILE); + tmp = NULL; + /* now remove the last path extension which is in general log */ + tmp = the_real_syncname + strlen(the_real_syncname); + while(tmp>the_real_syncname) { + --tmp; + if(*tmp == '.') { + *tmp = '\0';/* end the string here */ + break; } - /* renaming the working synctex file */ - if(0 == rename(synctex_ctxt.busy_name,the_real_syncname)) { - if(log_opened) { - printf("\nSyncTeX written on %s",the_real_syncname); /* SyncTeX also refers to the contents */ + } + strcat(the_real_syncname, synctex_suffix); + if (!SYNCTEX_NO_GZ) { + /* Remove any uncompressed synctex file, from a previous build. */ + remove(the_real_syncname); + strcat(the_real_syncname, synctex_suffix_gz); + } + /* allways remove the synctex output file before renaming it, windows requires it. */ + if(0 != remove(the_real_syncname) && errno == EACCES) { + fprintf(stderr,"SyncTeX: Can't remove %s (file is open or read only)\n",the_real_syncname); + } + if (SYNCTEX_FILE) { + if (SYNCTEX_NOT_VOID) { + synctex_record_postamble(); + /* close the synctex file*/ + if (SYNCTEX_NO_GZ) { + xfclose((FILE *)SYNCTEX_FILE, synctex_ctxt.busy_name); + } else { + gzclose((gzFile)SYNCTEX_FILE); + } + SYNCTEX_FILE = NULL; + /* renaming the working synctex file */ + if(0 == rename(synctex_ctxt.busy_name,the_real_syncname)) { + if(log_opened) { + printf((synctex_ctxt.flags.quoted?"\nSyncTeX written on \"%s\"":"\nSyncTeX written on %s"), + the_real_syncname); /* SyncTeX also refers to the contents */ + } + } else { + fprintf(stderr,"SyncTeX: Can't rename %s to %s\n",synctex_ctxt.busy_name,the_real_syncname); + remove(synctex_ctxt.busy_name); } } else { - fprintf(stderr,"SyncTeX: Can't rename %s to %s\n",synctex_ctxt.busy_name,the_real_syncname); + /* close and remove the synctex file because there are no pages of output */ + if (SYNCTEX_NO_GZ) { + xfclose((FILE *)SYNCTEX_FILE, synctex_ctxt.busy_name); + } else { + gzclose((gzFile)SYNCTEX_FILE); + } + SYNCTEX_FILE = NULL; remove(synctex_ctxt.busy_name); } + } + if (SYNCTEX_NO_GZ) { + /* Remove any compressed synctex file, from a previous build. */ + strcat(the_real_syncname, synctex_suffix_gz); + remove(the_real_syncname); + } + } else if((tmp = gettexstring(jobname))) { + size_t len; + /* There was a problem with the output. + We just try to remove existing synctex output files + including the busy one. */ + the_real_syncname = xmalloc(strlen(tmp) + strlen(synctex_suffix) + strlen(synctex_suffix_gz) + 1); + if(!the_real_syncname) { + SYNCTEX_FREE(tmp); + synctexabort(0); + return; + } +# if defined(XeTeX) + strcpy(the_real_syncname, tmp); +# else + len = strlen(tmp); + if(len>0 && tmp[0]=='"' && tmp[len-1]=='"') { + /* See above a similar situation. */ + strcpy(the_real_syncname, tmp+1);/* only copy what follows the leading " character */ + len = strlen(the_real_syncname); + if((len>0) && (the_real_syncname[len-1]=='"')) { + the_real_syncname[len-1]='\0'; + } } else { - /* close and remove the synctex file because there are no pages of output */ + strcpy(the_real_syncname, tmp); + } +# endif + SYNCTEX_FREE(tmp); + tmp = NULL; + strcat(the_real_syncname, synctex_suffix); + remove(the_real_syncname); + strcat(the_real_syncname, synctex_suffix_gz); + remove(the_real_syncname); + if (SYNCTEX_FILE) { + /* close the synctex file*/ if (SYNCTEX_NO_GZ) { xfclose((FILE *)SYNCTEX_FILE, synctex_ctxt.busy_name); } else { gzclose((gzFile)SYNCTEX_FILE); } + SYNCTEX_FILE = NULL; + /* removing the working synctex file */ remove(synctex_ctxt.busy_name); } - SYNCTEX_FILE = NULL; - } - if (SYNCTEX_NO_GZ) { - /* Remove any compressed synctex file, from a previous build. */ - strcat(the_real_syncname, synctex_suffix_gz); - remove(the_real_syncname); } SYNCTEX_FREE(synctex_ctxt.busy_name); synctex_ctxt.busy_name = NULL; SYNCTEX_FREE(the_real_syncname); - SYNCTEX_FREE(tmp); - synctex_abort(); + the_real_syncname = NULL; + synctexabort(0); } static inline int synctex_record_content(void); @@ -621,7 +731,7 @@ void synctexsheet(integer mag) } if(SYNCTEX_NO_ERROR != synctex_record_settings() || SYNCTEX_NO_ERROR != synctex_record_content()) { - synctex_abort(); + synctexabort(0); return; } } @@ -1010,7 +1120,7 @@ void synctexcurrent(void) return; } } - synctex_abort(); + synctexabort(0); return; } @@ -1036,7 +1146,7 @@ static inline int synctex_record_settings(void) return SYNCTEX_NOERR; } } - synctex_abort(); + synctexabort(0); return -1; } @@ -1052,7 +1162,7 @@ static inline int synctex_record_preamble(void) synctex_ctxt.total_length = len; return SYNCTEX_NOERR; } - synctex_abort(); + synctexabort(0); return -1; } @@ -1068,7 +1178,7 @@ static inline int synctex_record_input(integer tag, char *name) synctex_ctxt.total_length += len; return SYNCTEX_NOERR; } - synctex_abort(); + synctexabort(0); return -1; } @@ -1085,7 +1195,7 @@ static inline int synctex_record_anchor(void) ++synctex_ctxt.count; return SYNCTEX_NOERR; } - synctex_abort(); + synctexabort(0); return -1; } @@ -1101,7 +1211,7 @@ static inline int synctex_record_content(void) synctex_ctxt.total_length += len; return SYNCTEX_NOERR; } - synctex_abort(); + synctexabort(0); return -1; } @@ -1119,7 +1229,7 @@ static inline int synctex_record_sheet(integer sheet) return SYNCTEX_NOERR; } } - synctex_abort(); + synctexabort(0); return -1; } @@ -1137,7 +1247,7 @@ static inline int synctex_record_teehs(integer sheet) return SYNCTEX_NOERR; } } - synctex_abort(); + synctexabort(0); return -1; } @@ -1160,7 +1270,7 @@ static inline void synctex_record_void_vlist(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1184,7 +1294,7 @@ static inline void synctex_record_vlist(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1200,7 +1310,7 @@ static inline void synctex_record_tsilv(halfword p) synctex_ctxt.total_length += len; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1223,7 +1333,7 @@ static inline void synctex_record_void_hlist(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1247,7 +1357,7 @@ static inline void synctex_record_hlist(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1264,7 +1374,7 @@ static inline void synctex_record_tsilh(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1279,7 +1389,7 @@ static inline int synctex_record_count(void) { synctex_ctxt.total_length += len; return SYNCTEX_NOERR; } - synctex_abort(); + synctexabort(0); return -1; } @@ -1303,7 +1413,7 @@ static inline int synctex_record_postamble(void) } } } - synctex_abort(); + synctexabort(0); return -1; } @@ -1323,7 +1433,7 @@ static inline void synctex_record_glue(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1344,7 +1454,7 @@ static inline void synctex_record_kern(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1367,7 +1477,7 @@ static inline void synctex_record_rule(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1391,7 +1501,7 @@ void synctex_math_recorder(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1412,7 +1522,7 @@ void synctex_kern_recorder(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1430,7 +1540,7 @@ void synctex_char_recorder(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } @@ -1449,7 +1559,7 @@ void synctex_node_recorder(halfword p) ++synctex_ctxt.count; return; } - synctex_abort(); + synctexabort(0); return; } diff --git a/Build/source/texk/web2c/synctexdir/synctex.defines b/Build/source/texk/web2c/synctexdir/synctex.defines index 13addde0368..89487670c68 100644 --- a/Build/source/texk/web2c/synctexdir/synctex.defines +++ b/Build/source/texk/web2c/synctexdir/synctex.defines @@ -1,8 +1,10 @@ { -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:18:05 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -42,7 +44,7 @@ If you include or use a significant part of the synctex package into a software, I would appreciate to be listed as contributor and see "SyncTeX" highlighted. Version 1 -Thu Jun 19 09:39:21 UTC 2008 +Latest Revision: Wed Jul 1 08:17:41 UTC 2009 Notice: ------- @@ -56,6 +58,7 @@ from web to c (See the convert shell script). @define procedure synctexinitcommand; @define procedure synctexstartinput; @define procedure synctexterminate(); +@define procedure synctexabort(); @define procedure synctexsheet(); @define procedure synctexteehs; @define procedure synctexvlist(); diff --git a/Build/source/texk/web2c/synctexdir/synctex.h b/Build/source/texk/web2c/synctexdir/synctex.h index de736f68aff..4e52b1b3a39 100644 --- a/Build/source/texk/web2c/synctexdir/synctex.h +++ b/Build/source/texk/web2c/synctexdir/synctex.h @@ -1,5 +1,7 @@ /* synctex.h +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr + This file is part of the SyncTeX package. Permission is hereby granted, free of charge, to any person @@ -34,7 +36,7 @@ If you include or use a significant part of the synctex package into a software, I would appreciate to be listed as contributor and see "SyncTeX" highlighted. Version 1 -Thu Jun 19 09:39:21 UTC 2008 +Latest Revision: Wed Jul 1 08:17:50 UTC 2009 */ diff --git a/Build/source/texk/web2c/synctexdir/synctex_main.c b/Build/source/texk/web2c/synctexdir/synctex_main.c index eb4d2758be9..dbdb4272fb6 100644 --- a/Build/source/texk/web2c/synctexdir/synctex_main.c +++ b/Build/source/texk/web2c/synctexdir/synctex_main.c @@ -1,8 +1,10 @@ /* -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:18:13 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -41,16 +43,21 @@ Nota Bene: If you include or use a significant part of the synctex package into a software, I would appreciate to be listed as contributor and see "SyncTeX" highlighted. -Version 1 +Version 1.1 Thu Jun 19 09:39:21 UTC 2008 +History: +-------- + +- the -d option for an input directory + Important notice: ----------------- This file is named "synctex_main.c". This is the command line interface to the synctex_parser.c. */ -# include "web2c/c-auto.h" /* for inline && HAVE_xxx */ +//# include "web2c/c-auto.h" /* for inline && HAVE_xxx */ # include <stdlib.h> # include <stdio.h> @@ -58,6 +65,7 @@ This is the command line interface to the synctex_parser.c. # include <stdarg.h> # include <math.h> # include "synctex_parser.h" +# include "synctex_parser_utils.h" /* The code below uses strlcat and strlcpy, which avoids security warnings with some compilers. However, if these are not available we simply use the old, unchecked versions; @@ -74,8 +82,6 @@ This is the command line interface to the synctex_parser.c. inline static double my_fmax(double x, double y) { return (x < y) ? y : x; } # endif -#define SYNCTEX_DEBUG 0 - #if SYNCTEX_DEBUG # include "unistd.h" #endif @@ -89,11 +95,12 @@ void synctex_help_edit(char * error,...); int synctex_view(int argc, char *argv[]); int synctex_edit(int argc, char *argv[]); int synctex_update(int argc, char *argv[]); +int synctex_test(int argc, char *argv[]); int main(int argc, char *argv[]) { int arg_index = 1; - printf("This is SyncTeX command line utility, version 1.0\n"); + printf("This is SyncTeX command line utility, version 1.2\n"); if(arg_index<argc) { if(0==strcmp("help",argv[arg_index])) { if(++arg_index<argc) { @@ -113,6 +120,8 @@ int main(int argc, char *argv[]) return synctex_edit(argc-arg_index-1,argv+arg_index+1); } else if(0==strcmp("update",argv[arg_index])) { return synctex_update(argc-arg_index-1,argv+arg_index+1); + } else if(0==strcmp("test",argv[arg_index])) { + return synctex_test(argc-arg_index-1,argv+arg_index+1); } } synctex_help("Missing options"); @@ -127,7 +136,7 @@ void synctex_usage(char * error,va_list ap) { } fprintf((error?stderr:stdout), "usage: synctex <subcommand> [options] [args]\n" - "Synchronize TeXnology command-line client, version 1.0\n\n" + "Synchronize TeXnology command-line client, version 1.1\n\n" "The Synchronization TeXnology by Jérôme Laurens is a new feature of recent TeX engines.\n" "It allows to synchronize between input and output, which means to\n" "navigate from the source document to the typeset material and vice versa.\n\n" @@ -147,6 +156,7 @@ void synctex_help(char * error,...) { " update to update a synctex file after a dvi/xdv to pdf filter\n" " help this help\n\n" "Type 'synctex help <subcommand>' for help on a specific subcommand.\n" + "There is also an undocumented test subcommand.\n" ); return; } @@ -159,7 +169,7 @@ void synctex_help_view(char * error,...) { fputs("synctex view: forwards or direct synchronization,\n" "command sent by the editor to view the output corresponding to the position under the mouse\n" "\n" - "usage: synctex view -i line:column:input -o output [-x viewer-command] [-h before/offset:middle/after]\n" + "usage: synctex view -i line:column:input -o output [-d directory] [-x viewer-command] [-h before/offset:middle/after]\n" "\n" "-i line:column:input\n" " specify the line, column and input file.\n" @@ -175,6 +185,13 @@ void synctex_help_view(char * error,...) { " is the full or relative path of the output file (with any relevant path extension).\n" " This file must exist.\n" " \n" + "-d directory\n" + " is the directory containing the synctex file, in case it is different from the directory of the output.\n" + " This directory must exist.\n" + " An example will explain how things work: for synctex -o ...:bar.tex -d foo,\n" + " the chosen synctex file is the most recent among bar.synctex, bar.synctex.gz, foo/bar.synctex and foo/bar.synctex.gz.\n" + " The other ones are simply removed, if the authorization is granted\n" + " \n" "-x viewer-command\n" " Normally the synctex tool outputs its result to the stdout.\n" " It is possible to launch an external tool with the result.\n" @@ -204,44 +221,51 @@ void synctex_help_view(char * error,...) { " The \"middle\" word contains the character under the mouse at position offset.\n" " \"before\" is a full word preceding middle and \"after\" is following it.\n" " The before or after word can be missing, they are then considered as void strings.\n" - " \n", + " \n" + "The result is a list of records. In general the first one is the most accurate but\n" + "it is the responsibility of the client to decide which one best fits the user needs.\n", (error?stderr:stdout) ); return; } -/* "usage: synctex view -i line:column:input -o output [-x viewer-command] [-h before/offset:middle/after]\n" */ +typedef struct { + int line; + int column; + unsigned int offset; + char * input; + char * output; + char * directory; + char * viewer; + char * before; + char * middle; + char * after; +} synctex_view_params_t; + +int synctex_view_proceed(synctex_view_params_t * paramsRef); + +/* "usage: synctex view -i line:column:input -o output [-d directory] [-x viewer-command] [-h before/offset:middle/after]\n" */ int synctex_view(int argc, char *argv[]) { int arg_index = 0; - int line = -1; - int column = 0; - char * input = NULL; - char * viewer = NULL; - char * before = NULL; - unsigned int offset = 0; - char * middle = NULL; - char * after = NULL; - char * output = NULL; char * start = NULL; char * end = NULL; - synctex_scanner_t scanner = NULL; - size_t size = 0; - + synctex_view_params_t Ps = {-1,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; + /* required */ if((arg_index>=argc) || strcmp("-i",argv[arg_index]) || (++arg_index>=argc)) { synctex_help_view("Missing -i required argument"); return -1; } start = argv[arg_index]; - line = strtol(start,&end,10); + Ps.line = strtol(start,&end,10); if(end>start && strlen(end)>0 && *end==':') { start = end+1; - column = strtol(start,&end,10); - if(end == start || column < 0) { - column = 0; + Ps.column = strtol(start,&end,10); + if(end == start || Ps.column < 0) { + Ps.column = 0; } if(strlen(end)>1 && *end==':') { - input = end+1; + Ps.input = end+1; goto scan_output; } } @@ -252,45 +276,59 @@ scan_output: synctex_help_view("Missing -o required argument"); return -1; } - output = argv[arg_index]; + Ps.output = argv[arg_index]; /* now scan the optional arguments */ if(++arg_index<argc) { + if(0 == strcmp("-d",argv[arg_index])) { + if(++arg_index<argc) { + Ps.directory = argv[arg_index]; + if(++arg_index<argc) { + goto option_command; + } else { + synctex_view_proceed(&Ps); + } + } else { + Ps.directory = getenv("SYNCTEX_BUILD_DIRECTORY"); + synctex_view_proceed(&Ps); + } + } +option_command: if(0 == strcmp("-x",argv[arg_index])) { if(++arg_index<argc) { if(strcmp("-",argv[arg_index])) { /* next option does not start with '-', this is a command */ - viewer = argv[arg_index]; + Ps.viewer = argv[arg_index]; if(++arg_index<argc) { goto option_hint; } else { - goto proceed; + synctex_view_proceed(&Ps); } } else { /* retrieve the environment variable */ - viewer = getenv("SYNCTEX_VIEWER"); + Ps.viewer = getenv("SYNCTEX_VIEWER"); goto option_hint; } } else { - viewer = getenv("SYNCTEX_VIEWER"); - goto proceed; + Ps.viewer = getenv("SYNCTEX_VIEWER"); + synctex_view_proceed(&Ps); } } option_hint: if(0 == strcmp("-h",argv[arg_index]) && ++arg_index<argc) { /* modify the argument */; - after = strstr(argv[arg_index],"/"); - if(NULL != after) { - before = argv[arg_index]; - *after = '\0'; - ++after; - offset = strtoul(after,&middle,10); - if(middle>after && strlen(middle)>2) { - after = strstr(++middle,"/"); - if(NULL != after) { - *after = '\0'; - if(offset<strlen(middle)) { - ++after; - goto proceed; + Ps.after = strstr(argv[arg_index],"/"); + if(NULL != Ps.after) { + Ps.before = argv[arg_index]; + *Ps.after = '\0'; + ++Ps.after; + Ps.offset = strtoul(Ps.after,&Ps.middle,10); + if(Ps.middle>Ps.after && strlen(Ps.middle)>2) { + Ps.after = strstr(++Ps.middle,"/"); + if(NULL != Ps.after) { + *Ps.after = '\0'; + if(Ps.offset<strlen(Ps.middle)) { + ++Ps.after; + synctex_view_proceed(&Ps); } } } @@ -299,32 +337,37 @@ option_hint: return -1; } } - /* Now proceed, ignore any other argument */ -proceed: + return synctex_view_proceed(&Ps); +} + +int synctex_view_proceed(synctex_view_params_t * Ps) { + synctex_scanner_t scanner = NULL; + size_t size = 0; #if SYNCTEX_DEBUG - printf("line:%i\n",line); - printf("column:%i\n",column); - printf("input:%s\n",input); - printf("viewer:%s\n",viewer); - printf("before:%s\n",before); - printf("offset:%i\n",offset); - printf("middle:%s\n",middle); - printf("after:%s\n",after); - printf("output:%s\n",output); + printf("line:%i\n",Ps->line); + printf("column:%i\n",Ps->column); + printf("input:%s\n",Ps->input); + printf("viewer:%s\n",Ps->viewer); + printf("before:%s\n",Ps->before); + printf("offset:%i\n",Ps->offset); + printf("middle:%s\n",Ps->middle); + printf("after:%s\n",Ps->after); + printf("output:%s\n",Ps->output); printf("cwd:%s\n",getcwd(NULL,0)); #endif /* We assume that viewer is not so big: */ # define SYNCTEX_STR_SIZE 65536 - if(viewer && strlen(viewer)>=SYNCTEX_STR_SIZE) { + if(Ps->viewer && strlen(Ps->viewer)>=SYNCTEX_STR_SIZE) { synctex_help_view("Viewer command is too long"); return -1; } - scanner = synctex_scanner_new_with_output_file(output); - if(scanner && synctex_display_query(scanner,input,line,column)) { + scanner = synctex_scanner_new_with_output_file(Ps->output,Ps->directory,1); + if(scanner && synctex_display_query(scanner,Ps->input,Ps->line,Ps->column)) { synctex_node_t node = NULL; if((node = synctex_next_result(scanner)) != NULL) { /* filtering the command */ - if(viewer && strlen(viewer)) { + if(Ps->viewer && strlen(Ps->viewer)) { + char * viewer = Ps->viewer; char * where = NULL; char * buffer = NULL; char * buffer_cur = NULL; @@ -385,10 +428,10 @@ proceed: TEST("&{v}", "%f",synctex_node_box_visible_v(node)+synctex_node_box_visible_depth(node)); TEST("&{width}", "%f",fabs(synctex_node_box_visible_width(node))); TEST("&{height}","%f",fmax(synctex_node_box_visible_height(node)+synctex_node_box_visible_depth(node),1)); - TEST("&{before}","%s",(before && strlen(before)<SYNCTEX_STR_SIZE?before:"")); - TEST("&{offset}","%i",offset); - TEST("&{middle}","%s",(middle && strlen(middle)<SYNCTEX_STR_SIZE?middle:"")); - TEST("&{after}", "%s",(after && strlen(after)<SYNCTEX_STR_SIZE?after:"")); + TEST("&{before}","%s",(Ps->before && strlen(Ps->before)<SYNCTEX_STR_SIZE?Ps->before:"")); + TEST("&{offset}","%i",Ps->offset); + TEST("&{middle}","%s",(Ps->middle && strlen(Ps->middle)<SYNCTEX_STR_SIZE?Ps->middle:"")); + TEST("&{after}", "%s",(Ps->after && strlen(Ps->after)<SYNCTEX_STR_SIZE?Ps->after:"")); #undef TEST break; } @@ -419,18 +462,18 @@ proceed: "offset:%i\n" "middle:%s\n" "after:%s\n", - output, + Ps->output, synctex_node_page(node), - synctex_node_h(node), - synctex_node_v(node), - synctex_node_box_h(node), - synctex_node_box_v(node)+synctex_node_box_depth(node), - synctex_node_box_width(node), - synctex_node_box_height(node)+synctex_node_box_depth(node), - (before?before:""), - offset, - (middle?middle:""), - (after?after:"")); + synctex_node_visible_h(node), + synctex_node_visible_v(node), + synctex_node_box_visible_h(node), + synctex_node_box_visible_v(node)+synctex_node_box_visible_depth(node), + synctex_node_box_visible_width(node), + synctex_node_box_visible_height(node)+synctex_node_box_visible_depth(node), + (Ps->before?Ps->before:""), + Ps->offset, + (Ps->middle?Ps->middle:""), + (Ps->after?Ps->after:"")); } while((node = synctex_next_result(scanner)) != NULL); puts("SyncTeX result end"); } @@ -445,74 +488,85 @@ void synctex_help_edit(char * error,...) { synctex_usage(error, v); va_end(v); fputs( - "synctex edit: backwards or reverse synchronization,\n" - "command sent by the viewer to edit the source corresponding to the position under the mouse\n\n" - "\n" - "usage: synctex edit -o page:x:y:file [-x editor-command] [-h offset:context]\n" - "\n" - "-o page:x:y:file\n" - " specify the page and coordinates of the point under the mouse.\n" - " page is 1 based.\n" - " Coordinates x and y are counted from the top left corner of the page.\n" - " Their unit is the big point (72 dpi).\n" - " \n" - " file is in general the path of a pdf or dvi file.\n" - " It can be either absolute or relative to the current directory.\n" - " This named file must always exist.\n" - " \n" - "-x editor-command\n" - " Normally the synctex tool outputs its result to the stdout.\n" - " It is possible to execute an external tool with the result of the query.\n" - " The editor-command is a printf like format string with following specifiers.\n" - " They will be replaced by their value before the command is executed.\n" - " %{output} is the full path specifier of the output document, with no extension.\n" - " %{input} is the name specifier of the input document.\n" - " %{line} is the 0 based line number specifier. %{line+1} is the 1 based line number specifier.\n" - " %{column} is the 0 based column number specifier or -1. %{column+1} is the 1 based column number or -1.\n" - " %{offset} is the 0 based offset specifier and %{context} is the context specifier of the hint.\n" - " \n" - " If no editor-command is provided, the content of the SYNCTEX_EDITOR environment variable is used instead.\n" - " \n" - "-h offset:context\n" - " This hint allows a backwards or reverse synchronization by contents.\n" - " You give a context including the character at the mouse location, and\n" - " the offset of this character relative to the beginning of this bunch of text.\n" - " \n", - (error?stderr:stdout) + "synctex edit: backwards or reverse synchronization,\n" + "command sent by the viewer to edit the source corresponding to the position under the mouse\n\n" + "\n" + "usage: synctex edit -o page:x:y:file [-d directory] [-x editor-command] [-h offset:context]\n" + "\n" + "-o page:x:y:file\n" + " specify the page and coordinates of the point under the mouse.\n" + " page is 1 based.\n" + " Coordinates x and y are counted from the top left corner of the page.\n" + " Their unit is the big point (72 dpi).\n" + " \n" + " file is in general the path of a pdf or dvi file.\n" + " It can be either absolute or relative to the current directory.\n" + " This named file must always exist.\n" + " \n" + "-d directory\n" + " is the directory containing the synctex file, in case it is different from the directory of the output.\n" + " This directory must exist.\n" + " An example will explain how things work: for synctex -o ...:bar.tex -d foo,\n" + " the chosen synctex file is the most recent among bar.synctex, bar.synctex.gz, foo/bar.synctex and foo/bar.synctex.gz.\n" + " The other ones are simply removed, if the authorization is granted\n" + " \n" + "-x editor-command\n" + " Normally the synctex tool outputs its result to the stdout.\n" + " It is possible to execute an external tool with the result of the query.\n" + " The editor-command is a printf like format string with following specifiers.\n" + " They will be replaced by their value before the command is executed.\n" + " %{output} is the full path specifier of the output document, with no extension.\n" + " %{input} is the name specifier of the input document.\n" + " %{line} is the 0 based line number specifier. %{line+1} is the 1 based line number specifier.\n" + " %{column} is the 0 based column number specifier or -1. %{column+1} is the 1 based column number or -1.\n" + " %{offset} is the 0 based offset specifier and %{context} is the context specifier of the hint.\n" + " \n" + " If no editor-command is provided, the content of the SYNCTEX_EDITOR environment variable is used instead.\n" + " \n" + "-h offset:context\n" + " This hint allows a backwards or reverse synchronization by contents.\n" + " You give a context including the character at the mouse location, and\n" + " the offset of this character relative to the beginning of this bunch of text.\n" + " \n", + (error?stderr:stdout) ); return; } -/* "usage: synctex edit -o page:x:y:output [-x editor-command] [-h offset:context]\n" */ +typedef struct { + int page; + float x; + float y; + unsigned int offset; + char * output; + char * directory; + char * editor; + char * context; +} synctex_edit_params_t; + +int synctex_view_proceed(synctex_view_params_t * paramsRef); + +/* "usage: synctex edit -o page:x:y:output [-d directory] [-x editor-command] [-h offset:context]\n" */ int synctex_edit(int argc, char *argv[]) { int arg_index = 0; - int page = -1; - float x = 0; - float y = 0; - char * output = NULL; - char * editor = NULL; - int offset = 0; - char * context = NULL; char * start = NULL; char * end = NULL; - synctex_scanner_t scanner = NULL; - size_t size = 0; - char * where = NULL; + synctex_edit_params_t Ps = {0,0,0,0,NULL,NULL,NULL,NULL}; /* required */ if((arg_index>=argc) || strcmp("-o",argv[arg_index]) || (++arg_index>=argc)) { - synctex_help_view("Missing -o required argument"); + synctex_help_edit("Missing -o required argument"); return -1; } start = argv[arg_index]; - page = strtol(start,&end,10); + Ps.page = strtol(start,&end,10); if(end>start && strlen(end)>1 && *end==':') { start = end+1; - x = strtod(start,&end); + Ps.x = strtod(start,&end); if(end>start && strlen(end)>1 && *end==':') { start = end+1; - y = strtod(start,&end); + Ps.y = strtod(start,&end); if(end>start && strlen(end)>1 && *end==':') { - output = ++end; + Ps.output = ++end; goto scan_execute; } } @@ -522,24 +576,38 @@ int synctex_edit(int argc, char *argv[]) { scan_execute: /* now scan the optional arguments */ if(++arg_index<argc) { + if(0 == strcmp("-d",argv[arg_index])) { + if(++arg_index<argc) { + Ps.directory = argv[arg_index]; + if(++arg_index<argc) { + goto option_command; + } else { + return synctex_edit_proceed(&Ps); + } + } else { + Ps.directory = getenv("SYNCTEX_BUILD_DIRECTORY"); + return synctex_edit_proceed(&Ps); + } + } +option_command: if(0 == strcmp("-x",argv[arg_index])) { if(++arg_index<argc) { if(strcmp("-",argv[arg_index])) { /* next option does not start with '-', this is a command */ - editor = argv[arg_index]; + Ps.editor = argv[arg_index]; if(++arg_index<argc) { goto option_hint; } else { - goto proceed; + return synctex_edit_proceed(&Ps); } } else { /* retrieve the environment variable */ - editor = getenv("SYNCTEX_EDITOR"); + Ps.editor = getenv("SYNCTEX_EDITOR"); goto option_hint; } } else { - editor = getenv("SYNCTEX_EDITOR"); - goto proceed; + Ps.editor = getenv("SYNCTEX_EDITOR"); + return synctex_edit_proceed(&Ps); } } option_hint: @@ -547,43 +615,49 @@ option_hint: start = argv[arg_index]; end = NULL; - offset = strtol(start,&end,10); + Ps.offset = strtol(start,&end,10); if(end>start && strlen(end)>1 && *end==':') { - context = end+1; - goto proceed; + Ps.context = end+1; + return synctex_edit_proceed(&Ps); } synctex_help_edit("Bad -h argument"); return -1; } } -proceed: + return synctex_edit_proceed(&Ps); +} + +int synctex_edit_proceed(synctex_edit_params_t * Ps) { + synctex_scanner_t scanner = NULL; #if SYNCTEX_DEBUG - printf("page:%i\n",page); - printf("x:%f\n",x); - printf("y:%f\n",y); - printf("almost output:%s\n",output); - printf("editor:%s\n",editor); - printf("offset:%i\n",offset); - printf("context:%s\n",context); + printf("page:%i\n",Ps->page); + printf("x:%f\n",Ps->x); + printf("y:%f\n",Ps->y); + printf("almost output:%s\n",Ps->output); + printf("editor:%s\n",Ps->editor); + printf("offset:%i\n",Ps->offset); + printf("context:%s\n",Ps->context); printf("cwd:%s\n",getcwd(NULL,0)); #endif - scanner = synctex_scanner_new_with_output_file(output); + scanner = synctex_scanner_new_with_output_file(Ps->output,Ps->directory,1); if(NULL == scanner) { - synctex_help_view("No SyncTeX available for %s",output); + synctex_help_edit("No SyncTeX available for %s",Ps->output); return -1; } - if(synctex_edit_query(scanner,page,x,y)) { + if(synctex_edit_query(scanner,Ps->page,Ps->x,Ps->y)) { synctex_node_t node = NULL; const char * input = NULL; if(NULL != (node = synctex_next_result(scanner)) && NULL != (input = (char *)synctex_scanner_get_name(scanner,synctex_node_tag(node)))) { /* filtering the command */ - if(editor && strlen(editor)) { + if(Ps->editor && strlen(Ps->editor)) { + size_t size = 0; + char * where = NULL; char * buffer = NULL; char * buffer_cur = NULL; int printed; int status; - size = strlen(editor)+3*sizeof(int)+3*SYNCTEX_STR_SIZE; + size = strlen(Ps->editor)+3*sizeof(int)+3*SYNCTEX_STR_SIZE; buffer = malloc(size+1); if(NULL == buffer) { printf("SyncTeX ERROR: No memory available\n"); @@ -591,10 +665,10 @@ proceed: } buffer[size]='\0'; /* Replace %{ by &{, then remove all unescaped '%'*/ - while((where = strstr(editor,"%{")) != NULL) { + while((where = strstr(Ps->editor,"%{")) != NULL) { *where = '&'; } - where = editor; + where = Ps->editor; while(where &&(where = strstr(where,"%"))) { if(strlen(++where)) { if(*where == '%') { @@ -606,13 +680,13 @@ proceed: } buffer_cur = buffer; /* find the next occurrence of a format key */ - where = editor; - while(editor && (where = strstr(editor,"&{"))) { + where = Ps->editor; + while(Ps->editor && (where = strstr(Ps->editor,"&{"))) { #define TEST(KEY,FORMAT,WHAT)\ if(!strncmp(where,KEY,strlen(KEY))) {\ - printed = where-editor;\ - if(buffer_cur != memcpy(buffer_cur,editor,(size_t)printed)) {\ - synctex_help_view("Memory copy problem");\ + printed = where-Ps->editor;\ + if(buffer_cur != memcpy(buffer_cur,Ps->editor,(size_t)printed)) {\ + synctex_help_edit("Memory copy problem");\ free(buffer);\ return -1;\ }\ @@ -620,20 +694,20 @@ proceed: printed = snprintf(buffer_cur,size,FORMAT,WHAT);\ buffer_cur += printed;size-=printed;\ *buffer_cur='\0';\ - editor = where+strlen(KEY);\ + Ps->editor = where+strlen(KEY);\ continue;\ } - TEST("&{output}", "%s",output); + TEST("&{output}", "%s",Ps->output); TEST("&{input}", "%s",input); TEST("&{line}", "%i",synctex_node_line(node)); TEST("&{column}", "%i",-1); - TEST("&{offset}", "%i",offset); - TEST("&{context}","%s",context); + TEST("&{offset}", "%i",Ps->offset); + TEST("&{context}","%s",Ps->context); #undef TEST break; } /* copy the rest of editor into the buffer */ - if(buffer_cur != memcpy(buffer_cur,editor,strlen(editor))) { + if(buffer_cur != memcpy(buffer_cur,Ps->editor,strlen(Ps->editor))) { fputs("! synctex_edit: Memory copy problem",stderr); free(buffer); return -1; @@ -653,12 +727,12 @@ proceed: "Column:%i\n" "Offset:%i\n" "Context:%s\n", - output, + Ps->output, input, synctex_node_line(node), synctex_node_column(node), - offset, - (context?context:"")); + Ps->offset, + (Ps->context?Ps->context:"")); } while((node = synctex_next_result(scanner)) != NULL); puts("SyncTeX result end"); } @@ -673,24 +747,30 @@ void synctex_help_update(char * error,...) { synctex_usage(error, v); va_end(v); fputs( - "synctex update: up to date synctex file,\n" - "Use this command to update the synctex file once a dvi/xdv to pdf filter is applied.\n\n" - "\n" - "usage: synctex update -o output [-m number] [-x dimension] [-y dimension]\n" - "\n" - "-o output is the full or relative path of an existing file,.\n" - " either the real synctex file you wish to update\n" - " or a related file: foo.tex, foo.pdf, foo.dvi...\n" - "-m number Set additional magnification\n" - "-x dimension Set horizontal offset\n" - "-y dimension Set vertical offset\n" - "In general, these are exactly the options provided to the dvi/xdv to pdf filter.\n", - (error?stderr:stdout) + "synctex update: up to date synctex file,\n" + "Use this command to update the synctex file once a dvi/xdv to pdf filter is applied.\n\n" + "\n" + "usage: synctex update -o output [-d directory] [-m number] [-x dimension] [-y dimension]\n" + "\n" + "-o output is the full or relative path of an existing file,.\n" + " either the real synctex file you wish to update\n" + " or a related file: foo.tex, foo.pdf, foo.dvi...\n" + "-d directory is the directory containing the synctex file, in case it is different from the directory of the output.\n" + " This directory must exist.\n" + " An example will explain how things work: for synctex -o ...:bar.tex -d foo,\n" + " the chosen synctex file is the most recent among bar.synctex, bar.synctex.gz, foo/bar.synctex and foo/bar.synctex.gz.\n" + " The other ones are simply removed, if the authorization is granted\n" + " \n" + "-m number Set additional magnification\n" + "-x dimension Set horizontal offset\n" + "-y dimension Set vertical offset\n" + "In general, these are exactly the same options provided to the dvi/xdv to pdf filter.\n", + (error?stderr:stdout) ); return; } -/* "usage: synctex update -o output [-m number] [-x dimension] [-y dimension]\n" */ +/* "usage: synctex update -o output [-d directory] [-m number] [-x dimension] [-y dimension]\n" */ int synctex_update(int argc, char *argv[]) { int arg_index = 0; synctex_updater_t updater = NULL; @@ -698,6 +778,7 @@ int synctex_update(int argc, char *argv[]) { char * x = NULL; char * y = NULL; char * output = NULL; + char * directory = NULL; #define SYNCTEX_fprintf (*synctex_fprintf) if(arg_index>=argc) { synctex_help_update("Bad update command"); @@ -737,12 +818,75 @@ prepare_next_argument: } y = argv[arg_index]; goto prepare_next_argument; + } else if(0 == strcmp("-d",argv[arg_index])) { + if(++arg_index<argc) { + directory = argv[arg_index]; + } else { + directory = getenv("SYNCTEX_BUILD_DIRECTORY"); + } + goto prepare_next_argument; } + /* Arguments parsed */ - updater = synctex_updater_new_with_output_file(output); + updater = synctex_updater_new_with_output_file(output,directory); synctex_updater_append_magnification(updater,magnification); synctex_updater_append_x_offset(updater,x); synctex_updater_append_y_offset(updater,y); synctex_updater_free(updater); return 0; } + +int synctex_test_file (int argc, char *argv[]); + +/* "usage: synctex test subcommand options\n" */ +int synctex_test(int argc, char *argv[]) { + if(argc) { + if(0==strcmp("file",argv[0])) { + return synctex_test_file(argc-1,argv+1); + } + } + return 0; +} + +int synctex_test_file (int argc, char *argv[]) +{ + int arg_index = 0; + char * output = NULL; + char * directory = NULL; + char * synctex_name = NULL; + synctex_compress_mode_t mode = synctex_compress_mode_none; + if(arg_index>=argc) { + _synctex_error("! usage: synctex test file -o output [-d directory]\n"); + return -1; + } + /* required */ + if((arg_index>=argc) || strcmp("-o",argv[arg_index]) || (++arg_index>=argc)) { + _synctex_error("! usage: synctex test file -o output [-d directory]\n"); + return -1; + } + output = argv[arg_index]; + /* optional */ + if(++arg_index<argc) { + if(0 == strcmp("-d",argv[arg_index])) { + if(++arg_index<argc) { + directory = argv[arg_index]; + } else { + directory = getenv("SYNCTEX_BUILD_DIRECTORY"); + } + } + } + /* Arguments parsed */ + if(_synctex_get_name(output, directory, &synctex_name, &mode)) { + _synctex_error("! TEST FAILED\n"); + } else { + printf("output:%s\n" + "directory:%s\n" + "file name:%s\n" + "compression mode:%s\n", + output, + directory, + synctex_name, + (mode?"gz":"none")); + } + return 0; +} diff --git a/Build/source/texk/web2c/synctexdir/synctex_parser.c b/Build/source/texk/web2c/synctexdir/synctex_parser.c index 1e99f2cf1ec..327ca37abef 100644 --- a/Build/source/texk/web2c/synctexdir/synctex_parser.c +++ b/Build/source/texk/web2c/synctexdir/synctex_parser.c @@ -1,8 +1,13 @@ /* -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Version: 1.6 +See synctex_parser_readme.txt for more details + +Latest Revision: Wed Jul 1 11:18:18 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -59,39 +64,22 @@ Thu Jun 19 09:39:21 UTC 2008 # define HAVE_LOCALE_H 1 # define HAVE_SETLOCALE 1 # if defined(_MSC_VER) -# define inline __inline +# define SYNCTEX_INLINE __inline +# else +# define SYNCTEX_INLINE inline # endif # endif -#include "stddef.h" -#include "stdio.h" -#include "stdlib.h" -#include "string.h" -#include "limits.h" -#include "time.h" -#include "math.h" -#include "errno.h" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <limits.h> #if defined(HAVE_LOCALE_H) #include <locale.h> #endif -void *_synctex_malloc(size_t size); - -/* This custom malloc functions initializes to 0 the newly allocated memory. */ -void *_synctex_malloc(size_t size) { - void * ptr = malloc(size); - if(ptr) { -/* In Visual C, bzero is not available */ -#ifdef _MSC_VER - memset(ptr,0, size); -#else - bzero(ptr,size); -#endif - } - return (void *)ptr; -} - /* The data is organized in a graph with multiple entries. * The root object is a scanner, it is created with the contents on a synctex file. * Each leaf of the tree is a synctex_node_t object. @@ -103,8 +91,9 @@ void *_synctex_malloc(size_t size) { */ #include "synctex_parser.h" +#include <synctex_parser_utils.h> -/* each synctex node has a class */ +/* each synctex node has a class */ typedef struct __synctex_class_t _synctex_class_t; typedef _synctex_class_t * synctex_class_t; @@ -214,17 +203,20 @@ struct __synctex_class_t { SYNCTEX_GETTER(NEW_SIBLING,parent)[0]=SYNCTEX_GETTER(NODE,parent)[0];\ }\ } -/* Friend getter and setter +/* Friend getter and setter. A friend is a kern, math, glue or void box node which tag and line numbers are similar. + * This is a first filter on the nodes that avoids testing all of them. + * Friends are used mainly in forward synchronization aka from source to output. */ # define SYNCTEX_FRIEND(NODE) SYNCTEX_GET(NODE,friend) # define SYNCTEX_SET_FRIEND(NODE,NEW_FRIEND) if(NODE && NEW_FRIEND){\ SYNCTEX_GETTER(NODE,friend)[0]=NEW_FRIEND;\ } -/* Next box getter and setter +/* Next box getter and setter. The box tree can be traversed from one horizontal boxes to the other. + * Navigation starts with the deeper boxes. */ -# define SYNCTEX_NEXT_BOX(NODE) SYNCTEX_GET(NODE,next_box) -# define SYNCTEX_SET_NEXT_BOX(NODE,NEXT_BOX) if(NODE && NEXT_BOX){\ +# define SYNCTEX_NEXT_HORIZ_BOX(NODE) SYNCTEX_GET(NODE,next_box) +# define SYNCTEX_SET_NEXT_HORIZ_BOX(NODE,NEXT_BOX) if(NODE && NEXT_BOX){\ SYNCTEX_GETTER(NODE,next_box)[0]=NEXT_BOX;\ } @@ -256,35 +248,42 @@ void _synctex_free_leaf(synctex_node_t node) { } return; } - -#include <zlib.h> +# ifdef __SYNCTEX_WORK__ +# include "/usr/include/zlib.h" +# else +# include <zlib.h> +# endif /* The synctex scanner is the root object. * Is is initialized with the contents of a text file or a gzipped file. * The buffer_? are first used to parse the text. */ struct __synctex_scanner_t { - gzFile file; /* The (possibly compressed) file */ - unsigned char * buffer_cur; /* current location in the buffer */ - unsigned char * buffer_start; /* start of the buffer */ - unsigned char * buffer_end; /* end of the buffer */ - char * output_fmt; /* dvi or pdf, not yet used */ - char * output; /* the output name used to create the scanner */ - char * synctex; /* the .synctex or .synctex.gz name used to create the scanner */ - int version; /* 1, not yet used */ - int pre_magnification; /* magnification from the synctex preamble */ - int pre_unit; /* unit from the synctex preamble */ - int pre_x_offset; /* X offste from the synctex preamble */ - int pre_y_offset; /* Y offset from the synctex preamble */ - int count; /* Number of records, from the synctex postamble */ - float unit; /* real unit, from synctex preamble or post scriptum */ - float x_offset; /* X offset, from synctex preamble or post scriptum */ - float y_offset; /* Y Offset, from synctex preamble or post scriptum */ - synctex_node_t sheet; /* The first sheet node, its siblings are the other sheet nodes */ - synctex_node_t input; /* The first input node, its siblings are the other input nodes */ - int number_of_lists; /* The number of friend lists */ - synctex_node_t * lists_of_friends;/* The friend lists */ - _synctex_class_t class[synctex_node_number_of_types]; /* The classes of the nodes of the scanner */ + gzFile file; /* The (possibly compressed) file */ + unsigned char * buffer_cur; /* current location in the buffer */ + unsigned char * buffer_start; /* start of the buffer */ + unsigned char * buffer_end; /* end of the buffer */ + char * output_fmt; /* dvi or pdf, not yet used */ + char * output; /* the output name used to create the scanner */ + char * synctex; /* the .synctex or .synctex.gz name used to create the scanner */ + int version; /* 1, not yet used */ + struct { + unsigned has_parsed:1; /* Whether the scanner has parsed its underlying synctex file. */ + unsigned reserved:sizeof(unsigned)-1; /* alignment */ + } flags; + int pre_magnification; /* magnification from the synctex preamble */ + int pre_unit; /* unit from the synctex preamble */ + int pre_x_offset; /* X offste from the synctex preamble */ + int pre_y_offset; /* Y offset from the synctex preamble */ + int count; /* Number of records, from the synctex postamble */ + float unit; /* real unit, from synctex preamble or post scriptum */ + float x_offset; /* X offset, from synctex preamble or post scriptum */ + float y_offset; /* Y Offset, from synctex preamble or post scriptum */ + synctex_node_t sheet; /* The first sheet node, its siblings are the other sheet nodes */ + synctex_node_t input; /* The first input node, its siblings are the other input nodes */ + int number_of_lists; /* The number of friend lists */ + synctex_node_t * lists_of_friends;/* The friend lists */ + _synctex_class_t class[synctex_node_number_of_types]; /* The classes of the nodes of the scanner */ }; /* SYNCTEX_CUR, SYNCTEX_START and SYNCTEX_END are convenient shortcuts @@ -337,8 +336,8 @@ SYNCTEX_MAKE_GET(_synctex_implementation_5,5) typedef struct { synctex_class_t class; - synctex_info_t implementation[3+SYNCTEX_PAGE_IDX+1];/* child, sibling, next box, - * SYNCTEX_PAGE_IDX */ + synctex_info_t implementation[3+SYNCTEX_PAGE_IDX+1];/* child, sibling, next box, + * SYNCTEX_PAGE_IDX */ } synctex_sheet_t; synctex_node_t _synctex_new_sheet(synctex_scanner_t scanner); @@ -346,18 +345,18 @@ void _synctex_display_sheet(synctex_node_t sheet); void _synctex_log_sheet(synctex_node_t sheet); static const _synctex_class_t synctex_class_sheet = { - NULL, /* No scanner yet */ - synctex_node_type_sheet, /* Node type */ - &_synctex_new_sheet, /* creator */ - &_synctex_free_node, /* destructor */ - &_synctex_log_sheet, /* log */ - &_synctex_display_sheet, /* display */ - NULL, /* No parent */ - &_synctex_implementation_0, /* child */ - &_synctex_implementation_1, /* sibling */ - NULL, /* No friend */ - &_synctex_implementation_2, /* Next box */ - (_synctex_info_getter_t)&_synctex_implementation_3 /* info */ + NULL, /* No scanner yet */ + synctex_node_type_sheet, /* Node type */ + &_synctex_new_sheet, /* creator */ + &_synctex_free_node, /* destructor */ + &_synctex_log_sheet, /* log */ + &_synctex_display_sheet, /* display */ + NULL, /* No parent */ + &_synctex_implementation_0, /* child */ + &_synctex_implementation_1, /* sibling */ + NULL, /* No friend */ + &_synctex_implementation_2, /* Next box */ + (_synctex_info_getter_t)&_synctex_implementation_3 /* info */ }; /* sheet node creator */ @@ -390,12 +389,15 @@ synctex_node_t _synctex_new_sheet(synctex_scanner_t scanner) { # define SYNCTEX_WIDTH(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_WIDTH_IDX].INT # define SYNCTEX_HEIGHT(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_HEIGHT_IDX].INT # define SYNCTEX_DEPTH(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_DEPTH_IDX].INT +# define SYNCTEX_ABS_WIDTH(NODE) ((SYNCTEX_WIDTH(NODE)>0?SYNCTEX_WIDTH(NODE):-SYNCTEX_WIDTH(NODE))) +# define SYNCTEX_ABS_HEIGHT(NODE) ((SYNCTEX_HEIGHT(NODE)>0?SYNCTEX_HEIGHT(NODE):-SYNCTEX_HEIGHT(NODE))) +# define SYNCTEX_ABS_DEPTH(NODE) ((SYNCTEX_DEPTH(NODE)>0?SYNCTEX_DEPTH(NODE):-SYNCTEX_DEPTH(NODE))) typedef struct { synctex_class_t class; - synctex_info_t implementation[5+SYNCTEX_DEPTH_IDX+1]; /* parent,child,sibling,friend,next box, - * SYNCTEX_TAG,SYNCTEX_LINE,SYNCTEX_COLUMN, - * SYNCTEX_HORIZ,SYNCTEX_VERT,SYNCTEX_WIDTH,SYNCTEX_HEIGHT,SYNCTEX_DEPTH */ + synctex_info_t implementation[5+SYNCTEX_DEPTH_IDX+1]; /* parent,child,sibling,friend,next box, + * SYNCTEX_TAG,SYNCTEX_LINE,SYNCTEX_COLUMN, + * SYNCTEX_HORIZ,SYNCTEX_VERT,SYNCTEX_WIDTH,SYNCTEX_HEIGHT,SYNCTEX_DEPTH */ } synctex_vert_box_node_t; synctex_node_t _synctex_new_vbox(synctex_scanner_t scanner); @@ -405,17 +407,17 @@ void _synctex_display_vbox(synctex_node_t node); /* These are static class objects, each scanner will make a copy of them and setup the scanner field. */ static const _synctex_class_t synctex_class_vbox = { - NULL, /* No scanner yet */ - synctex_node_type_vbox, /* Node type */ - &_synctex_new_vbox, /* creator */ - &_synctex_free_node, /* destructor */ - &_synctex_log_box, /* log */ - &_synctex_display_vbox, /* display */ - &_synctex_implementation_0, /* parent */ - &_synctex_implementation_1, /* child */ - &_synctex_implementation_2, /* sibling */ - &_synctex_implementation_3, /* friend */ - &_synctex_implementation_4, /* next box */ + NULL, /* No scanner yet */ + synctex_node_type_vbox, /* Node type */ + &_synctex_new_vbox, /* creator */ + &_synctex_free_node, /* destructor */ + &_synctex_log_box, /* log */ + &_synctex_display_vbox, /* display */ + &_synctex_implementation_0, /* parent */ + &_synctex_implementation_1, /* child */ + &_synctex_implementation_2, /* sibling */ + &_synctex_implementation_3, /* friend */ + &_synctex_implementation_4, /* next box */ (_synctex_info_getter_t)&_synctex_implementation_5 }; @@ -439,14 +441,17 @@ synctex_node_t _synctex_new_vbox(synctex_scanner_t scanner) { # define SYNCTEX_WIDTH_V(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_WIDTH_V_IDX].INT # define SYNCTEX_HEIGHT_V(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_HEIGHT_V_IDX].INT # define SYNCTEX_DEPTH_V(NODE) SYNCTEX_INFO(NODE)[SYNCTEX_DEPTH_V_IDX].INT +# define SYNCTEX_ABS_WIDTH_V(NODE) ((SYNCTEX_WIDTH_V(NODE)>0?SYNCTEX_WIDTH_V(NODE):-SYNCTEX_WIDTH_V(NODE))) +# define SYNCTEX_ABS_HEIGHT_V(NODE) ((SYNCTEX_HEIGHT_V(NODE)>0?SYNCTEX_HEIGHT_V(NODE):-SYNCTEX_HEIGHT_V(NODE))) +# define SYNCTEX_ABS_DEPTH_V(NODE) ((SYNCTEX_DEPTH_V(NODE)>0?SYNCTEX_DEPTH_V(NODE):-SYNCTEX_DEPTH_V(NODE))) /* Horizontal boxes must contain visible size, because 0 width does not mean emptiness */ typedef struct { synctex_class_t class; synctex_info_t implementation[5+SYNCTEX_DEPTH_V_IDX+1]; /*parent,child,sibling,friend,next box, - * SYNCTEX_TAG,SYNCTEX_LINE,SYNCTEX_COLUMN, - * SYNCTEX_HORIZ,SYNCTEX_VERT,SYNCTEX_WIDTH,SYNCTEX_HEIGHT,SYNCTEX_DEPTH, - * SYNCTEX_HORIZ_V,SYNCTEX_VERT_V,SYNCTEX_WIDTH_V,SYNCTEX_HEIGHT_V,SYNCTEX_DEPTH_V*/ + * SYNCTEX_TAG,SYNCTEX_LINE,SYNCTEX_COLUMN, + * SYNCTEX_HORIZ,SYNCTEX_VERT,SYNCTEX_WIDTH,SYNCTEX_HEIGHT,SYNCTEX_DEPTH, + * SYNCTEX_HORIZ_V,SYNCTEX_VERT_V,SYNCTEX_WIDTH_V,SYNCTEX_HEIGHT_V,SYNCTEX_DEPTH_V*/ } synctex_horiz_box_node_t; synctex_node_t _synctex_new_hbox(synctex_scanner_t scanner); @@ -455,17 +460,17 @@ void _synctex_log_horiz_box(synctex_node_t sheet); static const _synctex_class_t synctex_class_hbox = { - NULL, /* No scanner yet */ - synctex_node_type_hbox, /* Node type */ - &_synctex_new_hbox, /* creator */ - &_synctex_free_node, /* destructor */ - &_synctex_log_horiz_box, /* log */ - &_synctex_display_hbox, /* display */ - &_synctex_implementation_0, /* parent */ - &_synctex_implementation_1, /* child */ - &_synctex_implementation_2, /* sibling */ - &_synctex_implementation_3, /* friend */ - &_synctex_implementation_4, /* next box */ + NULL, /* No scanner yet */ + synctex_node_type_hbox, /* Node type */ + &_synctex_new_hbox, /* creator */ + &_synctex_free_node, /* destructor */ + &_synctex_log_horiz_box, /* log */ + &_synctex_display_hbox, /* display */ + &_synctex_implementation_0, /* parent */ + &_synctex_implementation_1, /* child */ + &_synctex_implementation_2, /* sibling */ + &_synctex_implementation_3, /* friend */ + &_synctex_implementation_4, /* next box */ (_synctex_info_getter_t)&_synctex_implementation_5 }; @@ -483,9 +488,9 @@ synctex_node_t _synctex_new_hbox(synctex_scanner_t scanner) { */ typedef struct { synctex_class_t class; - synctex_info_t implementation[3+SYNCTEX_DEPTH_IDX+1]; /* parent,sibling,friend, - * SYNCTEX_TAG,SYNCTEX_LINE,SYNCTEX_COLUMN, - * SYNCTEX_HORIZ,SYNCTEX_VERT,SYNCTEX_WIDTH,SYNCTEX_HEIGHT,SYNCTEX_DEPTH*/ + synctex_info_t implementation[3+SYNCTEX_DEPTH_IDX+1]; /* parent,sibling,friend, + * SYNCTEX_TAG,SYNCTEX_LINE,SYNCTEX_COLUMN, + * SYNCTEX_HORIZ,SYNCTEX_VERT,SYNCTEX_WIDTH,SYNCTEX_HEIGHT,SYNCTEX_DEPTH*/ } synctex_void_box_node_t; synctex_node_t _synctex_new_void_vbox(synctex_scanner_t scanner); @@ -493,17 +498,17 @@ void _synctex_log_void_box(synctex_node_t sheet); void _synctex_display_void_vbox(synctex_node_t node); static const _synctex_class_t synctex_class_void_vbox = { - NULL, /* No scanner yet */ - synctex_node_type_void_vbox,/* Node type */ - &_synctex_new_void_vbox, /* creator */ - &_synctex_free_node, /* destructor */ - &_synctex_log_void_box, /* log */ - &_synctex_display_void_vbox,/* display */ - &_synctex_implementation_0, /* parent */ - NULL, /* No child */ - &_synctex_implementation_1, /* sibling */ - &_synctex_implementation_2, /* friend */ - NULL, /* No next box */ + NULL, /* No scanner yet */ + synctex_node_type_void_vbox,/* Node type */ + &_synctex_new_void_vbox, /* creator */ + &_synctex_free_node, /* destructor */ + &_synctex_log_void_box, /* log */ + &_synctex_display_void_vbox,/* display */ + &_synctex_implementation_0, /* parent */ + NULL, /* No child */ + &_synctex_implementation_1, /* sibling */ + &_synctex_implementation_2, /* friend */ + NULL, /* No next box */ (_synctex_info_getter_t)&_synctex_implementation_3 }; @@ -520,17 +525,17 @@ synctex_node_t _synctex_new_void_hbox(synctex_scanner_t scanner); void _synctex_display_void_hbox(synctex_node_t node); static const _synctex_class_t synctex_class_void_hbox = { - NULL, /* No scanner yet */ - synctex_node_type_void_hbox,/* Node type */ - &_synctex_new_void_hbox, /* creator */ - &_synctex_free_node, /* destructor */ - &_synctex_log_void_box, /* log */ - &_synctex_display_void_hbox,/* display */ - &_synctex_implementation_0, /* parent */ - NULL, /* No child */ - &_synctex_implementation_1, /* sibling */ - &_synctex_implementation_2, /* friend */ - NULL, /* No next box */ + NULL, /* No scanner yet */ + synctex_node_type_void_hbox,/* Node type */ + &_synctex_new_void_hbox, /* creator */ + &_synctex_free_node, /* destructor */ + &_synctex_log_void_box, /* log */ + &_synctex_display_void_hbox,/* display */ + &_synctex_implementation_0, /* parent */ + NULL, /* No child */ + &_synctex_implementation_1, /* sibling */ + &_synctex_implementation_2, /* friend */ + NULL, /* No next box */ (_synctex_info_getter_t)&_synctex_implementation_3 }; @@ -543,34 +548,43 @@ synctex_node_t _synctex_new_void_hbox(synctex_scanner_t scanner) { return node; } -/* The medium nodes correspond to kern, glue and math nodes. */ +/* The medium nodes correspond to kern, glue, penalty and math nodes. */ typedef struct { synctex_class_t class; - synctex_info_t implementation[3+SYNCTEX_WIDTH_IDX+1]; /* parent,sibling,friend, - * SYNCTEX_TAG,SYNCTEX_LINE,SYNCTEX_COLUMN, - * SYNCTEX_HORIZ,SYNCTEX_VERT,SYNCTEX_WIDTH */ + synctex_info_t implementation[3+SYNCTEX_WIDTH_IDX+1]; /* parent,sibling,friend, + * SYNCTEX_TAG,SYNCTEX_LINE,SYNCTEX_COLUMN, + * SYNCTEX_HORIZ,SYNCTEX_VERT,SYNCTEX_WIDTH */ } synctex_medium_node_t; +#define SYNCTEX_IS_BOX(NODE)\ + ((NODE->class->type == synctex_node_type_vbox)\ + || (NODE->class->type == synctex_node_type_void_vbox)\ + || (NODE->class->type == synctex_node_type_hbox)\ + || (NODE->class->type == synctex_node_type_void_hbox)) + +#define SYNCTEX_HAS_CHILDREN(NODE) (NODE && SYNCTEX_CHILD(NODE)) + +void _synctex_log_medium_node(synctex_node_t node); + +/* math node creator */ synctex_node_t _synctex_new_math(synctex_scanner_t scanner); -void _synctex_log_medium_node(synctex_node_t sheet); void _synctex_display_math(synctex_node_t node); static const _synctex_class_t synctex_class_math = { - NULL, /* No scanner yet */ - synctex_node_type_math, /* Node type */ - &_synctex_new_math, /* creator */ - &_synctex_free_leaf, /* destructor */ - &_synctex_log_medium_node, /* log */ - &_synctex_display_math, /* display */ - &_synctex_implementation_0, /* parent */ - NULL, /* No child */ - &_synctex_implementation_1, /* sibling */ - &_synctex_implementation_2, /* friend */ - NULL, /* No next box */ + NULL, /* No scanner yet */ + synctex_node_type_math, /* Node type */ + &_synctex_new_math, /* creator */ + &_synctex_free_leaf, /* destructor */ + &_synctex_log_medium_node, /* log */ + &_synctex_display_math, /* display */ + &_synctex_implementation_0, /* parent */ + NULL, /* No child */ + &_synctex_implementation_1, /* sibling */ + &_synctex_implementation_2, /* friend */ + NULL, /* No next box */ (_synctex_info_getter_t)&_synctex_implementation_3 }; -/* math node creator */ synctex_node_t _synctex_new_math(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_medium_node_t)); if(node) { @@ -579,24 +593,60 @@ synctex_node_t _synctex_new_math(synctex_scanner_t scanner) { return node; } +/* kern node creator */ +synctex_node_t _synctex_new_kern(synctex_scanner_t scanner); +void _synctex_display_kern(synctex_node_t node); + +static const _synctex_class_t synctex_class_kern = { + NULL, /* No scanner yet */ + synctex_node_type_kern, /* Node type */ + &_synctex_new_kern, /* creator */ + &_synctex_free_leaf, /* destructor */ + &_synctex_log_medium_node, /* log */ + &_synctex_display_kern, /* display */ + &_synctex_implementation_0, /* parent */ + NULL, /* No child */ + &_synctex_implementation_1, /* sibling */ + &_synctex_implementation_2, /* friend */ + NULL, /* No next box */ + (_synctex_info_getter_t)&_synctex_implementation_3 +}; + +synctex_node_t _synctex_new_kern(synctex_scanner_t scanner) { + synctex_node_t node = _synctex_malloc(sizeof(synctex_medium_node_t)); + if(node) { + node->class = scanner?scanner->class+synctex_node_type_kern:(synctex_class_t)&synctex_class_kern; + } + return node; +} + +/* The small nodes correspond to glue and boundary nodes. */ +typedef struct { + synctex_class_t class; + synctex_info_t implementation[3+SYNCTEX_VERT_IDX+1]; /* parent,sibling,friend, + * SYNCTEX_TAG,SYNCTEX_LINE,SYNCTEX_COLUMN, + * SYNCTEX_HORIZ,SYNCTEX_VERT */ +} synctex_small_node_t; + +void _synctex_log_small_node(synctex_node_t node); +/* glue node creator */ synctex_node_t _synctex_new_glue(synctex_scanner_t scanner); void _synctex_display_glue(synctex_node_t node); static const _synctex_class_t synctex_class_glue = { - NULL, /* No scanner yet */ - synctex_node_type_glue, /* Node type */ - &_synctex_new_glue, /* creator */ - &_synctex_free_leaf, /* destructor */ - &_synctex_log_medium_node, /* log */ - &_synctex_display_glue, /* display */ - &_synctex_implementation_0, /* parent */ - NULL, /* No child */ - &_synctex_implementation_1, /* sibling */ - &_synctex_implementation_2, /* friend */ - NULL, /* No next box */ + NULL, /* No scanner yet */ + synctex_node_type_glue, /* Node type */ + &_synctex_new_glue, /* creator */ + &_synctex_free_leaf, /* destructor */ + &_synctex_log_medium_node, /* log */ + &_synctex_display_glue, /* display */ + &_synctex_implementation_0, /* parent */ + NULL, /* No child */ + &_synctex_implementation_1, /* sibling */ + &_synctex_implementation_2, /* friend */ + NULL, /* No next box */ (_synctex_info_getter_t)&_synctex_implementation_3 }; -/* glue node creator */ synctex_node_t _synctex_new_glue(synctex_scanner_t scanner) { synctex_node_t node = _synctex_malloc(sizeof(synctex_medium_node_t)); if(node) { @@ -605,29 +655,29 @@ synctex_node_t _synctex_new_glue(synctex_scanner_t scanner) { return node; } -synctex_node_t _synctex_new_kern(synctex_scanner_t scanner); -void _synctex_display_kern(synctex_node_t node); - -static const _synctex_class_t synctex_class_kern = { - NULL, /* No scanner yet */ - synctex_node_type_kern, /* Node type */ - &_synctex_new_kern, /* creator */ - &_synctex_free_leaf, /* destructor */ - &_synctex_log_medium_node, /* log */ - &_synctex_display_kern, /* display */ - &_synctex_implementation_0, /* parent */ - NULL, /* No child */ - &_synctex_implementation_1, /* sibling */ - &_synctex_implementation_2, /* friend */ - NULL, /* No next box */ +/* boundary node creator */ +synctex_node_t _synctex_new_boundary(synctex_scanner_t scanner); +void _synctex_display_boundary(synctex_node_t node); + +static const _synctex_class_t synctex_class_boundary = { + NULL, /* No scanner yet */ + synctex_node_type_boundary, /* Node type */ + &_synctex_new_boundary, /* creator */ + &_synctex_free_leaf, /* destructor */ + &_synctex_log_small_node, /* log */ + &_synctex_display_boundary, /* display */ + &_synctex_implementation_0, /* parent */ + NULL, /* No child */ + &_synctex_implementation_1, /* sibling */ + &_synctex_implementation_2, /* friend */ + NULL, /* No next box */ (_synctex_info_getter_t)&_synctex_implementation_3 }; -/* kern node creator */ -synctex_node_t _synctex_new_kern(synctex_scanner_t scanner) { - synctex_node_t node = _synctex_malloc(sizeof(synctex_medium_node_t)); +synctex_node_t _synctex_new_boundary(synctex_scanner_t scanner) { + synctex_node_t node = _synctex_malloc(sizeof(synctex_small_node_t)); if(node) { - node->class = scanner?scanner->class+synctex_node_type_kern:(synctex_class_t)&synctex_class_kern; + node->class = scanner?scanner->class+synctex_node_type_boundary:(synctex_class_t)&synctex_class_boundary; } return node; } @@ -639,8 +689,8 @@ synctex_node_t _synctex_new_kern(synctex_scanner_t scanner) { * The synctex information is the SYNCTEX_TAG and SYNCTEX_NAME*/ typedef struct { synctex_class_t class; - synctex_info_t implementation[1+SYNCTEX_NAME_IDX+1]; /* sibling, - * SYNCTEX_TAG,SYNCTEX_NAME */ + synctex_info_t implementation[1+SYNCTEX_NAME_IDX+1]; /* sibling, + * SYNCTEX_TAG,SYNCTEX_NAME */ } synctex_input_t; synctex_node_t _synctex_new_input(synctex_scanner_t scanner); @@ -649,17 +699,17 @@ void _synctex_display_input(synctex_node_t node); void _synctex_log_input(synctex_node_t sheet); static const _synctex_class_t synctex_class_input = { - NULL, /* No scanner yet */ - synctex_node_type_input, /* Node type */ - &_synctex_new_input, /* creator */ - &_synctex_free_input, /* destructor */ - &_synctex_log_input, /* log */ - &_synctex_display_input, /* display */ - NULL, /* No parent */ - NULL, /* No child */ - &_synctex_implementation_0, /* sibling */ - NULL, /* No friend */ - NULL, /* No next box */ + NULL, /* No scanner yet */ + synctex_node_type_input, /* Node type */ + &_synctex_new_input, /* creator */ + &_synctex_free_input, /* destructor */ + &_synctex_log_input, /* log */ + &_synctex_display_input, /* display */ + NULL, /* No parent */ + NULL, /* No child */ + &_synctex_implementation_0, /* sibling */ + NULL, /* No friend */ + NULL, /* No next box */ (_synctex_info_getter_t)&_synctex_implementation_1 }; @@ -690,7 +740,7 @@ synctex_node_t synctex_node_sheet(synctex_node_t node) while(node && node->class->type != synctex_node_type_sheet) { node = SYNCTEX_PARENT(node); } - /* exit the while loop either when node is NULL or node is a sheet */ + /* exit the while loop either when node is NULL or node is a sheet */ return node; } synctex_node_t synctex_node_child(synctex_node_t node) @@ -709,8 +759,8 @@ sibling: if(SYNCTEX_SIBLING(node)) { return SYNCTEX_SIBLING(node); } - if((node = SYNCTEX_PARENT(node)) != NULL) { - if(node->class->type == synctex_node_type_sheet) {/* EXC_BAD_ACCESS? */ + if((node = SYNCTEX_PARENT(node))) { + if(node->class->type == synctex_node_type_sheet) {/* EXC_BAD_ACCESS? */ return NULL; } goto sibling; @@ -733,7 +783,7 @@ synctex_node_type_t synctex_node_type(synctex_node_t node) { /* Public node accessor: the human readable type */ const char * synctex_node_isa(synctex_node_t node) { static const char * isa[synctex_node_number_of_types] = - {"Not a node","sheet","vbox","void vbox","hbox","non void hbox","void hbox","kern","glue","math","input"}; + {"Not a node","input","sheet","vbox","void vbox","hbox","void hbox","kern","glue","math","boundary"}; return isa[synctex_node_type(node)]; } @@ -755,17 +805,38 @@ void synctex_node_display(synctex_node_t node) { SYNCTEX_DISPLAY(node); } +void _synctex_display_input(synctex_node_t node) { + printf("....Input:%i:%s\n", + SYNCTEX_TAG(node), + SYNCTEX_NAME(node)); + SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node)); +} + void _synctex_log_sheet(synctex_node_t sheet) { if(sheet) { printf("%s:%i\n",synctex_node_isa(sheet),SYNCTEX_PAGE(sheet)); - printf("SELF:%p",sheet); - printf(" SYNCTEX_PARENT:%p",SYNCTEX_PARENT(sheet)); - printf(" SYNCTEX_CHILD:%p",SYNCTEX_CHILD(sheet)); - printf(" SYNCTEX_SIBLING:%p",SYNCTEX_SIBLING(sheet)); - printf(" SYNCTEX_FRIEND:%p\n",SYNCTEX_FRIEND(sheet)); + printf("SELF:%p",(void *)sheet); + printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(sheet)); + printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(sheet)); + printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(sheet)); + printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(sheet)); } } +void _synctex_log_small_node(synctex_node_t node) { + printf("%s:%i,%i:%i,%i\n", + synctex_node_isa(node), + SYNCTEX_TAG(node), + SYNCTEX_LINE(node), + SYNCTEX_HORIZ(node), + SYNCTEX_VERT(node)); + printf("SELF:%p",(void *)node); + printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(node)); + printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(node)); + printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node)); + printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(node)); +} + void _synctex_log_medium_node(synctex_node_t node) { printf("%s:%i,%i:%i,%i:%i\n", synctex_node_isa(node), @@ -774,11 +845,11 @@ void _synctex_log_medium_node(synctex_node_t node) { SYNCTEX_HORIZ(node), SYNCTEX_VERT(node), SYNCTEX_WIDTH(node)); - printf("SELF:%p",node); - printf(" SYNCTEX_PARENT:%p",SYNCTEX_PARENT(node)); - printf(" SYNCTEX_CHILD:%p",SYNCTEX_CHILD(node)); - printf(" SYNCTEX_SIBLING:%p",SYNCTEX_SIBLING(node)); - printf(" SYNCTEX_FRIEND:%p\n",SYNCTEX_FRIEND(node)); + printf("SELF:%p",(void *)node); + printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(node)); + printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(node)); + printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node)); + printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(node)); } void _synctex_log_void_box(synctex_node_t node) { @@ -791,11 +862,11 @@ void _synctex_log_void_box(synctex_node_t node) { printf(":%i",SYNCTEX_WIDTH(node)); printf(",%i",SYNCTEX_HEIGHT(node)); printf(",%i",SYNCTEX_DEPTH(node)); - printf("\nSELF:%p",node); - printf(" SYNCTEX_PARENT:%p",SYNCTEX_PARENT(node)); - printf(" SYNCTEX_CHILD:%p",SYNCTEX_CHILD(node)); - printf(" SYNCTEX_SIBLING:%p",SYNCTEX_SIBLING(node)); - printf(" SYNCTEX_FRIEND:%p\n",SYNCTEX_FRIEND(node)); + printf("\nSELF:%p",(void *)node); + printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(node)); + printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(node)); + printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node)); + printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(node)); } void _synctex_log_box(synctex_node_t node) { @@ -808,11 +879,11 @@ void _synctex_log_box(synctex_node_t node) { printf(":%i",SYNCTEX_WIDTH(node)); printf(",%i",SYNCTEX_HEIGHT(node)); printf(",%i",SYNCTEX_DEPTH(node)); - printf("\nSELF:%p",node); - printf(" SYNCTEX_PARENT:%p",SYNCTEX_PARENT(node)); - printf(" SYNCTEX_CHILD:%p",SYNCTEX_CHILD(node)); - printf(" SYNCTEX_SIBLING:%p",SYNCTEX_SIBLING(node)); - printf(" SYNCTEX_FRIEND:%p\n",SYNCTEX_FRIEND(node)); + printf("\nSELF:%p",(void *)node); + printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(node)); + printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(node)); + printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node)); + printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(node)); } void _synctex_log_horiz_box(synctex_node_t node) { @@ -825,23 +896,23 @@ void _synctex_log_horiz_box(synctex_node_t node) { printf(":%i",SYNCTEX_WIDTH(node)); printf(",%i",SYNCTEX_HEIGHT(node)); printf(",%i",SYNCTEX_DEPTH(node)); - printf(":%i",SYNCTEX_HORIZ_V(node)); + printf("/%i",SYNCTEX_HORIZ_V(node)); printf(",%i",SYNCTEX_VERT_V(node)); printf(":%i",SYNCTEX_WIDTH_V(node)); printf(",%i",SYNCTEX_HEIGHT_V(node)); printf(",%i",SYNCTEX_DEPTH_V(node)); - printf("\nSELF:%p",node); - printf(" SYNCTEX_PARENT:%p",SYNCTEX_PARENT(node)); - printf(" SYNCTEX_CHILD:%p",SYNCTEX_CHILD(node)); - printf(" SYNCTEX_SIBLING:%p",SYNCTEX_SIBLING(node)); - printf(" SYNCTEX_FRIEND:%p\n",SYNCTEX_FRIEND(node)); + printf("\nSELF:%p",(void *)node); + printf(" SYNCTEX_PARENT:%p",(void *)SYNCTEX_PARENT(node)); + printf(" SYNCTEX_CHILD:%p",(void *)SYNCTEX_CHILD(node)); + printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node)); + printf(" SYNCTEX_FRIEND:%p\n",(void *)SYNCTEX_FRIEND(node)); } void _synctex_log_input(synctex_node_t node) { printf("%s",synctex_node_isa(node)); printf(":%i",SYNCTEX_TAG(node)); printf(",%s",SYNCTEX_NAME(node)); - printf(" SYNCTEX_SIBLING:%p",SYNCTEX_SIBLING(node)); + printf(" SYNCTEX_SIBLING:%p",(void *)SYNCTEX_SIBLING(node)); } void _synctex_display_sheet(synctex_node_t sheet) { @@ -933,10 +1004,12 @@ void _synctex_display_kern(synctex_node_t node) { SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node)); } -void _synctex_display_input(synctex_node_t node) { - printf("....Input:%i:%s\n", +void _synctex_display_boundary(synctex_node_t node) { + printf("....boundary:%i,%i:%i,%i\n", SYNCTEX_TAG(node), - SYNCTEX_NAME(node)); + SYNCTEX_LINE(node), + SYNCTEX_HORIZ(node), + SYNCTEX_VERT(node)); SYNCTEX_DISPLAY(SYNCTEX_SIBLING(node)); } @@ -968,7 +1041,7 @@ typedef int synctex_status_t; /* Parameter error: */ # define SYNCTEX_STATUS_BAD_ARGUMENT -2 -# define SYNCTEX_FILE scanner->file +# define SYNCTEX_FILE (scanner->file) /* Actually, the minimum buffer size is driven by integer and float parsing. * ¬±0.123456789e123 @@ -976,55 +1049,14 @@ typedef int synctex_status_t; # define SYNCTEX_BUFFER_MIN_SIZE 16 # define SYNCTEX_BUFFER_SIZE 32768 -#include <stdarg.h> - -inline static int _synctex_error(char * reason,...) { - va_list arg; - int result; - result = fprintf(stderr,"SyncTeX ERROR: "); - va_start (arg, reason); - result += vfprintf(stderr, reason, arg); - va_end (arg); - result = fprintf(stderr,"\n"); - return result; -} - # ifdef SYNCTEX_NOTHING # pragma mark - # pragma mark Prototypes # endif -void _synctex_free_node(synctex_node_t node); -void _synctex_free_leaf(synctex_node_t node); -synctex_node_t _synctex_new_sheet(synctex_scanner_t scanner); -synctex_node_t _synctex_new_vbox(synctex_scanner_t scanner); -synctex_node_t _synctex_new_hbox(synctex_scanner_t scanner); -synctex_node_t _synctex_new_void_vbox(synctex_scanner_t scanner); -synctex_node_t _synctex_new_void_hbox(synctex_scanner_t scanner); -synctex_node_t _synctex_new_math(synctex_scanner_t scanner); -synctex_node_t _synctex_new_glue(synctex_scanner_t scanner); -synctex_node_t _synctex_new_kern(synctex_scanner_t scanner); -synctex_node_t _synctex_new_input(synctex_scanner_t scanner); -void _synctex_free_input(synctex_node_t node); -synctex_node_t synctex_node_next(synctex_node_t node); -synctex_node_type_t synctex_node_type(synctex_node_t node); -const char * synctex_node_isa(synctex_node_t node); -void synctex_node_log(synctex_node_t node); -void _synctex_log_sheet(synctex_node_t sheet); -void _synctex_log_medium_node(synctex_node_t node); void _synctex_log_void_box(synctex_node_t node); void _synctex_log_box(synctex_node_t node); void _synctex_log_horiz_box(synctex_node_t node); void _synctex_log_input(synctex_node_t node); -void _synctex_display_sheet(synctex_node_t sheet); -void _synctex_display_vbox(synctex_node_t node); -void _synctex_display_hbox(synctex_node_t node); -void _synctex_display_void_vbox(synctex_node_t node); -void _synctex_display_void_hbox(synctex_node_t node); -void _synctex_display_glue(synctex_node_t node); -void _synctex_display_math(synctex_node_t node); -void _synctex_display_kern(synctex_node_t node); -void _synctex_display_input(synctex_node_t node); -inline static int _synctex_error(char * reason,...); synctex_status_t _synctex_buffer_get_available_size(synctex_scanner_t scanner, size_t * size_ptr); synctex_status_t _synctex_next_line(synctex_scanner_t scanner); synctex_status_t _synctex_match_string(synctex_scanner_t scanner, const char * the_string); @@ -1039,47 +1071,11 @@ synctex_status_t _synctex_setup_visible_box(synctex_node_t box); synctex_status_t _synctex_horiz_box_setup_visible(synctex_node_t node,int h, int v); synctex_status_t _synctex_scan_sheet(synctex_scanner_t scanner, synctex_node_t parent); synctex_status_t _synctex_scan_content(synctex_scanner_t scanner); -void synctex_strip_last_path_extension(char * string); -synctex_scanner_t synctex_scanner_new_with_output_file(const char * output); -synctex_scanner_t synctex_scanner_new_with_contents_of_file(const char * name); -void synctex_scanner_free(synctex_scanner_t scanner); int synctex_scanner_pre_x_offset(synctex_scanner_t scanner); int synctex_scanner_pre_y_offset(synctex_scanner_t scanner); -int synctex_scanner_x_offset(synctex_scanner_t scanner); -int synctex_scanner_y_offset(synctex_scanner_t scanner); -float synctex_scanner_magnification(synctex_scanner_t scanner); -void synctex_scanner_display(synctex_scanner_t scanner); -const char * synctex_scanner_get_name(synctex_scanner_t scanner,int tag); -int synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name); -synctex_node_t synctex_scanner_input(synctex_scanner_t scanner); const char * synctex_scanner_get_output_fmt(synctex_scanner_t scanner); -const char * synctex_scanner_get_output(synctex_scanner_t scanner); -float synctex_node_h(synctex_node_t node); -float synctex_node_v(synctex_node_t node); -float synctex_node_width(synctex_node_t node); -float synctex_node_box_h(synctex_node_t node); -float synctex_node_box_v(synctex_node_t node); -float synctex_node_box_width(synctex_node_t node); -float synctex_node_box_height(synctex_node_t node); -float synctex_node_box_depth(synctex_node_t node); -float synctex_node_visible_h(synctex_node_t node); -float synctex_node_visible_v(synctex_node_t node); -float synctex_node_visible_width(synctex_node_t node); -float synctex_node_box_visible_h(synctex_node_t node); -float synctex_node_box_visible_v(synctex_node_t node); -float synctex_node_box_visible_width(synctex_node_t node); -float synctex_node_box_visible_height(synctex_node_t node); -float synctex_node_box_visible_depth(synctex_node_t node); -int synctex_node_page(synctex_node_t node); -int synctex_node_tag(synctex_node_t node); -int synctex_node_line(synctex_node_t node); -int synctex_node_column(synctex_node_t node); -synctex_node_t synctex_sheet_content(synctex_scanner_t scanner,int page); -int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,int column); int _synctex_node_is_box(synctex_node_t node); -int synctex_edit_query(synctex_scanner_t scanner,int page,float h,float v); -synctex_node_t synctex_next_result(synctex_scanner_t scanner); -int synctex_bail(void); +int _synctex_bail(void); /* Try to ensure that the buffer contains at least size bytes. * Passing a huge size argument means the whole buffer length. @@ -1089,7 +1085,7 @@ int synctex_bail(void); * The value returned in size_ptr is the number of bytes now available in the buffer. * This is a nonnegative integer, it may take the value 0. * It is the responsibility of the caller to test whether this size is conforming to its needs. - * Negative values may returned in case of error, actually + * Negative values may return in case of error, actually * when there was an error reading the synctex file. */ synctex_status_t _synctex_buffer_get_available_size(synctex_scanner_t scanner, size_t * size_ptr) { size_t available = 0; @@ -1100,36 +1096,43 @@ synctex_status_t _synctex_buffer_get_available_size(synctex_scanner_t scanner, s if(size>SYNCTEX_BUFFER_SIZE){ size = SYNCTEX_BUFFER_SIZE; } - available = SYNCTEX_END - SYNCTEX_CUR; /* available is the number of unparsed chars in the buffer */ + available = SYNCTEX_END - SYNCTEX_CUR; /* available is the number of unparsed chars in the buffer */ if(size<=available) { - /* There are already sufficiently many characters in the buffer */ + /* There are already sufficiently many characters in the buffer */ size = available; return SYNCTEX_STATUS_OK; } if(SYNCTEX_FILE) { - /* Copy the remaining part of the buffer to the beginning, - * then read the next part of the file */ - int read = 0; + /* Copy the remaining part of the buffer to the beginning, + * then read the next part of the file */ + int already_read = 0; if(available) { memmove(SYNCTEX_START, SYNCTEX_CUR, available); } - SYNCTEX_CUR = SYNCTEX_START + available; /* the next character after the move, will change. */ - /* Fill the buffer up to its end */ - read = gzread(SYNCTEX_FILE,(void *)SYNCTEX_CUR,SYNCTEX_BUFFER_SIZE - available); - if(read>0) { - /* We assume that 0<read<=SYNCTEX_BUFFER_SIZE - available, such that - * SYNCTEX_CUR + read = SYNCTEX_START + available + read <= SYNCTEX_START + SYNCTEX_BUFFER_SIZE */ - SYNCTEX_END = SYNCTEX_CUR + read; + SYNCTEX_CUR = SYNCTEX_START + available; /* the next character after the move, will change. */ + /* Fill the buffer up to its end */ + already_read = gzread(SYNCTEX_FILE,(void *)SYNCTEX_CUR,SYNCTEX_BUFFER_SIZE - available); + if(already_read>0) { + /* We assume that 0<already_read<=SYNCTEX_BUFFER_SIZE - available, such that + * SYNCTEX_CUR + already_read = SYNCTEX_START + available + already_read <= SYNCTEX_START + SYNCTEX_BUFFER_SIZE */ + SYNCTEX_END = SYNCTEX_CUR + already_read; /* If the end of the file was reached, all the required SYNCTEX_BUFFER_SIZE - available * may not be filled with values from the file. - * In that case, the buffer should stop properly after read characters. */ + * In that case, the buffer should stop properly after already_read characters. */ * SYNCTEX_END = '\0'; SYNCTEX_CUR = SYNCTEX_START; - size = SYNCTEX_END - SYNCTEX_CUR; /* == old available + read*/ - return SYNCTEX_STATUS_OK; /* May be available is less than size, the caller will have to test. */ - } else if(read<0) { - /*There is an error */ - _synctex_error("gzread error (1:%i)",read); + size = SYNCTEX_END - SYNCTEX_CUR; /* == old available + already_read*/ + return SYNCTEX_STATUS_OK; /* May be available is less than size, the caller will have to test. */ + } else if(0>already_read) { + /* There is an error in zlib */ + int errnum = 0; + const char * error_string = gzerror(SYNCTEX_FILE, &errnum); + if(Z_ERRNO == errnum) { + /* There is an error in zlib caused by the file system */ + _synctex_error("gzread error from the file system (%i)",errno); + } else { + _synctex_error("gzread error (%i:%i,%s)",already_read,errnum,error_string); + } return SYNCTEX_STATUS_ERROR; } else { /* Nothing was read, we are at the end of the file. */ @@ -1137,13 +1140,13 @@ synctex_status_t _synctex_buffer_get_available_size(synctex_scanner_t scanner, s SYNCTEX_FILE = NULL; SYNCTEX_END = SYNCTEX_CUR; SYNCTEX_CUR = SYNCTEX_START; - * SYNCTEX_END = '\0';/* Terminate the string properly.*/ + * SYNCTEX_END = '\0';/* Terminate the string properly.*/ size = SYNCTEX_END - SYNCTEX_CUR; - return SYNCTEX_STATUS_EOF; /* there might be a bit of text left */ + return SYNCTEX_STATUS_EOF; /* there might be a bit of text left */ } - /* At this point, the function has already returned from above */ + /* At this point, the function has already returned from above */ } - /* We cannot enlarge the buffer because the end of the file was reached. */ + /* We cannot enlarge the buffer because the end of the file was reached. */ size = available; return SYNCTEX_STATUS_EOF; # undef size @@ -1194,14 +1197,14 @@ infinite_loop: * As side effect, the buffer state may have changed if the given argument string can't fit into the buffer. */ synctex_status_t _synctex_match_string(synctex_scanner_t scanner, const char * the_string) { - size_t tested_len = 0; /* the number of characters at the beginning of the_string that match */ - size_t remaining_len = 0; /* the number of remaining characters of the_string that should match */ + size_t tested_len = 0; /* the number of characters at the beginning of the_string that match */ + size_t remaining_len = 0; /* the number of remaining characters of the_string that should match */ size_t available = 0; synctex_status_t status = 0; if(NULL == scanner || NULL == the_string) { return SYNCTEX_STATUS_BAD_ARGUMENT; } - remaining_len = strlen(the_string); /* All the_string should match */ + remaining_len = strlen(the_string); /* All the_string should match */ if(0 == remaining_len) { return SYNCTEX_STATUS_BAD_ARGUMENT; } @@ -1233,9 +1236,9 @@ return_OK: /* update the remaining length and the parsed length. */ remaining_len -= available; tested_len += available; - SYNCTEX_CUR += available; /* We validate the tested characters. */ + SYNCTEX_CUR += available; /* We validate the tested characters. */ if(0 == remaining_len) { - /* Nothing left to test, we have found the given string, we return the length. */ + /* Nothing left to test, we have found the given string, we return the length. */ return tested_len; } /* We also have to record the current state of the file cursor because @@ -1246,7 +1249,7 @@ return_OK: * can be safely discarded. */ offset = gztell(SYNCTEX_FILE); /* offset now corresponds to the first character of the file that was not buffered. */ - available = SYNCTEX_CUR - SYNCTEX_START; /* available can be used as temporary placeholder. */ + available = SYNCTEX_CUR - SYNCTEX_START; /* available can be used as temporary placeholder. */ /* available now corresponds to the number of chars that where already buffered and * that match the head of the_string. If in fine the_string does not match, all these chars must be recovered * because the buffer contents is completely replaced by _synctex_buffer_get_available_size. @@ -1260,14 +1263,14 @@ more_characters: available = remaining_len; status = _synctex_buffer_get_available_size(scanner,&available); if(status<SYNCTEX_STATUS_EOF) { - return status; /* This is an error, no need to go further. */ + return status; /* This is an error, no need to go further. */ } if(available==0) { - /* Missing characters: recover the initial state of the file and return. */ + /* Missing characters: recover the initial state of the file and return. */ return_NOT_OK: if(offset != gzseek(SYNCTEX_FILE,offset,SEEK_SET)) { /* This is a critical error, we could not recover the previous state. */ - fprintf(stderr,"SyncTeX critical ERROR: can't seek file\n"); + _synctex_error("can't seek file"); return SYNCTEX_STATUS_ERROR; } /* Next time we are asked to fill the buffer, @@ -1278,7 +1281,7 @@ return_NOT_OK: if(available<remaining_len) { /* We'll have to loop one more time. */ if(strncmp((char *)SYNCTEX_CUR,the_string,available)) { - /* This is not the expected string, recover the previous state and return. */ + /* This is not the expected string, recover the previous state and return. */ goto return_NOT_OK; } /* Advance the_string to the first untested character. */ @@ -1286,21 +1289,21 @@ return_NOT_OK: /* update the remaining length and the parsed length. */ remaining_len -= available; tested_len += available; - SYNCTEX_CUR += available; /* We validate the tested characters. */ + SYNCTEX_CUR += available; /* We validate the tested characters. */ if(0 == remaining_len) { - /* Nothing left to test, we have found the given string. */ + /* Nothing left to test, we have found the given string. */ return SYNCTEX_STATUS_OK; } goto more_characters; } /* This is the last step. */ if(strncmp((char *)SYNCTEX_CUR,the_string,remaining_len)) { - /* This is not the expected string, recover the previous state and return. */ + /* This is not the expected string, recover the previous state and return. */ goto return_NOT_OK; } goto return_OK; } else { - /* The buffer can't contain the given string argument, and the EOF was reached */ + /* The buffer can't contain the given string argument, and the EOF was reached */ return SYNCTEX_STATUS_EOF; } } @@ -1327,17 +1330,17 @@ synctex_status_t _synctex_decode_int(synctex_scanner_t scanner, int* value_ref) available = SYNCTEX_BUFFER_MIN_SIZE; status = _synctex_buffer_get_available_size(scanner, &available); if(status<SYNCTEX_STATUS_EOF) { - return status;/* Forward error. */ + return status;/* Forward error. */ } if(available==0) { - return SYNCTEX_STATUS_EOF;/* it is the end of file. */ + return SYNCTEX_STATUS_EOF;/* it is the end of file. */ } ptr = SYNCTEX_CUR; if(*ptr==':' || *ptr==',') { ++ptr; --available; if(available==0) { - return SYNCTEX_STATUS_NOT_OK;/* It is not possible to scan an int */ + return SYNCTEX_STATUS_NOT_OK;/* It is not possible to scan an int */ } } result = (int)strtol((char *)ptr, (char **)&end, 10); @@ -1346,9 +1349,9 @@ synctex_status_t _synctex_decode_int(synctex_scanner_t scanner, int* value_ref) if(value_ref) { * value_ref = result; } - return SYNCTEX_STATUS_OK;/* Successfully scanned an int */ + return SYNCTEX_STATUS_OK;/* Successfully scanned an int */ } - return SYNCTEX_STATUS_NOT_OK;/* Could not scan an int */ + return SYNCTEX_STATUS_NOT_OK;/* Could not scan an int */ } /* The purpose of this function is to read a string. @@ -1372,13 +1375,13 @@ synctex_status_t _synctex_decode_string(synctex_scanner_t scanner, char ** value unsigned char * end = NULL; size_t current_size = 0; size_t new_size = 0; - size_t len = 0;/* The number of bytes to copy */ + size_t len = 0;/* The number of bytes to copy */ size_t available = 0; synctex_status_t status = 0; if(NULL == scanner || NULL == value_ref) { return SYNCTEX_STATUS_BAD_ARGUMENT; } - /* The buffer must at least contain one character: the '\n' end of line marker */ + /* The buffer must at least contain one character: the '\n' end of line marker */ if(SYNCTEX_CUR>=SYNCTEX_END) { available = 1; status = _synctex_buffer_get_available_size(scanner,&available); @@ -1389,16 +1392,16 @@ synctex_status_t _synctex_decode_string(synctex_scanner_t scanner, char ** value return SYNCTEX_STATUS_EOF; } } - /* Now we are sure that there is at least one available character, either because - * SYNCTEX_CUR was already < SYNCTEX_END, or because the buffer has been properly filled. */ - /* end will point to the next unparsed '\n' character in the file, when mapped to the buffer. */ + /* Now we are sure that there is at least one available character, either because + * SYNCTEX_CUR was already < SYNCTEX_END, or because the buffer has been properly filled. */ + /* end will point to the next unparsed '\n' character in the file, when mapped to the buffer. */ end = SYNCTEX_CUR; - * value_ref = NULL;/* Initialize, it will be realloc'ed */ - /* We scan all the characters up to the next '\n' */ + * value_ref = NULL;/* Initialize, it will be realloc'ed */ + /* We scan all the characters up to the next '\n' */ next_character: if(end<SYNCTEX_END) { if(*end == '\n') { - /* OK, we found where to stop */ + /* OK, we found where to stop */ len = end - SYNCTEX_CUR; if(current_size>UINT_MAX-len-1) { /* But we have reached the limit: we do not have current_size+len+1>UINT_MAX. @@ -1412,8 +1415,8 @@ next_character: * where we have assumed that len<UINT_MAX */ if((* value_ref = realloc(* value_ref,new_size+1)) != NULL) { if(memcpy((*value_ref)+current_size,SYNCTEX_CUR,len)) { - (* value_ref)[new_size]='\0'; /* Terminate the string */ - SYNCTEX_CUR += len;/* Advance to the terminating '\n' */ + (* value_ref)[new_size]='\0'; /* Terminate the string */ + SYNCTEX_CUR += len;/* Advance to the terminating '\n' */ return SYNCTEX_STATUS_OK; } free(* value_ref); @@ -1428,7 +1431,7 @@ next_character: goto next_character; } } else { - /* end == SYNCTEX_END */ + /* end == SYNCTEX_END */ len = SYNCTEX_END - SYNCTEX_CUR; if(current_size>UINT_MAX-len-1) { /* We have reached the limit. */ @@ -1438,8 +1441,8 @@ next_character: new_size = current_size+len; if((* value_ref = realloc(* value_ref,new_size+1)) != NULL) { if(memcpy((*value_ref)+current_size,SYNCTEX_CUR,len)) { - (* value_ref)[new_size]='\0'; /* Terminate the string */ - SYNCTEX_CUR = SYNCTEX_END;/* Advance the cursor to the end of the bufer */ + (* value_ref)[new_size]='\0'; /* Terminate the string */ + SYNCTEX_CUR = SYNCTEX_END;/* Advance the cursor to the end of the bufer */ return SYNCTEX_STATUS_OK; } free(* value_ref); @@ -1447,7 +1450,7 @@ next_character: _synctex_error("could not copy memory (2)."); return SYNCTEX_STATUS_ERROR; } - /* Huge memory problem */ + /* Huge memory problem */ _synctex_error("could not allocate memory (2)."); return SYNCTEX_STATUS_ERROR; } @@ -1501,7 +1504,7 @@ synctex_status_t _synctex_scan_input(synctex_scanner_t scanner) { /* Prepend this input node to the input linked list of the scanner */ SYNCTEX_SET_SIBLING(input,scanner->input); scanner->input = input; - return _synctex_next_line(scanner);/* read the line termination character, if any */ + return _synctex_next_line(scanner);/* read the line termination character, if any */ /* Now, set up the path */ } @@ -1533,7 +1536,7 @@ not_found: } goto not_found; } - /* A line is found, scan the value */ + /* A line is found, scan the value */ return (*decoder)(scanner,value_ref); } @@ -1705,19 +1708,19 @@ post_scriptum_not_found: if(status<SYNCTEX_STATUS_EOF) { return status; } else if(status<SYNCTEX_STATUS_OK) { - return SYNCTEX_STATUS_OK;/* The EOF is found, we have properly scanned the file */ + return SYNCTEX_STATUS_OK;/* The EOF is found, we have properly scanned the file */ } goto post_scriptum_not_found; } - /* We found the name, advance to the next line. */ + /* We found the name, advance to the next line. */ next_line: status = _synctex_next_line(scanner); if(status<SYNCTEX_STATUS_EOF) { return status; } else if(status<SYNCTEX_STATUS_OK) { - return SYNCTEX_STATUS_OK;/* The EOF is found, we have properly scanned the file */ + return SYNCTEX_STATUS_OK;/* The EOF is found, we have properly scanned the file */ } - /* Scanning the information */ + /* Scanning the information */ status = _synctex_match_string(scanner,"Magnification:"); if(status == SYNCTEX_STATUS_OK ) { #ifdef HAVE_SETLOCALE @@ -1741,7 +1744,7 @@ next_line: if(status<SYNCTEX_STATUS_EOF){ report_record_problem: _synctex_error("Problem reading the Post Scriptum records"); - return status; /* echo the error. */ + return status; /* echo the error. */ } status = _synctex_match_string(scanner,"X Offset:"); if(status == SYNCTEX_STATUS_OK) { @@ -1789,9 +1792,9 @@ count_again: } status = _synctex_scan_named(scanner,"Count:",&(scanner->count),(synctex_decoder_t)&_synctex_decode_int); if(status < SYNCTEX_STATUS_EOF) { - return status; /* forward the error */ - } else if(status < SYNCTEX_STATUS_OK) { /* No Count record found */ - status = _synctex_next_line(scanner); /* Advance one more line */ + return status; /* forward the error */ + } else if(status < SYNCTEX_STATUS_OK) { /* No Count record found */ + status = _synctex_next_line(scanner); /* Advance one more line */ if(status<SYNCTEX_STATUS_OK) { return status; } @@ -1807,21 +1810,21 @@ count_again: * At creation time, the visible size is set to the values of the real size. */ synctex_status_t _synctex_setup_visible_box(synctex_node_t box) { - if(NULL == box - || (box->class->type != synctex_node_type_hbox - && box->class->type != synctex_node_type_hbox_non_void - && box->class->type != synctex_node_type_vbox)) { - return SYNCTEX_STATUS_BAD_ARGUMENT; - } - if(SYNCTEX_INFO(box) != NULL) { - SYNCTEX_HORIZ_V(box) = SYNCTEX_HORIZ(box); - SYNCTEX_VERT_V(box) = SYNCTEX_VERT(box); - SYNCTEX_WIDTH_V(box) = SYNCTEX_WIDTH(box); - SYNCTEX_HEIGHT_V(box) = SYNCTEX_HEIGHT(box); - SYNCTEX_DEPTH_V(box) = SYNCTEX_DEPTH(box); - return SYNCTEX_STATUS_OK; + if(box) { + switch(box->class->type) { + case synctex_node_type_hbox: + if(SYNCTEX_INFO(box) != NULL) { + SYNCTEX_HORIZ_V(box) = SYNCTEX_HORIZ(box); + SYNCTEX_VERT_V(box) = SYNCTEX_VERT(box); + SYNCTEX_WIDTH_V(box) = SYNCTEX_WIDTH(box); + SYNCTEX_HEIGHT_V(box) = SYNCTEX_HEIGHT(box); + SYNCTEX_DEPTH_V(box) = SYNCTEX_DEPTH(box); + return SYNCTEX_STATUS_OK; + } + return SYNCTEX_STATUS_ERROR; + } } - return SYNCTEX_STATUS_ERROR; + return SYNCTEX_STATUS_BAD_ARGUMENT; } /* This method is sent to an horizontal box to setup the visible size @@ -1833,40 +1836,31 @@ synctex_status_t _synctex_horiz_box_setup_visible(synctex_node_t node,int h, int # pragma unused(v) # endif int itsBtm, itsTop; - if(NULL == node || (node->class->type != synctex_node_type_hbox - && node->class->type != synctex_node_type_hbox_non_void)) { + if(NULL == node || node->class->type != synctex_node_type_hbox) { return SYNCTEX_STATUS_BAD_ARGUMENT; } if(SYNCTEX_WIDTH_V(node)<0) { - itsBtm = SYNCTEX_HORIZ_V(node)+SYNCTEX_WIDTH_V(node); - itsTop = SYNCTEX_HORIZ_V(node); + itsBtm = SYNCTEX_HORIZ_V(node); + itsTop = SYNCTEX_HORIZ_V(node)-SYNCTEX_WIDTH_V(node); if(h<itsBtm) { - itsBtm -= h; - SYNCTEX_WIDTH_V(node) -= itsBtm; - } - if(h>itsTop) { - h -= itsTop; - SYNCTEX_WIDTH_V(node) -= h; - SYNCTEX_HORIZ_V(node) += h; + SYNCTEX_HORIZ_V(node) = h; + SYNCTEX_WIDTH_V(node) = SYNCTEX_HORIZ_V(node) - itsTop; + } else if(h>itsTop) { + SYNCTEX_WIDTH_V(node) = SYNCTEX_HORIZ_V(node) - h; } } else { itsBtm = SYNCTEX_HORIZ_V(node); itsTop = SYNCTEX_HORIZ_V(node)+SYNCTEX_WIDTH_V(node); if(h<itsBtm) { - itsBtm -= h; - SYNCTEX_HORIZ_V(node) -= itsBtm; - SYNCTEX_WIDTH_V(node) += itsBtm; - } - if(h>itsTop) { - h -= itsTop; - SYNCTEX_WIDTH_V(node) += h; + SYNCTEX_HORIZ_V(node) = h; + SYNCTEX_WIDTH_V(node) = itsTop - SYNCTEX_HORIZ_V(node); + } else if(h>itsTop) { + SYNCTEX_WIDTH_V(node) = h - SYNCTEX_HORIZ_V(node); } } return SYNCTEX_STATUS_OK; } -int synctex_bail(void); - /* Used when parsing the synctex file. * The sheet argument is a newly created sheet node that will hold the contents. * Something is returned in case of error. @@ -1878,13 +1872,12 @@ synctex_status_t _synctex_scan_sheet(synctex_scanner_t scanner, synctex_node_t s synctex_node_t box = sheet; int friend_index = 0; synctex_info_t * info = NULL; - int curh, curv; synctex_status_t status = 0; size_t available = 0; if((NULL == scanner) || (NULL == sheet)) { return SYNCTEX_STATUS_BAD_ARGUMENT; } - /* We MUST start with a box, so at this level, the unique possibility is '[', '(' or "}". */ + /* We MUST start with a box, so at this level, the unique possibility is '[', '(' or "}". */ prepare_loop: if(SYNCTEX_CUR<SYNCTEX_END) { if(*SYNCTEX_CUR == '[') { @@ -1900,7 +1893,7 @@ scan_vbox: || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad vbox record."); #define SYNCTEX_RETURN(STATUS) return STATUS; SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -1908,7 +1901,7 @@ scan_vbox: SYNCTEX_SET_CHILD(parent,child); parent = child; child = NULL; - goto vertical_loop; + goto child_loop;/* next created node will be a child */ } else { _synctex_error("Can't create vbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -1925,14 +1918,16 @@ scan_hbox: || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX) || _synctex_setup_visible_box(child)<SYNCTEX_STATUS_OK - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad hbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)+SYNCTEX_ABS_WIDTH(child),SYNCTEX_VERT(child)); SYNCTEX_SET_CHILD(parent,child); parent = child; child = NULL; - goto vertical_loop; + goto child_loop;/* next created node will be a child */ } else { _synctex_error("Can't create hbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -1941,7 +1936,7 @@ scan_hbox: scan_teehs: ++SYNCTEX_CUR; if(NULL == parent || parent->class->type != synctex_node_type_sheet - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Unexpected end of sheet."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } @@ -1955,7 +1950,7 @@ scan_anchor: } goto prepare_loop; } else { - /* _synctex_error("Ignored record %c\n",*SYNCTEX_CUR); */ + /* _synctex_error("Ignored record %c\n",*SYNCTEX_CUR); */ ++SYNCTEX_CUR; if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Unexpected end."); @@ -1973,12 +1968,15 @@ scan_anchor: goto prepare_loop; } } - synctex_bail(); -vertical_loop: + _synctex_bail(); +/* The child loop means that we go do one level, when we just created a box node, + * the next node created is a child of this box. */ +child_loop: if(SYNCTEX_CUR<SYNCTEX_END) { if(*SYNCTEX_CUR == '[') { goto scan_vbox; } else if(*SYNCTEX_CUR == ']') { +scan_xobv: ++SYNCTEX_CUR; if(NULL != parent && parent->class->type == synctex_node_type_vbox) { #define SYNCTEX_UPDATE_BOX_FRIEND(NODE)\ @@ -1986,7 +1984,7 @@ vertical_loop: SYNCTEX_SET_FRIEND(NODE,(scanner->lists_of_friends)[friend_index]);\ (scanner->lists_of_friends)[friend_index] = NODE; if(NULL == SYNCTEX_CHILD(parent)) { - /* only void boxes are friends */ + /* only void boxes are friends */ SYNCTEX_UPDATE_BOX_FRIEND(parent); } child = parent; @@ -1998,20 +1996,21 @@ vertical_loop: _synctex_error("Uncomplete sheet."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - goto horizontal_loop; + goto sibling_loop; } else if(*SYNCTEX_CUR == '(') { goto scan_hbox; } else if(*SYNCTEX_CUR == ')') { +scan_xobh: ++SYNCTEX_CUR; - if(NULL != parent && (parent->class->type == synctex_node_type_hbox - || parent->class->type == synctex_node_type_hbox_non_void)) { + if((parent) && parent->class->type == synctex_node_type_hbox) { if(NULL == child) { + /* Only boxes with no children are friends, + * boxes with children are indirectly friends through one of their descendants. */ SYNCTEX_UPDATE_BOX_FRIEND(parent); } - if(parent->class->type == synctex_node_type_hbox_non_void) { - SYNCTEX_SET_NEXT_BOX(box,parent); - box = parent; - } + /* setting the next horizontal box at the end ensures that a child is recorded before any of its ancestors. */ + SYNCTEX_SET_NEXT_HORIZ_BOX(box,parent); + box = parent; child = parent; parent = SYNCTEX_PARENT(child); } else { @@ -2021,7 +2020,7 @@ vertical_loop: _synctex_error("Uncomplete sheet."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - goto horizontal_loop; + goto sibling_loop; } else if(*SYNCTEX_CUR == 'v') { ++SYNCTEX_CUR; if(NULL != (child = _synctex_new_void_vbox(scanner)) @@ -2033,7 +2032,7 @@ vertical_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad void vbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } @@ -2043,7 +2042,7 @@ vertical_loop: SYNCTEX_SET_FRIEND(NODE,(scanner->lists_of_friends)[friend_index]);\ (scanner->lists_of_friends)[friend_index] = NODE; SYNCTEX_UPDATE_FRIEND(child); - goto horizontal_loop; + goto sibling_loop; } else { _synctex_error("Can't create vbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -2059,15 +2058,15 @@ vertical_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad void hbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_CHILD(parent,child); SYNCTEX_UPDATE_FRIEND(child); - _synctex_horiz_box_setup_visible(parent,synctex_node_h(child),synctex_node_v(child)); - _synctex_horiz_box_setup_visible(parent,synctex_node_h(child)+synctex_node_width(child),synctex_node_v(child)); - goto horizontal_loop; + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)+SYNCTEX_ABS_WIDTH(child),SYNCTEX_VERT(child)); + goto sibling_loop; } else { _synctex_error("Can't create void hbox record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -2081,40 +2080,19 @@ vertical_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad kern record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_CHILD(parent,child); - _synctex_horiz_box_setup_visible(parent,synctex_node_h(child),synctex_node_v(child)); - #define SYNCTEX_HBOX_SET_NON_VOID(NODE)\ - if(NODE->class->type == synctex_node_type_hbox) {\ - NODE->class->type = synctex_node_type_hbox_non_void;\ - } - SYNCTEX_HBOX_SET_NON_VOID(parent); SYNCTEX_UPDATE_FRIEND(child); - if(NULL == parent) { - _synctex_error("Missing parent for Child"); - synctex_node_log(child); - SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); - } - goto horizontal_loop; + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)-SYNCTEX_WIDTH(child),SYNCTEX_VERT(child)); + goto sibling_loop; } else { _synctex_error("Can't create kern record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == 'x') { - ++SYNCTEX_CUR; - if(_synctex_decode_int(scanner,NULL)<SYNCTEX_STATUS_OK - || _synctex_decode_int(scanner,NULL)<SYNCTEX_STATUS_OK - || _synctex_decode_int(scanner,&curh)<SYNCTEX_STATUS_OK - || _synctex_decode_int(scanner,&curv)<SYNCTEX_STATUS_OK - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { - _synctex_error("Bad x record."); - SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); - } - _synctex_horiz_box_setup_visible(parent,curh,curv); - goto vertical_loop; } else if(*SYNCTEX_CUR == 'g') { ++SYNCTEX_CUR; if(NULL != (child = _synctex_new_glue(scanner)) @@ -2123,15 +2101,14 @@ vertical_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad glue record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_CHILD(parent,child); - SYNCTEX_HBOX_SET_NON_VOID(parent); - _synctex_horiz_box_setup_visible(parent,synctex_node_h(child),synctex_node_v(child)); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); SYNCTEX_UPDATE_FRIEND(child); - goto horizontal_loop; + goto sibling_loop; } else { _synctex_error("Can't create glue record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -2144,15 +2121,34 @@ vertical_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad math record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_CHILD(parent,child); - SYNCTEX_HBOX_SET_NON_VOID(parent); - _synctex_horiz_box_setup_visible(parent,synctex_node_h(child),synctex_node_v(child)); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); SYNCTEX_UPDATE_FRIEND(child); - goto horizontal_loop; + goto sibling_loop; + } else { + _synctex_error("Can't create math record."); + SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); + } + } else if(*SYNCTEX_CUR == 'x') { + ++SYNCTEX_CUR; + if(NULL != (child = _synctex_new_boundary(scanner)) + && NULL != (info = SYNCTEX_INFO(child))) { + if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) + || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) + || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + _synctex_error("Bad boundary record."); + SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); + } + SYNCTEX_SET_CHILD(parent,child); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); + SYNCTEX_UPDATE_FRIEND(child); + goto sibling_loop; } else { _synctex_error("Can't create math record."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -2162,13 +2158,13 @@ vertical_loop: } else if(*SYNCTEX_CUR == '!') { goto scan_anchor; } else { - /* _synctex_error("Ignored record %c\n",*SYNCTEX_CUR); */ + /* _synctex_error("Ignored record %c\n",*SYNCTEX_CUR); */ ++SYNCTEX_CUR; if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Unexpected end."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - goto vertical_loop; + goto child_loop; } } else { available = 1; @@ -2177,11 +2173,13 @@ vertical_loop: _synctex_error("Uncomplete sheet(0)"); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } else { - goto vertical_loop; + goto child_loop; } } - synctex_bail(); -horizontal_loop: + _synctex_bail(); +/* The vertical loop means that we are on the same level, for example when we just ended a box. + * If a node is created now, it will be a sibling of the current node, sharing the same parent. */ +sibling_loop: if(SYNCTEX_CUR<SYNCTEX_END) { if(*SYNCTEX_CUR == '[') { ++SYNCTEX_CUR; @@ -2194,34 +2192,20 @@ horizontal_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad vbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_SIBLING(child,sibling); parent = sibling; child = NULL; - goto vertical_loop; + goto child_loop; } else { _synctex_error("Can't create vbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } } else if(*SYNCTEX_CUR == ']') { - ++SYNCTEX_CUR; - if(NULL != parent && parent->class->type == synctex_node_type_vbox) { - if(NULL == child) { - SYNCTEX_UPDATE_BOX_FRIEND(parent); - } - child = parent; - parent = SYNCTEX_PARENT(child); - } else { - _synctex_error("Unexpected end of vbox record (2), ignored."); - } - if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { - _synctex_error("Unexpected end of file (2)."); - SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); - } - goto horizontal_loop; + goto scan_xobv; } else if(*SYNCTEX_CUR == '(') { ++SYNCTEX_CUR; if(NULL != (sibling = _synctex_new_hbox(scanner)) && @@ -2234,39 +2218,23 @@ horizontal_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX) || _synctex_setup_visible_box(sibling)<SYNCTEX_STATUS_OK - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad hbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_SIBLING(child,sibling); - parent = sibling; + child = sibling; + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)+SYNCTEX_ABS_WIDTH(child),SYNCTEX_VERT(child)); + parent = child; child = NULL; - goto vertical_loop; + goto child_loop; } else { _synctex_error("Can't create hbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } } else if(*SYNCTEX_CUR == ')') { - ++SYNCTEX_CUR; - if(NULL != parent &&(parent->class->type == synctex_node_type_hbox - ||parent->class->type == synctex_node_type_hbox_non_void)) { - if(NULL == child) { - SYNCTEX_UPDATE_BOX_FRIEND(parent); - } - if(parent->class->type == synctex_node_type_hbox_non_void) { - SYNCTEX_SET_NEXT_BOX(box,parent); - box = parent; - } - child = parent; - parent = SYNCTEX_PARENT(child); - } else { - _synctex_error("Unexpected end of hbox record (2)."); - } - if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { - _synctex_error("Unexpected end of file (2,')')."); - SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); - } - goto horizontal_loop; + goto scan_xobh; } else if(*SYNCTEX_CUR == 'v') { ++SYNCTEX_CUR; if(NULL != (sibling = _synctex_new_void_vbox(scanner)) && @@ -2278,14 +2246,14 @@ horizontal_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad void vbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_SIBLING(child,sibling); - SYNCTEX_UPDATE_FRIEND(sibling); child = sibling; - goto horizontal_loop; + SYNCTEX_UPDATE_FRIEND(child); + goto sibling_loop; } else { _synctex_error("can't create void vbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -2301,32 +2269,20 @@ horizontal_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HEIGHT_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_DEPTH_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad void hbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_SIBLING(child,sibling); - SYNCTEX_UPDATE_FRIEND(sibling); child = sibling; - _synctex_horiz_box_setup_visible(parent,synctex_node_h(child),synctex_node_v(child)); - _synctex_horiz_box_setup_visible(parent,synctex_node_h(child)+synctex_node_width(child),synctex_node_v(child)); - goto horizontal_loop; + SYNCTEX_UPDATE_FRIEND(child); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)+SYNCTEX_ABS_WIDTH(child),SYNCTEX_VERT(child)); + goto sibling_loop; } else { _synctex_error("can't create void hbox record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - } else if(*SYNCTEX_CUR == 'x') { - ++SYNCTEX_CUR; - if(_synctex_decode_int(scanner,NULL)<SYNCTEX_STATUS_OK - || _synctex_decode_int(scanner,NULL)<SYNCTEX_STATUS_OK - || _synctex_decode_int(scanner,&curh)<SYNCTEX_STATUS_OK - || _synctex_decode_int(scanner,&curv)<SYNCTEX_STATUS_OK - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { - _synctex_error("Bad x record (2)."); - SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); - } - _synctex_horiz_box_setup_visible(parent,curh,curv); - goto horizontal_loop; } else if(*SYNCTEX_CUR == 'k') { ++SYNCTEX_CUR; if(NULL != (sibling = _synctex_new_kern(scanner)) @@ -2336,16 +2292,16 @@ horizontal_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_WIDTH_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad kern record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_SIBLING(child,sibling); - SYNCTEX_UPDATE_FRIEND(sibling); child = sibling; - _synctex_horiz_box_setup_visible(parent,synctex_node_h(child),synctex_node_v(child)); - SYNCTEX_HBOX_SET_NON_VOID(parent); - goto horizontal_loop; + SYNCTEX_UPDATE_FRIEND(child); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child)-SYNCTEX_WIDTH(child),SYNCTEX_VERT(child)); + goto sibling_loop; } else { _synctex_error("Can't create kern record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -2358,16 +2314,15 @@ horizontal_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad glue record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_SIBLING(child,sibling); - SYNCTEX_UPDATE_FRIEND(sibling); child = sibling; - _synctex_horiz_box_setup_visible(parent,synctex_node_h(child),synctex_node_v(child)); - SYNCTEX_HBOX_SET_NON_VOID(parent); - goto horizontal_loop; + SYNCTEX_UPDATE_FRIEND(child); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); + goto sibling_loop; } else { _synctex_error("Can't create glue record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -2380,20 +2335,40 @@ horizontal_loop: || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) - || (_synctex_next_line(scanner)<SYNCTEX_STATUS_OK)) { + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { _synctex_error("Bad math record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } SYNCTEX_SET_SIBLING(child,sibling); - _synctex_horiz_box_setup_visible(parent,synctex_node_h(sibling),synctex_node_v(sibling)); - SYNCTEX_UPDATE_FRIEND(sibling); child = sibling; - SYNCTEX_HBOX_SET_NON_VOID(parent); - goto horizontal_loop; + SYNCTEX_UPDATE_FRIEND(child); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); + goto sibling_loop; } else { _synctex_error("Can't create math record (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } + } else if(*SYNCTEX_CUR == 'x') { + ++SYNCTEX_CUR; + if(NULL != (sibling = _synctex_new_boundary(scanner)) + && NULL != (info = SYNCTEX_INFO(sibling))) { + if(SYNCTEX_DECODE_FAILED(SYNCTEX_TAG_IDX) + || SYNCTEX_DECODE_FAILED(SYNCTEX_LINE_IDX) + || SYNCTEX_DECODE_FAILED(SYNCTEX_HORIZ_IDX) + || SYNCTEX_DECODE_FAILED(SYNCTEX_VERT_IDX) + || _synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { + _synctex_error("Bad boundary record (2)."); + SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); + } + SYNCTEX_SET_SIBLING(child,sibling); + child = sibling; + SYNCTEX_UPDATE_FRIEND(child); + _synctex_horiz_box_setup_visible(parent,SYNCTEX_HORIZ(child),SYNCTEX_VERT(child)); + goto sibling_loop; + } else { + _synctex_error("Can't create boundary record (2)."); + SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); + } } else if(*SYNCTEX_CUR == '}') { goto scan_teehs; } else if(*SYNCTEX_CUR == '!') { @@ -2402,20 +2377,20 @@ horizontal_loop: _synctex_error("Missing anchor (2)."); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - goto horizontal_loop; + goto sibling_loop; } else { ++SYNCTEX_CUR; /* _synctex_error("Ignored record %c(2)\n",*SYNCTEX_CUR); */ if(_synctex_next_line(scanner)<SYNCTEX_STATUS_OK) { SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); } - goto horizontal_loop; + goto sibling_loop; } } else { available = 1; status = _synctex_buffer_get_available_size(scanner,&available); if(status<SYNCTEX_STATUS_OK && available>0){ - goto horizontal_loop; + goto sibling_loop; } else { _synctex_error("Uncomplete sheet(2)"); SYNCTEX_RETURN(SYNCTEX_STATUS_ERROR); @@ -2432,7 +2407,7 @@ synctex_status_t _synctex_scan_content(synctex_scanner_t scanner) { if(NULL == scanner) { return SYNCTEX_STATUS_BAD_ARGUMENT; } - /* set up the lists of friends */ + /* set up the lists of friends */ if(NULL == scanner->lists_of_friends) { scanner->number_of_lists = 1024; scanner->lists_of_friends = (synctex_node_t *)_synctex_malloc(scanner->number_of_lists*sizeof(synctex_node_t)); @@ -2441,7 +2416,7 @@ synctex_status_t _synctex_scan_content(synctex_scanner_t scanner) { return SYNCTEX_STATUS_ERROR; } } - /* Find where this section starts */ + /* Find where this section starts */ content_not_found: status = _synctex_match_string(scanner,"Content:"); if(status<SYNCTEX_STATUS_EOF) { @@ -2472,7 +2447,7 @@ next_sheet: return SYNCTEX_STATUS_OK; } ++SYNCTEX_CUR; - /* Create a new sheet node */ + /* Create a new sheet node */ sheet = _synctex_new_sheet(scanner); status = _synctex_decode_int(scanner,&(SYNCTEX_PAGE(sheet))); if(status<SYNCTEX_STATUS_OK) { @@ -2494,7 +2469,7 @@ bail: SYNCTEX_SET_SIBLING(sheet,scanner->sheet); scanner->sheet = sheet; sheet = NULL; - /* Now read the list of Inputs between 2 sheets. */ + /* Now read the list of Inputs between 2 sheets. */ do { status = _synctex_scan_input(scanner); if(status<SYNCTEX_STATUS_EOF) { @@ -2506,119 +2481,251 @@ bail: goto next_sheet; } -/* These are the possible extensions of the synctex file */ -static const char * synctex_suffix = ".synctex"; -static const char * synctex_suffix_gz = ".gz"; - -/* strip the last extension of the given string */ -void synctex_strip_last_path_extension(char * string) { - if(NULL != string){ - char * last_component = NULL; - char * last_extension = NULL; - char * next = NULL; - /* first we find the last path component */ - if(NULL == (last_component = strstr(string,"/"))){ - last_component = string; - } else { - ++last_component; - while(NULL != (next = strstr(last_component,"/"))){ - last_component = next+1; - } - } - /* then we find the last path extension */ - if(NULL != (last_extension = strstr(last_component,"."))){ - ++last_extension; - while(NULL != (next = strstr(last_extension,"."))){ - last_extension = next+1; - } - --last_extension;/* back to the "."*/ - if(last_extension>last_component){/* filter out paths like ....my/dir/.hidden"*/ - last_extension[0] = '\0'; - } - } - } -} - -synctex_scanner_t synctex_scanner_new_with_contents_of_file(const char * name); - -/* Where the synctex scanner is created. - * output is the full or relative path of the uncompressed or compressed synctex file. - * On error, NULL is returned. - * This can be due to allocation error, or an internal inconsistency (bad SYNCTEX_BUFFER_SIZE). */ -synctex_scanner_t synctex_scanner_new_with_output_file(const char * output) { - synctex_scanner_t scanner = NULL; +/* Where the synctex scanner is created. */ +synctex_scanner_t synctex_scanner_new_with_output_file(const char * output, const char * build_directory, int parse) { + gzFile file = NULL; char * synctex = NULL; - size_t size = 0; + synctex_scanner_t scanner = NULL; + synctex_io_mode_t io_mode = synctex_io_mode_read; /* Here we assume that int are smaller than void * */ if(sizeof(int)>sizeof(void*)) { - fputs("SyncTeX INTERNAL INCONSISTENCY: int's are unexpectedly bigger than pointers, bailing out.",stderr); + _synctex_error("INTERNAL INCONSISTENCY: int's are unexpectedly bigger than pointers, bailing out."); return NULL; } - /* now create the synctex file name */ - size = strlen(output)+strlen(synctex_suffix)+strlen(synctex_suffix_gz)+1; - synctex = (char *)malloc(size); - if(NULL == synctex) { - fprintf(stderr,"! synctex_scanner_new_with_output_file: Memory problem (1)\n"); + /* We ensure that SYNCTEX_BUFFER_SIZE < UINT_MAX, I don't know if it makes sense... */ + if(SYNCTEX_BUFFER_SIZE >= UINT_MAX) { + _synctex_error("SyncTeX BUG: Internal inconsistency, bad SYNCTEX_BUFFER_SIZE (1)"); return NULL; } - /* we have reserved for synctex enough memory to copy output and both suffices, - * including the terminating character */ - if(synctex != strcpy(synctex,output)) { - fprintf(stderr,"! synctex_scanner_new_with_output_file: Copy problem\n"); -return_on_error: - free(synctex); + /* for integers: */ + if(SYNCTEX_BUFFER_SIZE < SYNCTEX_BUFFER_MIN_SIZE) { + _synctex_error("SyncTeX BUG: Internal inconsistency, bad SYNCTEX_BUFFER_SIZE (2)"); return NULL; } - /* remove the last path extension if any */ - synctex_strip_last_path_extension(synctex); - if(synctex != strcat(synctex,synctex_suffix)){ - fprintf(stderr,"! synctex_scanner_new_with_output_file: Concatenation problem (can't add suffix '%s')\n",synctex_suffix); - goto return_on_error; + /* now open the synctex file */ + if(_synctex_open(output,build_directory,&synctex,&file,synctex_NO,&io_mode) || !file) { + if(_synctex_open(output,build_directory,&synctex,&file,synctex_YES,&io_mode) || !file) { + return NULL; + } } - scanner = synctex_scanner_new_with_contents_of_file(synctex); + scanner = (synctex_scanner_t)_synctex_malloc(sizeof(_synctex_scanner_t)); if(NULL == scanner) { - if(synctex != strcat(synctex,synctex_suffix_gz)){ - fprintf(stderr,"! synctex_scanner_new_with_output_file: Concatenation problem (can't add suffix '%s')\n",synctex_suffix_gz); - goto return_on_error; - } - scanner = synctex_scanner_new_with_contents_of_file(synctex); - if(NULL == scanner) { - goto return_on_error; - } + _synctex_error("SyncTeX: malloc problem"); + free(synctex); + gzclose(file); + return NULL; } - /* make a private copy of output for the scanner */ + /* make a private copy of output for the scanner */ if(NULL == (scanner->output = (char *)malloc(strlen(output)+1))){ - fputs("! synctex_scanner_new_with_output_file: Memory problem (2), scanner's output is not reliable.",stderr); + _synctex_error("! synctex_scanner_new_with_output_file: Memory problem (2), scanner's output is not reliable."); } else if(scanner->output != strcpy(scanner->output,output)) { - fputs("! synctex_scanner_new_with_output_file: Copy problem, scanner's output is not reliable.\n",stderr); + _synctex_error("! synctex_scanner_new_with_output_file: Copy problem, scanner's output is not reliable."); } - scanner->synctex = synctex;/* Now the scanner owns synctex */ - return scanner; + scanner->synctex = synctex;/* Now the scanner owns synctex */ + SYNCTEX_FILE = file; + return parse? synctex_scanner_parse(scanner):scanner; } -/* Where the synctex scanner is created. - * name is the full path of the uncompressed or compressed synctex file. - * It is not the designated initializer because the scanner's core_path field is not initialized here. - * On error, NULL is returned. - * This can be due to allocation error, or an internal inconsistency (bad SYNCTEX_BUFFER_SIZE). */ -synctex_scanner_t synctex_scanner_new_with_contents_of_file(const char * name) { - synctex_scanner_t scanner = NULL; - synctex_status_t status = 0; - /* We ensure that SYNCTEX_BUFFER_SIZE < UINT_MAX, I don't know if it makes sense... */ - if(SYNCTEX_BUFFER_SIZE >= UINT_MAX) { - fprintf(stderr,"SyncTeX BUG: Internal inconsistency, bad SYNCTEX_BUFFER_SIZE (1)"); - return NULL; +int __synctex_open(const char * output, char ** synctex_name_ref, gzFile * file_ref, synctex_bool_t add_quotes, synctex_io_mode_t * io_modeRef); + +/* This functions opens the file at the "output" given location. + * It manages the problem of quoted filenames that appear with pdftex an filenames containing the space character. + * In TeXLive 2008, the synctex file created with pdftex did contain unexpected quotes. + * This function will remove them if possible. + * 0 on success, non 0 on error. */ +int __synctex_open(const char * output, char ** synctex_name_ref, gzFile * file_ref, synctex_bool_t add_quotes, synctex_io_mode_t * io_modeRef) { +# define synctex_name (*synctex_name_ref) +# define the_file (*file_ref) +# define io_mode (*io_modeRef) + if(synctex_name_ref && file_ref) { + char * quoteless = NULL; + const char * mode = synctex_io_modes[io_mode]; + size_t size = 0; + /* now create the synctex file name */ + size = strlen(output)+strlen(synctex_suffix)+strlen(synctex_suffix_gz)+1; + synctex_name = (char *)malloc(size); + if(NULL == synctex_name) { + _synctex_error("! __synctex_open: Memory problem (1)\n"); + return 1; + } + /* we have reserved for synctex enough memory to copy output, both suffices and 2 quotes, + * including the terminating character. size is free now. */ + if(synctex_name != strcpy(synctex_name,output)) { + _synctex_error("! __synctex_open: Copy problem\n"); +return_on_error: + free(synctex_name); + synctex_name = NULL;/* Don't forget to reinitialize. */ + the_file = NULL; /* Here as well */ + free(quoteless); + return 2; + } + /* remove the last path extension if any */ + _synctex_strip_last_path_extension(synctex_name); + if(!strlen(synctex_name)) { + goto return_on_error; + } + /* now insert quotes. */ + if(add_quotes) { + char * quoted = NULL; + if(_synctex_copy_with_quoting_last_path_component(synctex_name,"ed,size) || (NULL == quoted)) { + /* There was an error or quoting does not make sense: */ + goto return_on_error; + } + quoteless = synctex_name; + synctex_name = quoted; + } + /* Now add the first path extension. */ + if(synctex_name != strcat(synctex_name,synctex_suffix)){ + _synctex_error("! __synctex_open: Concatenation problem (can't add suffix '%s')\n",synctex_suffix); + goto return_on_error; + } + /* To quoteless as well. */ + if(quoteless && (quoteless != strcat(quoteless,synctex_suffix))){ + free(quoteless); + quoteless = NULL; + } + if(NULL == (the_file = gzopen(synctex_name,mode))) { + /* Could not open this file */ + if(errno != ENOENT) { + /* The file does exist, this is a lower lever error, I can't do anything. */ + _synctex_error("SyncTeX: could not open %s, error %i\n",synctex_name,errno); + goto return_on_error; + } + /* Try the compressed version */ + if(synctex_name != strcat(synctex_name,synctex_suffix_gz)){ + _synctex_error("! __synctex_open: Concatenation problem (can't add suffix '%s')\n",synctex_suffix_gz); + goto return_on_error; + } + ++io_mode; + mode = synctex_io_modes[io_mode]; /* the file is a compressed and is a binary file, this caused errors on Windows */ + /* To quoteless as well. */ + if(quoteless && (quoteless != strcat(quoteless,synctex_suffix_gz))){ + free(quoteless); + quoteless = NULL; + } + if(NULL == (the_file = gzopen(synctex_name,mode))) { + /* Could not open this file */ + if(errno != ENOENT) { + /* The file does exist, this is a lower lever error, I can't do anything. */ + _synctex_error("SyncTeX: could not open %s, error %i\n",synctex_name,errno); + } + goto return_on_error; + } + } + /* At this point, the file is properly open. + * If we are in the add_quotes mode, we change the file name by removing the quotes. */ + if(quoteless) { + gzclose(the_file); + if(rename(synctex_name,quoteless)) { + _synctex_error("SyncTeX: could not rename %s to %s, error %i\n",synctex_name,quoteless,errno); + /* Reopen the file. */ + if(NULL == (the_file = gzopen(synctex_name,mode))) { + /* Could not open this file */ + if(errno != ENOENT) { + /* The file does exist, this is a lower lever error, I can't do anything. */ + _synctex_error("SyncTeX: could not open again %s, error %i\n",synctex_name,errno); + } + goto return_on_error; + } + } else { + if(NULL == (the_file = gzopen(quoteless,mode))) { + /* Could not open this file */ + if(errno != ENOENT) { + /* The file does exist, this is a lower lever error, I can't do anything. */ + _synctex_error("SyncTeX: could not open renamed %s, error %i\n",quoteless,errno); + } + goto return_on_error; + } + /* The quote free file name should replace the old one:*/ + free(synctex_name); + synctex_name = quoteless; + quoteless = NULL; + } + } + return 0; } - /* for integers: */ - if(SYNCTEX_BUFFER_SIZE < SYNCTEX_BUFFER_MIN_SIZE) { - fprintf(stderr,"SyncTeX BUG: Internal inconsistency, bad SYNCTEX_BUFFER_SIZE (2)"); - return NULL; + return 3; /* Bad parameter. */ +# undef synctex_name +# undef the_file +# undef io_mode +} + +int _synctex_open(const char * output, const char * build_directory, char ** synctex_name_ref, gzFile * file_ref, synctex_bool_t add_quotes, synctex_io_mode_t * io_modeRef); + +/* Opens the ouput file, taking into account the eventual build_directory. + * 0 on success, non 0 on error. */ +int _synctex_open(const char * output, const char * build_directory, char ** synctex_name_ref, gzFile * file_ref, synctex_bool_t add_quotes, synctex_io_mode_t * io_modeRef) { +# define synctex_name (*synctex_name_ref) +# define the_file (*file_ref) + int result = __synctex_open(output,synctex_name_ref,file_ref,add_quotes,io_modeRef); + if((result || !*file_ref) && build_directory && strlen(build_directory)) { + char * build_output, *lpc; + size_t size; + synctex_bool_t is_absolute; + build_output = NULL; + lpc = _synctex_last_path_component(output); + size = strlen(build_directory)+strlen(lpc)+2; + is_absolute = _synctex_path_is_absolute(build_directory); + if(!is_absolute) { + size += strlen(output); + } + if((build_output = (char *)malloc(size))) { + if(is_absolute) { + build_output[0] = '\0'; + } else { + if(build_output != strcpy(build_output,output)) { + return -4; + } + *(lpc+(build_output-output))='\0'; + } + if(build_output == strcat(build_output,build_directory)) { + /* Append a path separator if necessary. */ + if(!SYNCTEX_IS_PATH_SEPARATOR(build_output[strlen(build_directory)-1])) { + if(build_output != strcat(build_output,"/")) { + return -2; + } + } + /* Append the last path component of the output. */ + if(build_output != strcat(build_output,lpc)) { + return -3; + } + return __synctex_open(build_output,synctex_name_ref,file_ref,add_quotes,io_modeRef); + } + } + return -1; } - scanner = (synctex_scanner_t)_synctex_malloc(sizeof(_synctex_scanner_t)); + return result; +# undef synctex_name +# undef the_file +} + +/* The scanner destructor + */ +void synctex_scanner_free(synctex_scanner_t scanner) { if(NULL == scanner) { - fprintf(stderr,"SyncTeX: malloc problem"); - return NULL; + return; } + if(SYNCTEX_FILE) { + gzclose(SYNCTEX_FILE); + SYNCTEX_FILE = NULL; + } + SYNCTEX_FREE(scanner->sheet); + SYNCTEX_FREE(scanner->input); + free(SYNCTEX_START); + free(scanner->output_fmt); + free(scanner->output); + free(scanner->synctex); + free(scanner->lists_of_friends); + free(scanner); +} + +/* Where the synctex scanner parses the contents of the file. */ +synctex_scanner_t synctex_scanner_parse(synctex_scanner_t scanner) { + synctex_status_t status = 0; + if(!scanner || scanner->flags.has_parsed) { + return scanner; + } + scanner->flags.has_parsed=1; scanner->pre_magnification = 1000; scanner->pre_unit = 8192; scanner->pre_x_offset = scanner->pre_y_offset = 578; @@ -2626,6 +2733,8 @@ synctex_scanner_t synctex_scanner_new_with_contents_of_file(const char * name) { * If there is a post scriptum section, this value will be overriden by the real life value */ scanner->x_offset = scanner->y_offset = 6.027e23f; scanner->class[synctex_node_type_sheet] = synctex_class_sheet; + scanner->class[synctex_node_type_input] = synctex_class_input; + (scanner->class[synctex_node_type_input]).scanner = scanner; (scanner->class[synctex_node_type_sheet]).scanner = scanner; scanner->class[synctex_node_type_vbox] = synctex_class_vbox; (scanner->class[synctex_node_type_vbox]).scanner = scanner; @@ -2633,8 +2742,6 @@ synctex_scanner_t synctex_scanner_new_with_contents_of_file(const char * name) { (scanner->class[synctex_node_type_void_vbox]).scanner = scanner; scanner->class[synctex_node_type_hbox] = synctex_class_hbox; (scanner->class[synctex_node_type_hbox]).scanner = scanner; - scanner->class[synctex_node_type_hbox_non_void] = synctex_class_hbox; - (scanner->class[synctex_node_type_hbox_non_void]).scanner = scanner; scanner->class[synctex_node_type_void_hbox] = synctex_class_void_hbox; (scanner->class[synctex_node_type_void_hbox]).scanner = scanner; scanner->class[synctex_node_type_kern] = synctex_class_kern; @@ -2643,48 +2750,39 @@ synctex_scanner_t synctex_scanner_new_with_contents_of_file(const char * name) { (scanner->class[synctex_node_type_glue]).scanner = scanner; scanner->class[synctex_node_type_math] = synctex_class_math; (scanner->class[synctex_node_type_math]).scanner = scanner; - scanner->class[synctex_node_type_input] = synctex_class_input; - (scanner->class[synctex_node_type_input]).scanner = scanner; - SYNCTEX_FILE = gzopen(name,"r"); - if(NULL == SYNCTEX_FILE) { - if(errno != ENOENT) { - fprintf(stderr,"SyncTeX: could not open %s, error %i\n",name,errno); - } -bail: + scanner->class[synctex_node_type_boundary] = synctex_class_boundary; + (scanner->class[synctex_node_type_boundary]).scanner = scanner; + SYNCTEX_START = (unsigned char *)malloc(SYNCTEX_BUFFER_SIZE+1); /* one more character for null termination */ + if(NULL == SYNCTEX_START) { + _synctex_error("SyncTeX: malloc error"); synctex_scanner_free(scanner); return NULL; } - SYNCTEX_START = (unsigned char *)malloc(SYNCTEX_BUFFER_SIZE+1); /* one more character for null termination */ - if(NULL == SYNCTEX_START) { - fprintf(stderr,"SyncTeX: malloc error"); - gzclose(SYNCTEX_FILE); - goto bail; - } SYNCTEX_END = SYNCTEX_START+SYNCTEX_BUFFER_SIZE; - /* SYNCTEX_END always points to a null terminating character. - * Maybe there is another null terminating character between SYNCTEX_CUR and SYNCTEX_END-1. - * At least, we are sure that SYNCTEX_CUR points to a string covering a valid part of the memory. */ - * SYNCTEX_END = '\0'; + /* SYNCTEX_END always points to a null terminating character. + * Maybe there is another null terminating character between SYNCTEX_CUR and SYNCTEX_END-1. + * At least, we are sure that SYNCTEX_CUR points to a string covering a valid part of the memory. */ + *SYNCTEX_END = '\0'; SYNCTEX_CUR = SYNCTEX_END; status = _synctex_scan_preamble(scanner); if(status<SYNCTEX_STATUS_OK) { - fprintf(stderr,"SyncTeX Error: Bad preamble\n"); + _synctex_error("SyncTeX Error: Bad preamble\n"); bailey: - gzclose(SYNCTEX_FILE); - goto bail; + synctex_scanner_free(scanner); + return NULL; } status = _synctex_scan_content(scanner); if(status<SYNCTEX_STATUS_OK) { - fprintf(stderr,"SyncTeX Error: Bad content\n"); + _synctex_error("SyncTeX Error: Bad content\n"); goto bailey; } - /* Everything is finished, free the buffer, close he file */ + /* Everything is finished, free the buffer, close the file */ free((void *)SYNCTEX_START); SYNCTEX_START = SYNCTEX_CUR = SYNCTEX_END = NULL; gzclose(SYNCTEX_FILE); SYNCTEX_FILE = NULL; - /* Final tuning: set the default values for various parameters */ - /* 1 pre_unit = (scanner->pre_unit)/65536 pt = (scanner->pre_unit)/65781.76 bp + /* Final tuning: set the default values for various parameters */ + /* 1 pre_unit = (scanner->pre_unit)/65536 pt = (scanner->pre_unit)/65781.76 bp * 1 pt = 65536 sp */ if(scanner->pre_unit<=0) { scanner->pre_unit = 8192; @@ -2693,19 +2791,19 @@ bailey: scanner->pre_magnification = 1000; } if(scanner->unit <= 0) { - /* no post magnification */ - scanner->unit = scanner->pre_unit / 65781.76;/* 65781.76 or 65536.0*/ + /* no post magnification */ + scanner->unit = scanner->pre_unit / 65781.76;/* 65781.76 or 65536.0*/ } else { - /* post magnification */ + /* post magnification */ scanner->unit *= scanner->pre_unit / 65781.76; } scanner->unit *= scanner->pre_magnification / 1000.0; if(scanner->x_offset > 6e23) { - /* no post offset */ + /* no post offset */ scanner->x_offset = scanner->pre_x_offset * (scanner->pre_unit / 65781.76); scanner->y_offset = scanner->pre_y_offset * (scanner->pre_unit / 65781.76); } else { - /* post offset */ + /* post offset */ scanner->x_offset /= 65781.76f; scanner->y_offset /= 65781.76f; } @@ -2713,22 +2811,6 @@ bailey: #undef SYNCTEX_FILE } -/* The scanner destructor - */ -void synctex_scanner_free(synctex_scanner_t scanner) { - if(NULL == scanner) { - return; - } - SYNCTEX_FREE(scanner->sheet); - SYNCTEX_FREE(scanner->input); - free(SYNCTEX_START); - free(scanner->output_fmt); - free(scanner->output); - free(scanner->synctex); - free(scanner->lists_of_friends); - free(scanner); -} - /* Scanner accessors. */ int synctex_scanner_pre_x_offset(synctex_scanner_t scanner){ @@ -2794,20 +2876,69 @@ const char * synctex_scanner_get_name(synctex_scanner_t scanner,int tag) { } while((input = SYNCTEX_SIBLING(input)) != NULL); return NULL; } -int synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name) { + +int _synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name); +int _synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name) { synctex_node_t input = NULL; if(NULL == scanner) { return 0; } input = scanner->input; do { - if((strlen(name) == strlen((SYNCTEX_NAME(input)))) && - (0 == strncmp(name,(SYNCTEX_NAME(input)),strlen(name)))) { + if(_synctex_is_equivalent_file_name(name,(SYNCTEX_NAME(input)))) { return SYNCTEX_TAG(input); } } while((input = SYNCTEX_SIBLING(input)) != NULL); return 0; } + +int synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name) { + size_t char_index = strlen(name); + if((scanner = synctex_scanner_parse(scanner)) && (0 < char_index)) { + /* the name is not void */ + char_index -= 1; + if(!SYNCTEX_IS_PATH_SEPARATOR(name[char_index])) { + /* the last character of name is not a path separator */ + int result = _synctex_scanner_get_tag(scanner,name); + if(result) { + return result; + } else { + /* the given name was not the one known by TeX + * try a name relative to the enclosing directory of the scanner->output file */ + const char * relative = name; + const char * ptr = scanner->output; + while((strlen(relative) > 0) && (strlen(ptr) > 0) && (*relative == *ptr)) + { + relative += 1; + ptr += 1; + } + /* Find the last path separator before relative */ + while(relative > name) { + if(SYNCTEX_IS_PATH_SEPARATOR(*(relative-1))) { + break; + } + relative -= 1; + } + if((relative > name) && (result = _synctex_scanner_get_tag(scanner,relative))) { + return result; + } + if(SYNCTEX_IS_PATH_SEPARATOR(name[0])) { + /* No tag found for the given absolute name, + * Try each relative path starting from the shortest one */ + while(0<char_index) { + char_index -= 1; + if(SYNCTEX_IS_PATH_SEPARATOR(name[char_index]) + && (result = _synctex_scanner_get_tag(scanner,name+char_index+1))) { + return result; + } + } + } + } + return result; + } + } + return 0; +} synctex_node_t synctex_scanner_input(synctex_scanner_t scanner) { return scanner?scanner->input:NULL; } @@ -2824,88 +2955,88 @@ const char * synctex_scanner_get_synctex(synctex_scanner_t scanner) { # pragma mark - # pragma mark Public node attributes # endif -float synctex_node_h(synctex_node_t node){ +int synctex_node_h(synctex_node_t node){ if(!node) { return 0; } - return (float)SYNCTEX_HORIZ(node); + return SYNCTEX_HORIZ(node); } -float synctex_node_v(synctex_node_t node){ +int synctex_node_v(synctex_node_t node){ if(!node) { return 0; } - return (float)SYNCTEX_VERT(node); + return SYNCTEX_VERT(node); } -float synctex_node_width(synctex_node_t node){ +int synctex_node_width(synctex_node_t node){ if(!node) { return 0; } - return (float)SYNCTEX_WIDTH(node); + return SYNCTEX_WIDTH(node); } -float synctex_node_box_h(synctex_node_t node){ +int synctex_node_box_h(synctex_node_t node){ if(!node) { return 0; } - if((node->class->type != synctex_node_type_vbox) - && (node->class->type != synctex_node_type_void_vbox) - && (node->class->type != synctex_node_type_hbox) - && (node->class->type != synctex_node_type_hbox_non_void) - && (node->class->type != synctex_node_type_void_hbox)) { - node = SYNCTEX_PARENT(node); + if(SYNCTEX_IS_BOX(node)) { +result: + return SYNCTEX_HORIZ(node); + } + if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + goto result; } - return (node->class->type == synctex_node_type_sheet)?0:(float)(SYNCTEX_HORIZ(node)); + return 0; } -float synctex_node_box_v(synctex_node_t node){ +int synctex_node_box_v(synctex_node_t node){ if(!node) { return 0; } - if((node->class->type != synctex_node_type_vbox) - && (node->class->type != synctex_node_type_void_vbox) - && (node->class->type != synctex_node_type_hbox) - && (node->class->type != synctex_node_type_hbox_non_void) - && (node->class->type != synctex_node_type_void_hbox)) { - node = SYNCTEX_PARENT(node); + if(SYNCTEX_IS_BOX(node)) { +result: + return SYNCTEX_VERT(node); + } + if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + goto result; } - return (node->class->type == synctex_node_type_sheet)?0:(float)(SYNCTEX_VERT(node)); + return 0; } -float synctex_node_box_width(synctex_node_t node){ +int synctex_node_box_width(synctex_node_t node){ if(!node) { return 0; } - if((node->class->type != synctex_node_type_vbox) - && (node->class->type != synctex_node_type_void_vbox) - && (node->class->type != synctex_node_type_hbox) - && (node->class->type != synctex_node_type_hbox_non_void) - && (node->class->type != synctex_node_type_void_hbox)) { - node = SYNCTEX_PARENT(node); + if(SYNCTEX_IS_BOX(node)) { +result: + return SYNCTEX_WIDTH(node); + } + if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + goto result; } - return (node->class->type == synctex_node_type_sheet)?0:(float)(SYNCTEX_WIDTH(node)); + return 0; } -float synctex_node_box_height(synctex_node_t node){ +int synctex_node_box_height(synctex_node_t node){ if(!node) { return 0; } - if((node->class->type != synctex_node_type_vbox) - && (node->class->type != synctex_node_type_void_vbox) - && (node->class->type != synctex_node_type_hbox) - && (node->class->type != synctex_node_type_hbox_non_void) - && (node->class->type != synctex_node_type_void_hbox)) { - node = SYNCTEX_PARENT(node); + if(SYNCTEX_IS_BOX(node)) { +result: + return SYNCTEX_HEIGHT(node); } - return (node->class->type == synctex_node_type_sheet)?0:(float)(SYNCTEX_HEIGHT(node)); + if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + goto result; + } + return 0; } -float synctex_node_box_depth(synctex_node_t node){ +int synctex_node_box_depth(synctex_node_t node){ if(!node) { return 0; } - if((node->class->type != synctex_node_type_vbox) - && (node->class->type != synctex_node_type_void_vbox) - && (node->class->type != synctex_node_type_hbox) - && (node->class->type != synctex_node_type_hbox_non_void) - && (node->class->type != synctex_node_type_void_hbox)) { - node = SYNCTEX_PARENT(node); + if(SYNCTEX_IS_BOX(node)) { +result: + return SYNCTEX_DEPTH(node); } - return (node->class->type == synctex_node_type_sheet)?0:(float)(SYNCTEX_DEPTH(node)); + if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { + goto result; + } + return 0; } # ifdef SYNCTEX_NOTHING # pragma mark - @@ -2933,119 +3064,91 @@ float synctex_node_box_visible_h(synctex_node_t node){ if(!node) { return 0; } - if((node->class->type == synctex_node_type_vbox) - || (node->class->type == synctex_node_type_void_hbox) - || (node->class->type == synctex_node_type_void_vbox)) { + switch(node->class->type) { + case synctex_node_type_vbox: + case synctex_node_type_void_vbox: + case synctex_node_type_void_hbox: + return SYNCTEX_HORIZ(node)*node->class->scanner->unit+node->class->scanner->x_offset; + case synctex_node_type_hbox: result: - return SYNCTEX_WIDTH(node)<0? - (SYNCTEX_HORIZ(node)+SYNCTEX_WIDTH(node))*node->class->scanner->unit+node->class->scanner->x_offset: - SYNCTEX_HORIZ(node)*node->class->scanner->unit+node->class->scanner->x_offset; - } - if(node->class->type != synctex_node_type_hbox - && node->class->type != synctex_node_type_hbox_non_void) { - node = SYNCTEX_PARENT(node); + return SYNCTEX_HORIZ_V(node)*node->class->scanner->unit+node->class->scanner->x_offset; } - if(node->class->type == synctex_node_type_sheet) { - return 0; - } - if(node->class->type == synctex_node_type_vbox) { + if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } - return SYNCTEX_INFO(node)[SYNCTEX_WIDTH_V_IDX].INT<0? - (SYNCTEX_INFO(node)[SYNCTEX_HORIZ_V_IDX].INT+SYNCTEX_INFO(node)[SYNCTEX_WIDTH_V_IDX].INT)*node->class->scanner->unit+node->class->scanner->x_offset: - SYNCTEX_INFO(node)[SYNCTEX_HORIZ_V_IDX].INT*node->class->scanner->unit+node->class->scanner->x_offset; + return 0; } float synctex_node_box_visible_v(synctex_node_t node){ if(!node) { return 0; } - if((node->class->type == synctex_node_type_vbox) - || (node->class->type == synctex_node_type_void_hbox) - || (node->class->type == synctex_node_type_void_vbox)) { + switch(node->class->type) { + case synctex_node_type_vbox: + case synctex_node_type_void_vbox: + case synctex_node_type_void_hbox: + return SYNCTEX_VERT(node)*node->class->scanner->unit+node->class->scanner->x_offset; + case synctex_node_type_hbox: result: - return (float)(SYNCTEX_VERT(node))*node->class->scanner->unit+node->class->scanner->y_offset; - } - if(node->class->type != synctex_node_type_hbox - && node->class->type != synctex_node_type_hbox_non_void) { - node = SYNCTEX_PARENT(node); + return SYNCTEX_VERT_V(node)*node->class->scanner->unit+node->class->scanner->x_offset; } - if(node->class->type == synctex_node_type_sheet) { - return 0; - } - if(node->class->type == synctex_node_type_vbox) { + if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } - return SYNCTEX_INFO(node)[SYNCTEX_VERT_V_IDX].INT*node->class->scanner->unit+node->class->scanner->y_offset; + return 0; } float synctex_node_box_visible_width(synctex_node_t node){ if(!node) { return 0; } - if((node->class->type == synctex_node_type_vbox) - || (node->class->type == synctex_node_type_void_hbox) - || (node->class->type == synctex_node_type_void_vbox)) { + switch(node->class->type) { + case synctex_node_type_vbox: + case synctex_node_type_void_vbox: + case synctex_node_type_void_hbox: + return SYNCTEX_WIDTH(node)*node->class->scanner->unit; + case synctex_node_type_hbox: result: - return SYNCTEX_WIDTH(node)<0? - -SYNCTEX_WIDTH(node)*node->class->scanner->unit: - SYNCTEX_WIDTH(node)*node->class->scanner->unit; + return SYNCTEX_WIDTH_V(node)*node->class->scanner->unit; } - if(node->class->type != synctex_node_type_hbox - && node->class->type != synctex_node_type_hbox_non_void) { - node = SYNCTEX_PARENT(node); - } - if(node->class->type == synctex_node_type_sheet) { - return 0; - } - if(node->class->type == synctex_node_type_vbox) { + if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } - return SYNCTEX_INFO(node)[SYNCTEX_WIDTH_V_IDX].INT<0? - -SYNCTEX_INFO(node)[SYNCTEX_WIDTH_V_IDX].INT*node->class->scanner->unit: - SYNCTEX_INFO(node)[SYNCTEX_WIDTH_V_IDX].INT*node->class->scanner->unit; + return 0; } float synctex_node_box_visible_height(synctex_node_t node){ if(!node) { return 0; } - if((node->class->type == synctex_node_type_vbox) - || (node->class->type == synctex_node_type_void_hbox) - || (node->class->type == synctex_node_type_void_vbox)) { + switch(node->class->type) { + case synctex_node_type_vbox: + case synctex_node_type_void_vbox: + case synctex_node_type_void_hbox: + return SYNCTEX_HEIGHT(node)*node->class->scanner->unit; + case synctex_node_type_hbox: result: - return (float)(SYNCTEX_HEIGHT(node))*node->class->scanner->unit; + return SYNCTEX_HEIGHT_V(node)*node->class->scanner->unit; } - if(node->class->type != synctex_node_type_hbox - && node->class->type != synctex_node_type_hbox_non_void) { - node = SYNCTEX_PARENT(node); - } - if(node->class->type == synctex_node_type_sheet) { - return 0; - } - if(node->class->type == synctex_node_type_vbox) { + if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } - return SYNCTEX_INFO(node)[SYNCTEX_HEIGHT_V_IDX].INT*node->class->scanner->unit; + return 0; } float synctex_node_box_visible_depth(synctex_node_t node){ if(!node) { return 0; } - if((node->class->type == synctex_node_type_vbox) - || (node->class->type == synctex_node_type_void_hbox) - || (node->class->type == synctex_node_type_void_vbox)) { + switch(node->class->type) { + case synctex_node_type_vbox: + case synctex_node_type_void_vbox: + case synctex_node_type_void_hbox: + return SYNCTEX_DEPTH(node)*node->class->scanner->unit; + case synctex_node_type_hbox: result: - return (float)(SYNCTEX_DEPTH(node))*node->class->scanner->unit; + return SYNCTEX_DEPTH_V(node)*node->class->scanner->unit; } - if(node->class->type != synctex_node_type_hbox - && node->class->type != synctex_node_type_hbox_non_void) { - node = SYNCTEX_PARENT(node); - } - if(node->class->type == synctex_node_type_sheet) { - return 0; - } - if(node->class->type == synctex_node_type_vbox) { + if((node = SYNCTEX_PARENT(node)) && (node->class->type != synctex_node_type_sheet)) { goto result; } - return SYNCTEX_INFO(node)[SYNCTEX_DEPTH_V_IDX].INT*node->class->scanner->unit; + return 0; } # ifdef SYNCTEX_NOTHING # pragma mark - @@ -3081,7 +3184,7 @@ int synctex_node_column(synctex_node_t node) { } # ifdef SYNCTEX_NOTHING # pragma mark - -# pragma mark Query +# pragma mark Sheet # endif synctex_node_t synctex_sheet_content(synctex_scanner_t scanner,int page) { @@ -3102,10 +3205,6 @@ synctex_node_t synctex_sheet_content(synctex_scanner_t scanner,int page) { # pragma mark Query # endif -int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,int column); -int synctex_edit_query(synctex_scanner_t scanner,int page,float h,float v); -synctex_node_t synctex_next_result(synctex_scanner_t scanner); - int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,int column) { # ifdef __DARWIN_UNIX03 # pragma unused(column) @@ -3113,6 +3212,7 @@ int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,i int tag = synctex_scanner_get_tag(scanner,name); size_t size = 0; int friend_index = 0; + int max_line = 0; synctex_node_t node = NULL; if(tag == 0) { printf("SyncTeX Warning: No tag for %s\n",name); @@ -3120,430 +3220,838 @@ int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,i } free(SYNCTEX_START); SYNCTEX_CUR = SYNCTEX_END = SYNCTEX_START = NULL; - friend_index = (tag+line)%(scanner->number_of_lists); - node = (scanner->lists_of_friends)[friend_index]; - while(node) { - if((tag == SYNCTEX_TAG(node)) && (line == SYNCTEX_LINE(node))) { - if(SYNCTEX_CUR == SYNCTEX_END) { - size += 16; - SYNCTEX_END = realloc(SYNCTEX_START,size*sizeof(synctex_node_t *)); - SYNCTEX_CUR += SYNCTEX_END - SYNCTEX_START; - SYNCTEX_START = SYNCTEX_END; - SYNCTEX_END = SYNCTEX_START + size*sizeof(synctex_node_t *); - } - *(synctex_node_t *)SYNCTEX_CUR = node; - SYNCTEX_CUR += sizeof(synctex_node_t); - } - node = SYNCTEX_FRIEND(node); - } - SYNCTEX_END = SYNCTEX_CUR; - SYNCTEX_CUR = NULL; - return SYNCTEX_END-SYNCTEX_START; -} - -inline static synctex_node_t _synctex_best_child_node(synctex_node_t node,int H,int V, int * distanceRef); -inline static synctex_node_t _synctex_best_child_node(synctex_node_t node,int H,int V, int * distanceRef) { - if(NULL != distanceRef) { - synctex_node_t child = NULL; - switch((node->class)->type) { - case synctex_node_type_hbox_non_void: - if((child = SYNCTEX_CHILD(node))) { - synctex_node_t result = NULL; - do { - synctex_node_t candidate = NULL; - if((candidate = _synctex_best_child_node(child,H,V,distanceRef))) { - if(0 == *distanceRef) { - /* We can't do better */ - return candidate; - } - result = candidate; - } - } while((child = SYNCTEX_SIBLING(child))); - return result; - } else { - /* this is an error if this box does not contain children. */ - fprintf(stderr, - "SyncTeX internal inconsistency: we should not get there (synctex_best_child_node:%i), please report bug to the SyncTeX maintainer\n", - (node->class)->type); - return NULL; + max_line = line < INT_MAX-scanner->number_of_lists ? line+scanner->number_of_lists:INT_MAX; + while(line<max_line) { + /* This loop will only be performed once for advanced viewers */ + friend_index = (tag+line)%(scanner->number_of_lists); + if((node = (scanner->lists_of_friends)[friend_index])) { + do { + if((synctex_node_type(node)>=synctex_node_type_boundary) + && (tag == SYNCTEX_TAG(node)) + && (line == SYNCTEX_LINE(node))) { + if(SYNCTEX_CUR == SYNCTEX_END) { + size += 16; + SYNCTEX_END = realloc(SYNCTEX_START,size*sizeof(synctex_node_t *)); + SYNCTEX_CUR += SYNCTEX_END - SYNCTEX_START; + SYNCTEX_START = SYNCTEX_END; + SYNCTEX_END = SYNCTEX_START + size*sizeof(synctex_node_t *); + } + *(synctex_node_t *)SYNCTEX_CUR = node; + SYNCTEX_CUR += sizeof(synctex_node_t); } - case synctex_node_type_hbox: - case synctex_node_type_vbox: - /* This is a box that contains children but no kern, math or glue nodes. */ - if((child = SYNCTEX_CHILD(node))) { - synctex_node_t result = NULL; + } while((node = SYNCTEX_FRIEND(node))); + if(SYNCTEX_START == NULL) { + /* We did not find any matching boundary, retry with glue or kern */ + node = (scanner->lists_of_friends)[friend_index];/* no need to test it again, already done */ + do { + if((synctex_node_type(node)>=synctex_node_type_kern) + && (tag == SYNCTEX_TAG(node)) + && (line == SYNCTEX_LINE(node))) { + if(SYNCTEX_CUR == SYNCTEX_END) { + size += 16; + SYNCTEX_END = realloc(SYNCTEX_START,size*sizeof(synctex_node_t *)); + SYNCTEX_CUR += SYNCTEX_END - SYNCTEX_START; + SYNCTEX_START = SYNCTEX_END; + SYNCTEX_END = SYNCTEX_START + size*sizeof(synctex_node_t *); + } + *(synctex_node_t *)SYNCTEX_CUR = node; + SYNCTEX_CUR += sizeof(synctex_node_t); + } + } while((node = SYNCTEX_FRIEND(node))); + if(SYNCTEX_START == NULL) { + /* We did not find any matching glue or kern, retry with boxes */ + node = (scanner->lists_of_friends)[friend_index];/* no need to test it again, already done */ do { - synctex_node_t candidate = NULL; - if((candidate = _synctex_best_child_node(child,H,V,distanceRef))) { - if(0 == *distanceRef) { - /* We can't do better */ - return candidate; - } - result = candidate; - } - } while((child = SYNCTEX_SIBLING(child))); - return result; - } else { - /* If the hit point is inside the box, we must return a node inside the box */ - int min = SYNCTEX_HORIZ_V(node); - int max = min+SYNCTEX_WIDTH_V(node); - if(min<=H && H<=max) { - min = SYNCTEX_VERT_V(node); - max = min + SYNCTEX_DEPTH_V(node); - min -= SYNCTEX_HEIGHT_V(node); - if(min<=V && V<=max) { - /* The hit point and the result are in the same box, we can't do better */ - *distanceRef = 0;/* no one else will ever try to do better */ - return node; + if((tag == SYNCTEX_TAG(node)) + && (line == SYNCTEX_LINE(node))) { + if(SYNCTEX_CUR == SYNCTEX_END) { + size += 16; + SYNCTEX_END = realloc(SYNCTEX_START,size*sizeof(synctex_node_t *)); + SYNCTEX_CUR += SYNCTEX_END - SYNCTEX_START; + SYNCTEX_START = SYNCTEX_END; + SYNCTEX_END = SYNCTEX_START + size*sizeof(synctex_node_t *); + } + *(synctex_node_t *)SYNCTEX_CUR = node; + SYNCTEX_CUR += sizeof(synctex_node_t); } - } - return NULL; + } while((node = SYNCTEX_FRIEND(node))); } - case synctex_node_type_void_hbox: - case synctex_node_type_void_vbox: - /* Both boxes does not contain any material, they only contribute to SyncTeX by their line number. */ - return NULL; - default: + } + SYNCTEX_END = SYNCTEX_CUR; + /* Now reverse the order to have nodes in display order, and keep just a few nodes */ + if((SYNCTEX_START) && (SYNCTEX_END)) { - int i = SYNCTEX_HORIZ(node); - int distance = i>H?i-H:H-i; - i = SYNCTEX_VERT(node); - distance += i>V?i-V:V-i; - if(distance<*distanceRef) { - *distanceRef = distance; - return node; + synctex_node_t * start_ref = (synctex_node_t *)SYNCTEX_START; + synctex_node_t * end_ref = (synctex_node_t *)SYNCTEX_END; + end_ref -= 1; + while(start_ref < end_ref) { + node = *start_ref; + *start_ref = *end_ref; + *end_ref = node; + start_ref += 1; + end_ref -= 1; + } + /* Basically, we keep the first node for each parent. + * More precisely, we keep only nodes that are not descendants of + * their predecessor's parent. */ + start_ref = (synctex_node_t *)SYNCTEX_START; + end_ref = (synctex_node_t *)SYNCTEX_START; + next_end: + end_ref += 1; /* we allways have start_ref<= end_ref*/ + if(end_ref < (synctex_node_t *)SYNCTEX_END) { + node = *end_ref; + while((node = SYNCTEX_PARENT(node))) { + if(SYNCTEX_PARENT(*start_ref) == node) { + goto next_end; + } + } + start_ref += 1; + *start_ref = *end_ref; + goto next_end; } - return NULL; + start_ref += 1; + SYNCTEX_END = (unsigned char *)start_ref; } - } + SYNCTEX_CUR = NULL; + return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); + } +# if defined(__SYNCTEX_STRONG_DISPLAY_QUERY__) + break; +# else + ++line; +# endif } - return NULL; + return 0; } -/* The best container is the deeper box that contains the given point. - * We traverse the node tree in a deep first manner and stop as soon as a resutl is found. */ -inline static synctex_node_t _synctex_best_container(synctex_node_t node,int H,int V); -inline static synctex_node_t _synctex_best_container(synctex_node_t node,int H,int V) { - int min, max; - synctex_node_t child = NULL; - synctex_node_t result = NULL; - switch(node->class->type) { - case synctex_node_type_hbox: - case synctex_node_type_vbox: - case synctex_node_type_hbox_non_void: - max = SYNCTEX_WIDTH_V(node); - if(max<0) { - min = max; - max = SYNCTEX_HORIZ_V(node); - min += max; - } else { - min = SYNCTEX_HORIZ_V(node); - max += min; - } - if(min<=H && H<=max) { - child = node; - while((child = SYNCTEX_CHILD(child))) { - if((result = _synctex_best_container(child,H,V))) { - return result; - } - } - min = SYNCTEX_VERT_V(node); - max = min + SYNCTEX_DEPTH_V(node); - min -= SYNCTEX_HEIGHT_V(node); - if(min<=V && V<=max) { - /* The hit point and the result are in the same box, we can't do better */ - return node; - } - } +synctex_node_t synctex_next_result(synctex_scanner_t scanner) { + if(NULL == SYNCTEX_CUR) { + SYNCTEX_CUR = SYNCTEX_START; + } else { + SYNCTEX_CUR+=sizeof(synctex_node_t); + } + if(SYNCTEX_CUR<SYNCTEX_END) { + return *(synctex_node_t*)SYNCTEX_CUR; + } else { + return NULL; } - return NULL; } +/* This struct records a point in TeX coordinates.*/ +typedef struct { + int h; + int v; +} synctex_point_t; + +/* This struct records distances, the left one is positive or 0 and the right one is negative or 0. + * When comparing the locations of 2 different graphical objects on the page, we will have to also record the + * horizontal distance as signed to keep track of the typesetting order.*/ +typedef struct { + int left; + int right; +} synctex_distances_t; + +typedef struct { + synctex_point_t left; + synctex_point_t right; +} synctex_offsets_t; + + +typedef struct { + synctex_node_t left; + synctex_node_t right; +} synctex_node_set_t; + +/* The smallest container between two has the smallest width or height. + * This comparison is used when there are 2 overlapping boxes that contain the hit point. + * For ConTeXt, the problem appears at each page. + * The chosen box is the one with the smallest height, then the smallest width. */ +SYNCTEX_INLINE static synctex_node_t _synctex_smallest_container(synctex_node_t node, synctex_node_t other_node); + +/* Returns the distance between the hit point hitPoint=(H,V) and the given node. */ +synctex_bool_t _synctex_point_in_box(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible); +int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible); + +/* The best container is the deeper box that contains the hit point (H,V). + * _synctex_eq_deepest_container starts with node whereas + * _synctex_box_child_deepest starts with node's children, if any + * if node is not a box, or a void box, NULL is returned. + * We traverse the node tree in a deep first manner and stop as soon as a result is found. */ +static synctex_node_t _synctex_eq_deepest_container(synctex_point_t hitPoint,synctex_node_t node, synctex_bool_t visible); + +/* Once a best container is found, the closest children are the closest nodes to the left or right of the hit point. + * Only horizontal and vertical offsets are used to compare the positions of the nodes. */ +SYNCTEX_INLINE static int _synctex_eq_get_closest_children_in_box(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef, synctex_bool_t visible); + +/* The closest container is the box that is the one closest to the given point. + * The "visible" version takes into account the visible dimensions instead of the real ones given by TeX. */ +SYNCTEX_INLINE static synctex_node_t _synctex_eq_closest_child(synctex_point_t hitPoint,synctex_node_t node, synctex_bool_t visible); + +#define SYNCTEX_MASK_LEFT 1 +#define SYNCTEX_MASK_RIGHT 2 + int synctex_edit_query(synctex_scanner_t scanner,int page,float h,float v) { synctex_node_t sheet = NULL; - synctex_node_t node = NULL; - synctex_node_t best_node = NULL; - synctex_node_t best_container = NULL; - int H,V; - int minH,maxH,minV,maxV; - int best_distance,distance; - if(NULL == scanner || 0 == scanner->unit) { + synctex_node_t node = NULL; /* placeholder */ + synctex_node_t other_node = NULL; /* placeholder */ + synctex_point_t hitPoint = {0,0}; /* placeholder */ + synctex_node_set_t bestNodes = {NULL,NULL}; /* holds the best node */ + synctex_distances_t bestDistances = {INT_MAX,INT_MAX}; + synctex_node_t bestContainer = NULL; /* placeholder */ + if(NULL == (scanner = synctex_scanner_parse(scanner)) || 0 >= scanner->unit) {/* scanner->unit must be >0 */ return 0; } - /* Convert the given point to scanner integer coordinates */ - H = (h-scanner->x_offset)/scanner->unit; - V = (v-scanner->y_offset)/scanner->unit; + /* Convert the given point to scanner integer coordinates */ + hitPoint.h = (h-scanner->x_offset)/scanner->unit; + hitPoint.v = (v-scanner->y_offset)/scanner->unit; /* We will store in the scanner's buffer the result of the query. */ free(SYNCTEX_START); SYNCTEX_START = SYNCTEX_END = SYNCTEX_CUR = NULL; - /* Find the proper sheet */ + /* Find the proper sheet */ sheet = scanner->sheet; - while(sheet != NULL && SYNCTEX_PAGE(sheet) != page) { + while((sheet) && SYNCTEX_PAGE(sheet) != page) { sheet = SYNCTEX_SIBLING(sheet); } if(NULL == sheet) { return -1; } - /* Now sheet points to the sheet node with proper page number */ - /* try to find the box closest to the hit point (H,V) */ - /* We initialize the values with the next box of the sheet. */ - node = SYNCTEX_NEXT_BOX(sheet); - if(NULL == node) { - /* This is a very weird situation where there are no kern, math or glue nodes. - * Ignore this, for the moment. */ - return 0; - } - /* The distance between a point and a box is special. - * It is not the euclidian distance, nor something similar. - * We have to take into account the particular layout, - * and the box hierarchy. - * Given a box, there are 9 regions delimited by the lines of the edges of the box. - * The origin being at the top left corner of the page, - * we also give names to the vertices of the box. - * - * 1 | 2 | 3 - * ---A---B---> - * 4 | 5 | 6 - * ---C---D---> - * 7 | 8 | 9 - * v v - * In each region, there is a different formula. - * In the end we have a continuous distance which may not be a mathematical distance but who cares. */ - /* In order to gain speed, we have made a linked list of all the box nodes that contain either kern, glue or math node. - * These kind of boxes are expected to represent the vast majority of boxes. - * It was created while parsing the sheet content, and the boxes are ordered from deeper to lower. */ - /* min? and max? are the coordinates of the box. */ -next_box: - /* getting the box bounds, taking into account negative widths. */ - maxH = SYNCTEX_WIDTH_V(node); - if(maxH<0) { - minH = maxH; - maxH = SYNCTEX_HORIZ_V(node); - minH += maxH; - } else { - minH = SYNCTEX_HORIZ_V(node); - maxH += minH; - } - minV = SYNCTEX_VERT_V(node); - maxV = minV + SYNCTEX_DEPTH_V(node); - minV -= SYNCTEX_HEIGHT_V(node); - /* In what region is the point P=(H,V) ? */ - if(V<minV) { - if(H<minH) { - /* This is region 1. The distance to the box is the L1 distance PA. */ - best_distance = minV - V + minH - H;/* Integer overflow? probability epsilon */ - } else if(H<=maxH) { - /* This is region 2. The distance to the box is the geometrical distance to the top edge. */ - best_distance = minV - V; - } else { - /* This is region 3. The distance to the box is the L1 distance PB. */ - best_distance = minV - V + H - maxH; - } - } else if(V<=maxV) { - if(H<minH) { - /* This is region 4. The distance to the box is the geometrical distance to the left edge. */ - best_distance = minH - H; - } else if(H<=maxH) { - /* This is region 4. We are inside the box. */ - best_distance = 0; - } else { - /* This is region 6. The distance to the box is the geometrical distance to the right edge. */ - best_distance = H - maxH; - } - } else { - if(H<minH) { - /* This is region 7. The distance to the box is the L1 distance PC. */ - best_distance = V - maxV + minH - H; - } else if(H<=maxH) { - /* This is region 8. The distance to the box is the geometrical distance to the top edge. */ - best_distance = V - maxV; - } else { - /* This is region 9. The distance to the box is the L1 distance PD. */ - best_distance = V - maxV + H - maxH; - } - } - best_node = node; - /* Is best_node a box containing the hit point? */ - if(best_distance==0) { - if((best_container = _synctex_best_container(best_node,H,V)) && (best_container != best_node)) { - /* We have found a box that contains the hit point, as a descendant of best_node. - * best_container is a box that contains no kern, math and glue nodes, - * otherwise, it would be located in the linked list of such boxes, before its ancestor best_node - * and it would have been laready caught. - * In mathematical formulas, there are such boxes because there is not enough material to add glue or kern. */ - if((SYNCTEX_START = malloc(sizeof(synctex_node_t)))) { - * (synctex_node_t *)SYNCTEX_START = best_container; - SYNCTEX_END = SYNCTEX_START + sizeof(synctex_node_t); - SYNCTEX_CUR = NULL; - return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); - } else { + /* Now sheet points to the sheet node with proper page number */ + /* Here is how we work: + * At first we do not consider the visible box dimensions. This will cover the most frequent cases. + * Then we try with the visible box dimensions. + * We try to find a non void box containing the hit point. + * We browse all the horizontal boxes until we find one containing the hit point. */ + if((node = SYNCTEX_NEXT_HORIZ_BOX(sheet))) { + do { + if(_synctex_point_in_box(hitPoint,node,synctex_YES)) { + /* Maybe the hitPoint belongs to a contained vertical box. */ +end: + /* This trick is for catching overlapping boxes */ + if((other_node = SYNCTEX_NEXT_HORIZ_BOX(node))) { + do { + if(_synctex_point_in_box(hitPoint,other_node,synctex_YES)) { + node = _synctex_smallest_container(other_node,node); + } + } while((other_node = SYNCTEX_NEXT_HORIZ_BOX(other_node))); + } + if((bestContainer = _synctex_eq_deepest_container(hitPoint,node,synctex_YES))) { + node = bestContainer; + } + _synctex_eq_get_closest_children_in_box(hitPoint,node,&bestNodes,&bestDistances,synctex_YES); + if(bestNodes.right && bestNodes.left) { + if((SYNCTEX_TAG(bestNodes.right)!=SYNCTEX_TAG(bestNodes.left)) + || (SYNCTEX_LINE(bestNodes.right)!=SYNCTEX_LINE(bestNodes.left)) + || (SYNCTEX_COLUMN(bestNodes.right)!=SYNCTEX_COLUMN(bestNodes.left))) { + if((SYNCTEX_START = malloc(2*sizeof(synctex_node_t)))) { + if(bestDistances.left>bestDistances.right) { + ((synctex_node_t *)SYNCTEX_START)[0] = bestNodes.right; + ((synctex_node_t *)SYNCTEX_START)[1] = bestNodes.left; + } else { + ((synctex_node_t *)SYNCTEX_START)[0] = bestNodes.left; + ((synctex_node_t *)SYNCTEX_START)[1] = bestNodes.right; + } + SYNCTEX_END = SYNCTEX_START + 2*sizeof(synctex_node_t); + SYNCTEX_CUR = NULL; + return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); + } + return SYNCTEX_STATUS_ERROR; + } + /* both nodes have the same input coordinates + * We choose the one closest to the hit point */ + if(bestDistances.left>bestDistances.right) { + bestNodes.left = bestNodes.right; + } + bestNodes.right = NULL; + } else if(bestNodes.right) { + bestNodes.left = bestNodes.right; + } else if(!bestNodes.left){ + bestNodes.left = node; + } + if((SYNCTEX_START = malloc(sizeof(synctex_node_t)))) { + * (synctex_node_t *)SYNCTEX_START = bestNodes.left; + SYNCTEX_END = SYNCTEX_START + sizeof(synctex_node_t); + SYNCTEX_CUR = NULL; + return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); + } return SYNCTEX_STATUS_ERROR; } + } while ((node = SYNCTEX_NEXT_HORIZ_BOX(node))); + } + /* We are not lucky */ + if((node = SYNCTEX_CHILD(sheet))) { + goto end; + } + return 0; +} + +# ifdef SYNCTEX_NOTHING +# pragma mark - +# pragma mark Utilities +# endif + +int _synctex_bail(void) { + _synctex_error("SyncTeX ERROR\n"); + return -1; +} +/* Rougly speaking, this is: + * node's h coordinate - hitPoint's h coordinate. + * If node is to the right of the hit point, then this distance is positive, + * if node is to the left of the hit point, this distance is negative.*/ +int _synctex_point_h_distance(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible); +int _synctex_point_h_distance(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible) { + if(node) { + int min,med,max; + switch(node->class->type) { + /* The distance between a point and a box is special. + * It is not the euclidian distance, nor something similar. + * We have to take into account the particular layout, + * and the box hierarchy. + * Given a box, there are 9 regions delimited by the lines of the edges of the box. + * The origin being at the top left corner of the page, + * we also give names to the vertices of the box. + * + * 1 | 2 | 3 + * ---A---B---> + * 4 | 5 | 6 + * ---C---D---> + * 7 | 8 | 9 + * v v + */ + case synctex_node_type_hbox: + /* getting the box bounds, taking into account negative width, height and depth. */ + min = visible?SYNCTEX_HORIZ_V(node):SYNCTEX_HORIZ(node); + max = min + (visible?SYNCTEX_ABS_WIDTH_V(node):SYNCTEX_ABS_WIDTH(node)); + /* We allways have min <= max */ + if(hitPoint.h<min) { + return min - hitPoint.h; /* regions 1+4+7, result is > 0 */ + } else if (hitPoint.h>max) { + return max - hitPoint.h; /* regions 3+6+9, result is < 0 */ + } else { + return 0; /* regions 2+5+8, inside the box, except for vertical coordinates */ + } + break; + case synctex_node_type_vbox: + case synctex_node_type_void_vbox: + case synctex_node_type_void_hbox: + /* getting the box bounds, taking into account negative width, height and depth. + * For these boxes, no visible dimension available */ + min = SYNCTEX_HORIZ(node); + max = min + SYNCTEX_ABS_WIDTH(node); + /* We allways have min <= max */ + if(hitPoint.h<min) { + return min - hitPoint.h; /* regions 1+4+7, result is > 0 */ + } else if (hitPoint.h>max) { + return max - hitPoint.h; /* regions 3+6+9, result is < 0 */ + } else { + return 0; /* regions 2+5+8, inside the box, except for vertical coordinates */ + } + break; + case synctex_node_type_kern: + /* IMPORTANT NOTICE: the location of the kern is recorded AFTER the move. + * The distance to the kern is very special, + * in general, there is no text material in the kern, + * this is why we compute the offset relative to the closest edge of the kern.*/ + max = SYNCTEX_WIDTH(node); + if(max<0) { + min = SYNCTEX_HORIZ(node); + max = min - max; + } else { + min = -max; + max = SYNCTEX_HORIZ(node); + min += max; + } + med = (min+max)/2; + /* positive kern: '.' means text, '>' means kern offset + * ............. + * min>>>>med>>>>max + * ............... + * negative kern: '.' means text, '<' means kern offset + * ............................ + * min<<<<med<<<<max + * ................................. + * Actually, we do not take into account negative widths. + * There is a problem for such situation when there is efectively overlapping text. + * But this should be extremely rare. I guess that in that case, many different choices + * could be made, one being in contradiction of the other. + * It means that the best choice should be made according to the situation that occurs + * most frequently. + */ + if(hitPoint.h<min) { + return min - hitPoint.h + 1; /* penalty to ensure other nodes are chosen first in case of overlapping ones */ + } else if (hitPoint.h>max) { + return max - hitPoint.h - 1; /* same kind of penalty */ + } else if (hitPoint.h>med) { + /* do things like if the node had 0 width and was placed at the max edge + 1*/ + return max - hitPoint.h + 1; /* positive, the kern is to the right of the hitPoint */ + } else { + return min - hitPoint.h - 1; /* negative, the kern is to the left of the hitPoint */ + } + case synctex_node_type_glue: + case synctex_node_type_math: + return SYNCTEX_HORIZ(node) - hitPoint.h; } - /* Then we try to find what is the best child node inside the box best_node, - * which means the node closest to the hit point.*/ - distance = INT_MAX; - if(node = _synctex_best_child_node(best_node,H,V,&distance)) { - if((SYNCTEX_START = malloc(sizeof(synctex_node_t)))) { - * (synctex_node_t *)SYNCTEX_START = node; - SYNCTEX_END = SYNCTEX_START + sizeof(synctex_node_t); - SYNCTEX_CUR = NULL; - return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); - } else { - return SYNCTEX_STATUS_ERROR; - } + } + return INT_MAX;/* We always assume that the node is faraway to the right*/ +} +/* Rougly speaking, this is: + * node's v coordinate - hitPoint's v coordinate. + * If node is at the top of the hit point, then this distance is positive, + * if node is at the bottom of the hit point, this distance is negative.*/ +int _synctex_point_v_distance(synctex_point_t hitPoint, synctex_node_t node,synctex_bool_t visible); +int _synctex_point_v_distance(synctex_point_t hitPoint, synctex_node_t node,synctex_bool_t visible) { +# ifdef __DARWIN_UNIX03 +# pragma unused(visible) +# endif + if(node) { + int min,max; + switch(node->class->type) { + /* The distance between a point and a box is special. + * It is not the euclidian distance, nor something similar. + * We have to take into account the particular layout, + * and the box hierarchy. + * Given a box, there are 9 regions delimited by the lines of the edges of the box. + * The origin being at the top left corner of the page, + * we also give names to the vertices of the box. + * + * 1 | 2 | 3 + * ---A---B---> + * 4 | 5 | 6 + * ---C---D---> + * 7 | 8 | 9 + * v v + */ + case synctex_node_type_hbox: + /* getting the box bounds, taking into account negative width, height and depth. */ + min = SYNCTEX_VERT_V(node); + max = min + SYNCTEX_ABS_DEPTH_V(node); + min -= SYNCTEX_ABS_HEIGHT_V(node); + /* We allways have min <= max */ + if(hitPoint.v<min) { + return min - hitPoint.v; /* regions 1+2+3, result is > 0 */ + } else if (hitPoint.v>max) { + return max - hitPoint.v; /* regions 7+8+9, result is < 0 */ + } else { + return 0; /* regions 4.5.6, inside the box, except for horizontal coordinates */ + } + break; + case synctex_node_type_vbox: + case synctex_node_type_void_vbox: + case synctex_node_type_void_hbox: + /* getting the box bounds, taking into account negative width, height and depth. */ + min = SYNCTEX_VERT(node); + max = min + SYNCTEX_ABS_DEPTH(node); + min -= SYNCTEX_ABS_HEIGHT(node); + /* We allways have min <= max */ + if(hitPoint.v<min) { + return min - hitPoint.v; /* regions 1+2+3, result is > 0 */ + } else if (hitPoint.v>max) { + return max - hitPoint.v; /* regions 7+8+9, result is < 0 */ + } else { + return 0; /* regions 4.5.6, inside the box, except for horizontal coordinates */ + } + break; + case synctex_node_type_kern: + case synctex_node_type_glue: + case synctex_node_type_math: + return SYNCTEX_VERT(node) - hitPoint.v; } - /* We could not find a best node closest to the hit point. - * This is unreachable code because all the boxes here are non void boxes. */ - if((node = SYNCTEX_NEXT_BOX(best_node))) { - goto next_box; - } else { - return 0; - } - } - node = best_node; - /* Now we have best_distance>0 - * We continue through the non void box list until we find the box closest to the hit point */ - while(node = SYNCTEX_NEXT_BOX(node)) { - maxH = SYNCTEX_WIDTH_V(node); - if(maxH<0) { - minH = maxH; - maxH = SYNCTEX_HORIZ_V(node); - minH += maxH; - } else { - minH = SYNCTEX_HORIZ_V(node); - maxH += minH; - } - minV = SYNCTEX_VERT_V(node); - maxV = minV + SYNCTEX_DEPTH_V(node); - minV -= SYNCTEX_HEIGHT_V(node); - if(V<minV) { - if(H<minH) { - /* This is region 1. The distance to the box is the L1 distance PA. */ - distance = minV - V + minH - H;/* Integer overflow? probability epsilon */ - } else if(H<=maxH) { - /* This is region 2. The distance to the box is the geometrical distance to the top edge. */ - distance = minV - V; - } else { - /* This is region 3. The distance to the box is the L1 distance PB. */ - distance = minV - V + H - maxH; - } - } else if(V<=maxV) { - if(H<minH) { - /* This is region 4. The distance to the box is the geometrical distance to the left edge. */ - distance = minH - H; - } else if(H<=maxH) { - /* This is region 4. We are inside the box. */ - distance = 0; - } else { - /* This is region 6. The distance to the box is the geometrical distance to the right edge. */ - distance = H - maxH; - } - } else { - if(H<minH) { - /* This is region 7. The distance to the box is the L1 distance PC. */ - distance = V - maxV + minH - H; - } else if(H<=maxH) { - /* This is region 8. The distance to the box is the geometrical distance to the top edge. */ - distance = V - maxV; - } else { - /* This is region 9. The distance to the box is the L1 distance PD. */ - distance = V - maxV + H - maxH; - } + } + return INT_MAX;/* We always assume that the node is faraway to the top*/ +} + +SYNCTEX_INLINE static synctex_node_t _synctex_smallest_container(synctex_node_t node, synctex_node_t other_node) { + float height, other_height; + if(SYNCTEX_WIDTH(node)<SYNCTEX_WIDTH(other_node)) { + return node; + } + if(SYNCTEX_WIDTH(node)>SYNCTEX_WIDTH(other_node)) { + return other_node; + } + height = SYNCTEX_ABS_DEPTH(node) + SYNCTEX_ABS_HEIGHT(node); + other_height = SYNCTEX_ABS_DEPTH(other_node) + SYNCTEX_ABS_HEIGHT(other_node); + if(height<other_height) { + return node; + } + if(height>other_height) { + return other_node; + } + return node; +} + +synctex_bool_t _synctex_point_in_box(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible) { + if(node) { + if(0 == _synctex_point_h_distance(hitPoint,node,visible) + && 0 == _synctex_point_v_distance(hitPoint,node,visible)) { + return synctex_YES; } - if(distance>0) { - /* This box does not contain the hit point */ - if(distance<best_distance) { - /* but it is closer */ - best_distance = distance; - best_node = node; - } - } else { - /* This box contains the hit point */ - best_node = node; - /* Is ther a better container, that was not a non void box?*/ - if((best_container = _synctex_best_container(node,H,V)) && (best_container != best_node)) { - /* the answer is yes */ - if((SYNCTEX_START = malloc(sizeof(synctex_node_t)))) { - * (synctex_node_t *)SYNCTEX_START = best_container; - SYNCTEX_END = SYNCTEX_START + sizeof(synctex_node_t); - SYNCTEX_CUR = NULL; - return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); + } + return synctex_NO; +} + +int _synctex_node_distance_to_point(synctex_point_t hitPoint, synctex_node_t node, synctex_bool_t visible) { +# ifdef __DARWIN_UNIX03 +# pragma unused(visible) +# endif + int result = INT_MAX; /* when the distance is meaning less (sheet, input...) */ + if(node) { + int minH,maxH,minV,maxV; + switch(node->class->type) { + /* The distance between a point and a box is special. + * It is not the euclidian distance, nor something similar. + * We have to take into account the particular layout, + * and the box hierarchy. + * Given a box, there are 9 regions delimited by the lines of the edges of the box. + * The origin being at the top left corner of the page, + * we also give names to the vertices of the box. + * + * 1 | 2 | 3 + * ---A---B---> + * 4 | 5 | 6 + * ---C---D---> + * 7 | 8 | 9 + * v v + * In each region, there is a different formula. + * In the end we have a continuous distance which may not be a mathematical distance but who cares. */ + case synctex_node_type_vbox: + case synctex_node_type_void_vbox: + case synctex_node_type_hbox: + case synctex_node_type_void_hbox: + /* getting the box bounds, taking into account negative widths. */ + minH = SYNCTEX_HORIZ(node); + maxH = minH + SYNCTEX_ABS_WIDTH(node); + minV = SYNCTEX_VERT(node); + maxV = minV + SYNCTEX_ABS_DEPTH(node); + minV -= SYNCTEX_ABS_HEIGHT(node); + /* In what region is the point hitPoint=(H,V) ? */ + if(hitPoint.v<minV) { + if(hitPoint.h<minH) { + /* This is region 1. The distance to the box is the L1 distance PA. */ + result = minV - hitPoint.v + minH - hitPoint.h;/* Integer overflow? probability epsilon */ + } else if(hitPoint.h<=maxH) { + /* This is region 2. The distance to the box is the geometrical distance to the top edge. */ + result = minV - hitPoint.v; + } else { + /* This is region 3. The distance to the box is the L1 distance PB. */ + result = minV - hitPoint.v + hitPoint.h - maxH; + } + } else if(hitPoint.v<=maxV) { + if(hitPoint.h<minH) { + /* This is region 4. The distance to the box is the geometrical distance to the left edge. */ + result = minH - hitPoint.h; + } else if(hitPoint.h<=maxH) { + /* This is region 4. We are inside the box. */ + result = 0; + } else { + /* This is region 6. The distance to the box is the geometrical distance to the right edge. */ + result = hitPoint.h - maxH; + } } else { - return SYNCTEX_STATUS_ERROR; + if(hitPoint.h<minH) { + /* This is region 7. The distance to the box is the L1 distance PC. */ + result = hitPoint.v - maxV + minH - hitPoint.h; + } else if(hitPoint.h<=maxH) { + /* This is region 8. The distance to the box is the geometrical distance to the top edge. */ + result = hitPoint.v - maxV; + } else { + /* This is region 9. The distance to the box is the L1 distance PD. */ + result = hitPoint.v - maxV + hitPoint.h - maxH; + } } - } - /* the best_node is also the best_container, just find the closest child node. */ - distance = INT_MAX; - if(best_node = _synctex_best_child_node(best_node,H,V,&distance)) { - if((SYNCTEX_START = malloc(sizeof(synctex_node_t)))) { - * (synctex_node_t *)SYNCTEX_START = best_node; - SYNCTEX_END = SYNCTEX_START + sizeof(synctex_node_t); - SYNCTEX_CUR = NULL; - return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); + break; + case synctex_node_type_kern: + maxH = SYNCTEX_WIDTH(node); + if(maxH<0) { + minH = SYNCTEX_HORIZ(node); + maxH = minH - maxH; + } else { + minH = -maxH; + maxH = SYNCTEX_HORIZ(node); + minH += maxH; + } + minV = SYNCTEX_VERT(node); + if(hitPoint.h<minH) { + if(hitPoint.v>minV) { + result = hitPoint.v - minV + minH - hitPoint.h; + } else { + result = minV - hitPoint.v + minH - hitPoint.h; + } + } else if (hitPoint.h>maxH) { + if(hitPoint.v>minV) { + result = hitPoint.v - minV + hitPoint.h - maxH; + } else { + result = minV - hitPoint.v + hitPoint.h - maxH; + } + } else if(hitPoint.v>minV) { + result = hitPoint.v - minV; + } else { + result = minV - hitPoint.v; + } + break; + case synctex_node_type_glue: + case synctex_node_type_math: + minH = SYNCTEX_HORIZ(node); + minV = SYNCTEX_VERT(node); + if(hitPoint.h<minH) { + if(hitPoint.v>minV) { + result = hitPoint.v - minV + minH - hitPoint.h; + } else { + result = minV - hitPoint.v + minH - hitPoint.h; + } + } else if(hitPoint.v>minV) { + result = hitPoint.v - minV + hitPoint.h - minH; } else { - return SYNCTEX_STATUS_ERROR; + result = minV - hitPoint.v + hitPoint.h - minH; + } + break; + } + } + return result; +} + +static synctex_node_t _synctex_eq_deepest_container(synctex_point_t hitPoint,synctex_node_t node, synctex_bool_t visible) { + if(node) { + synctex_node_t result = NULL; + synctex_node_t child = NULL; + switch(node->class->type) { + case synctex_node_type_vbox: + case synctex_node_type_hbox: + /* test the deep nodes first */ + if((child = SYNCTEX_CHILD(node))) { + do { + if((result = _synctex_eq_deepest_container(hitPoint,child,visible))) { + return result; + } + } while((child = SYNCTEX_SIBLING(child))); + } + /* is the hit point inside the box? */ + if(_synctex_point_in_box(hitPoint,node,visible)) { + if(node && (node->class->type == synctex_node_type_vbox) && (child = SYNCTEX_CHILD(node))) { + int bestDistance = INT_MAX; + do { + if(SYNCTEX_CHILD(child)) { + int distance = _synctex_node_distance_to_point(hitPoint,child,visible); + if(distance < bestDistance) { + bestDistance = distance; + node = child; + } + } + } while((child = SYNCTEX_SIBLING(child))); + } + return node; + } + } + } + return NULL; +} + +/* Compares the locations of the hitPoint with the locations of the various nodes contained in the box. + * As it is an horizontal box, we only compare horizontal coordinates. */ +SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_hbox(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef, synctex_bool_t visible); +SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_hbox(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef, synctex_bool_t visible) { + int result = 0; + if((node = SYNCTEX_CHILD(node))) { + do { + int off7 = _synctex_point_h_distance(hitPoint,node,visible); + if(off7 > 0) { + /* node is to the right of the hit point. + * We compare node and the previously recorded one, through the recorded distance. + * If the nodes have the same tag, prefer the one with the smallest line number, + * if the nodes also have the same line number, prefer the one with the smallest column. */ + if(bestDistancesRef->right > off7) { + bestDistancesRef->right = off7; + bestNodesRef->right = node; + result |= SYNCTEX_MASK_RIGHT; + } else if(bestDistancesRef->right == off7 && bestNodesRef->right) { + if(SYNCTEX_TAG(bestNodesRef->right) == SYNCTEX_TAG(node) + && (SYNCTEX_LINE(bestNodesRef->right) > SYNCTEX_LINE(node) + || (SYNCTEX_LINE(bestNodesRef->right) == SYNCTEX_LINE(node) + && SYNCTEX_COLUMN(bestNodesRef->right) > SYNCTEX_COLUMN(node)))) { + bestNodesRef->right = node; + result |= SYNCTEX_MASK_RIGHT; + } + } + } else if(off7 == 0) { + bestDistancesRef->left = bestDistancesRef->right = 0; + bestNodesRef->left = node; + bestNodesRef->right = NULL; + result |= SYNCTEX_MASK_LEFT; + } else { /* here off7 < 0 */ + off7 = -off7; + if(bestDistancesRef->left > off7) { + bestDistancesRef->left = off7; + bestNodesRef->left = node; + result |= SYNCTEX_MASK_LEFT; + } else if(bestDistancesRef->left == off7 && bestNodesRef->left) { + if(SYNCTEX_TAG(bestNodesRef->left) == SYNCTEX_TAG(node) + && (SYNCTEX_LINE(bestNodesRef->left) > SYNCTEX_LINE(node) + || (SYNCTEX_LINE(bestNodesRef->left) == SYNCTEX_LINE(node) + && SYNCTEX_COLUMN(bestNodesRef->left) > SYNCTEX_COLUMN(node)))) { + bestNodesRef->left = node; + result |= SYNCTEX_MASK_LEFT; + } } } - /* We should have stopped here because _synctex_best_child_node always returns something for non void boxes. */ - } - } - /* Bad luck, no non void box does contain the hit point, we have to work harder. - * We start from the top (the sheet's child) and try to find a box that contains the hit point. - * It is a bit long but it should occur only seldomly. */ - if((node = SYNCTEX_CHILD(sheet)) && (best_container = _synctex_best_container(node,H,V)) && (best_container != best_node)) { - /* in fact, we always have best_container != best_node, because the former contains the hit point, but not the latter. - * At that point, we are sure that the distance between the hit point and the best_node is positive. */ - if((SYNCTEX_START = malloc(sizeof(synctex_node_t)))) { - * (synctex_node_t *)SYNCTEX_START = best_container; - SYNCTEX_END = SYNCTEX_START + sizeof(synctex_node_t); - SYNCTEX_CUR = NULL; - return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); - } else { - return SYNCTEX_STATUS_ERROR; + } while((node = SYNCTEX_SIBLING(node))); + if(result & SYNCTEX_MASK_LEFT) { + /* the left node is new, try to narrow the result */ + if((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->left,visible))) { + bestNodesRef->left = node; + } + if((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->left,visible))) { + bestNodesRef->left = node; + } + } + if(result & SYNCTEX_MASK_RIGHT) { + /* the right node is new, try to narrow the result */ + if((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->right,visible))) { + bestNodesRef->right = node; + } + if((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->right,visible))) { + bestNodesRef->right = node; + } } } - /* Last chance, return the best_node or its best child. */ - if(best_node) { - distance = INT_MAX; - if((node = _synctex_best_child_node(best_node,H,V,&distance))) { - best_node = node; + return result; +} +SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_vbox(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef,synctex_bool_t visible); +SYNCTEX_INLINE static int __synctex_eq_get_closest_children_in_vbox(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef,synctex_bool_t visible) { + int result = 0; + if((node = SYNCTEX_CHILD(node))) { + do { + int off7 = _synctex_point_v_distance(hitPoint,node,visible);/* this is what makes the difference with the h version above */ + if(off7 > 0) { + /* node is to the top of the hit point (below because TeX is oriented from top to bottom. + * We compare node and the previously recorded one, through the recorded distance. + * If the nodes have the same tag, prefer the one with the smallest line number, + * if the nodes also have the same line number, prefer the one with the smallest column. */ + if(bestDistancesRef->right > off7) { + bestDistancesRef->right = off7; + bestNodesRef->right = node; + result |= SYNCTEX_MASK_RIGHT; + } else if(bestDistancesRef->right == off7 && bestNodesRef->right) { + if(SYNCTEX_TAG(bestNodesRef->right) == SYNCTEX_TAG(node) + && (SYNCTEX_LINE(bestNodesRef->right) > SYNCTEX_LINE(node) + || (SYNCTEX_LINE(bestNodesRef->right) == SYNCTEX_LINE(node) + && SYNCTEX_COLUMN(bestNodesRef->right) > SYNCTEX_COLUMN(node)))) { + bestNodesRef->right = node; + result |= SYNCTEX_MASK_RIGHT; + } + } + } else if(off7 == 0) { + bestDistancesRef->left = bestDistancesRef->right = 0; + bestNodesRef->left = node; + bestNodesRef->right = NULL; + result |= SYNCTEX_MASK_LEFT; + } else { /* here off7 < 0 */ + off7 = -off7; + if(bestDistancesRef->left > off7) { + bestDistancesRef->left = off7; + bestNodesRef->left = node; + result |= SYNCTEX_MASK_LEFT; + } else if(bestDistancesRef->left == off7 && bestNodesRef->left) { + if(SYNCTEX_TAG(bestNodesRef->left) == SYNCTEX_TAG(node) + && (SYNCTEX_LINE(bestNodesRef->left) > SYNCTEX_LINE(node) + || (SYNCTEX_LINE(bestNodesRef->left) == SYNCTEX_LINE(node) + && SYNCTEX_COLUMN(bestNodesRef->left) > SYNCTEX_COLUMN(node)))) { + bestNodesRef->left = node; + result |= SYNCTEX_MASK_LEFT; + } + } + } + } while((node = SYNCTEX_SIBLING(node))); + if(result & SYNCTEX_MASK_LEFT) { + /* the left node is new, try to narrow the result */ + if((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->left,visible))) { + bestNodesRef->left = node; + } + if((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->left,visible))) { + bestNodesRef->left = node; + } } - if((SYNCTEX_START = malloc(sizeof(synctex_node_t)))) { - * (synctex_node_t *)SYNCTEX_START = best_node; - SYNCTEX_END = SYNCTEX_START + sizeof(synctex_node_t); - SYNCTEX_CUR = NULL; - return (SYNCTEX_END-SYNCTEX_START)/sizeof(synctex_node_t); - } else { - return SYNCTEX_STATUS_ERROR; + if(result & SYNCTEX_MASK_RIGHT) { + /* the right node is new, try to narrow the result */ + if((node = _synctex_eq_deepest_container(hitPoint,bestNodesRef->right,visible))) { + bestNodesRef->right = node; + } + if((node = _synctex_eq_closest_child(hitPoint,bestNodesRef->right,visible))) { + bestNodesRef->right = node; + } + } + } + return result; +} +SYNCTEX_INLINE static int _synctex_eq_get_closest_children_in_box(synctex_point_t hitPoint, synctex_node_t node, synctex_node_set_t* bestNodesRef,synctex_distances_t* bestDistancesRef,synctex_bool_t visible) { + if(node) { + switch(node->class->type) { + case synctex_node_type_hbox: + return __synctex_eq_get_closest_children_in_hbox(hitPoint, node, bestNodesRef, bestDistancesRef,visible); + case synctex_node_type_vbox: + return __synctex_eq_get_closest_children_in_vbox(hitPoint, node, bestNodesRef, bestDistancesRef,visible); } } return 0; } -synctex_node_t synctex_next_result(synctex_scanner_t scanner) { - if(NULL == SYNCTEX_CUR) { - SYNCTEX_CUR = SYNCTEX_START; - } else { - SYNCTEX_CUR+=sizeof(synctex_node_t); - } - if(SYNCTEX_CUR<SYNCTEX_END) { - return *(synctex_node_t*)SYNCTEX_CUR; - } else { - return NULL; +SYNCTEX_INLINE static synctex_node_t __synctex_eq_closest_child(synctex_point_t hitPoint, synctex_node_t node,int* distanceRef, synctex_bool_t visible); +SYNCTEX_INLINE static synctex_node_t __synctex_eq_closest_child(synctex_point_t hitPoint, synctex_node_t node,int* distanceRef, synctex_bool_t visible) { + synctex_node_t best_node = NULL; + if((node = SYNCTEX_CHILD(node))) { + do { + int distance = _synctex_node_distance_to_point(hitPoint,node,visible); + synctex_node_t candidate = NULL; + if(distance<=*distanceRef) { + *distanceRef = distance; + best_node = node; + } + switch(node->class->type) { + case synctex_node_type_vbox: + case synctex_node_type_hbox: + if((candidate = __synctex_eq_closest_child(hitPoint,node,distanceRef,visible))) { + best_node = candidate; + } + } + } while((node = SYNCTEX_SIBLING(node))); } + return best_node; } - -int synctex_bail(void) { - fprintf(stderr,"SyncTeX ERROR\n"); - return -1; +SYNCTEX_INLINE static synctex_node_t _synctex_eq_closest_child(synctex_point_t hitPoint,synctex_node_t node, synctex_bool_t visible) { + if(node) { + switch(node->class->type) { + case synctex_node_type_hbox: + case synctex_node_type_vbox: + { + int best_distance = INT_MAX; + synctex_node_t best_node = __synctex_eq_closest_child(hitPoint,node,&best_distance,visible); + if((best_node)) { + synctex_node_t child = NULL; + switch(best_node->class->type) { + case synctex_node_type_vbox: + case synctex_node_type_hbox: + if((child = SYNCTEX_CHILD(best_node))) { + best_distance = _synctex_node_distance_to_point(hitPoint,child,visible); + while((child = SYNCTEX_SIBLING(child))) { + int distance = _synctex_node_distance_to_point(hitPoint,child,visible); + if(distance<=best_distance) { + best_distance = distance; + best_node = child; + } + } + } + } + } + return best_node; + } + } + } + return NULL; } # ifdef SYNCTEX_NOTHING -# pragma mark ===== updater +# pragma mark - +# pragma mark Updater # endif -typedef int (*synctex_fprintf_t)(void *, const char * , ...); /* print formatted to either FILE * or gzFile */ +typedef int (*synctex_fprintf_t)(void *, const char * , ...); /* print formatted to either FILE * or gzFile */ # define SYNCTEX_BITS_PER_BYTE 8 @@ -3553,86 +4061,56 @@ struct __synctex_updater_t { int length; /* the number of chars appended */ struct _flags { unsigned int no_gz:1; /* Whether zlib is used or not */ - unsigned int reserved:SYNCTEX_BITS_PER_BYTE*sizeof(int)-1; /* Align */ + unsigned int reserved:SYNCTEX_BITS_PER_BYTE*sizeof(int)-1; /* Align */ } flags; }; # define SYNCTEX_FILE updater->file # define SYNCTEX_NO_GZ ((updater->flags).no_gz) # define SYNCTEX_fprintf (*(updater->fprintf)) -# define SYNCTEX_YES (-1) -# define SYNCTEX_NO (0) - -synctex_updater_t synctex_updater_new_with_output_file(const char * output); -void synctex_updater_append_magnification(synctex_updater_t updater, char * magnification); -void synctex_updater_append_x_offset(synctex_updater_t updater, char * x_offset); -void synctex_updater_append_y_offset(synctex_updater_t updater, char * y_offset); -void synctex_updater_free(synctex_updater_t updater); -synctex_updater_t synctex_updater_new_with_output_file(const char * output){ +synctex_updater_t synctex_updater_new_with_output_file(const char * output, const char * build_directory) { synctex_updater_t updater = NULL; char * synctex = NULL; size_t size = 0; - /* prepare the updater */ + synctex_io_mode_t io_mode = synctex_io_mode_read; + const char * mode; + /* prepare the updater */ updater = (synctex_updater_t)_synctex_malloc(sizeof(synctex_updater_t)); if(NULL == updater) { - fprintf(stderr,"! synctex_updater_new_with_file: malloc problem"); + _synctex_error("! synctex_updater_new_with_file: malloc problem"); return NULL; } - size = strlen(output)+strlen(synctex_suffix)+strlen(synctex_suffix_gz)+1; - synctex = (char *)malloc(size); - if(NULL == synctex) { - fprintf(stderr,"! synctex_updater_new_with_output_file: Memory problem (1)\n"); -return_on_error1: + if(_synctex_open(output,build_directory,&synctex,&SYNCTEX_FILE,synctex_NO,&io_mode) + && _synctex_open(output,build_directory,&synctex,&SYNCTEX_FILE,synctex_YES,&io_mode)) { +return_on_error: free(updater); return NULL; } - /* we have reserved for synctex enough memory to copy output and both suffices, - * including the terminating character */ - if(synctex != strcpy(synctex,output)) { - fprintf(stderr,"! synctex_updater_new_with_output_file: Copy problem\n"); -return_on_error2: - free(synctex); - goto return_on_error1; - } - /* remove the last path extension if any */ - synctex_strip_last_path_extension(synctex); - /* append the synctex suffix */ - if(synctex != strcat(synctex,synctex_suffix)){ - fprintf(stderr,"! synctex_scanner_new_with_output_file: Concatenation problem (can't add suffix '%s')\n",synctex_suffix); - goto return_on_error2; - } - if(NULL != (SYNCTEX_FILE = fopen(synctex,"r"))){ - /* OK, the file exists */ - fclose(SYNCTEX_FILE); - if(NULL == (SYNCTEX_FILE = (void *)fopen(synctex,"a"))) { + /* OK, the file exists */ + gzclose(SYNCTEX_FILE); + SYNCTEX_FILE = NULL; + SYNCTEX_NO_GZ = io_mode%2?synctex_NO:synctex_YES; + mode = synctex_io_modes[io_mode+synctex_io_mode_append];/* either "a" or "ab", depending on the file extension */ + if(SYNCTEX_NO_GZ) { + if(NULL == (SYNCTEX_FILE = (void *)fopen(synctex,mode))) { no_write_error: - fprintf(stderr,"! synctex_updater_new_with_file: Can't append to %s",synctex); - goto return_on_error2; + _synctex_error("! synctex_updater_new_with_file: Can't append to %s",synctex); + free(synctex); + goto return_on_error; } - SYNCTEX_NO_GZ = SYNCTEX_YES; updater->fprintf = (synctex_fprintf_t)(&fprintf); -return_updater: - printf("SyncTeX: updating %s...",synctex); - free(synctex); - return updater; - } - /* append the gz suffix */ - if(synctex != strcat(synctex,synctex_suffix_gz)){ - fprintf(stderr,"! synctex_scanner_new_with_output_file: Concatenation problem (can't add suffix '%s')\n",synctex_suffix_gz); - goto return_on_error2; - } - if(NULL != (SYNCTEX_FILE = gzopen(synctex,"r"))){ - gzclose(SYNCTEX_FILE); - if(NULL == (SYNCTEX_FILE = gzopen(synctex,"a"))) { + } else { + if(NULL == (SYNCTEX_FILE = (void *)gzopen(synctex,mode))) { goto no_write_error; } - SYNCTEX_NO_GZ = SYNCTEX_NO; updater->fprintf = (synctex_fprintf_t)(&gzprintf); - goto return_updater; } - goto return_on_error2; + printf("SyncTeX: updating %s...",synctex); + free(synctex); + return updater; } + void synctex_updater_append_magnification(synctex_updater_t updater, char * magnification){ if(NULL==updater) { return; @@ -3676,5 +4154,3 @@ void synctex_updater_free(synctex_updater_t updater){ printf("... done.\n"); return; } - - diff --git a/Build/source/texk/web2c/synctexdir/synctex_parser.h b/Build/source/texk/web2c/synctexdir/synctex_parser.h index f698ffb5a7e..6f549a489bc 100644 --- a/Build/source/texk/web2c/synctexdir/synctex_parser.h +++ b/Build/source/texk/web2c/synctexdir/synctex_parser.h @@ -1,8 +1,13 @@ /* -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:16:51 UTC 2009 + +Version: 1.6 +See synctex_parser_readme.txt for more details + License: -------- Permission is hereby granted, free of charge, to any person @@ -49,46 +54,124 @@ Thu Jun 19 09:39:21 UTC 2008 #ifndef __SYNCTEX_PARSER__ # define __SYNCTEX_PARSER__ -/* synctex_node_t is the type for all synctex nodes. - * The synctex file is parsed into a tree of nodes, either sheet, boxes, math nodes... */ -typedef struct _synctex_node * synctex_node_t; - -/* The main synctex object is a scanner - * Its implementation is considered private. - * The basic workflow is - * - create a scanner with a file - * - perform actions on that scanner - * - free the scanner - */ -typedef struct __synctex_scanner_t _synctex_scanner_t; -typedef _synctex_scanner_t * synctex_scanner_t; - #ifdef __cplusplus extern "C" { #endif -/* This is the designated method to create a new synctex scanner object. - * output is the pdf/dvi/xdv file associated to the synctex file. - * If relevant, it can be the tex file that originated the synctex file - * but it might cause problems if the \jobname has a custom value. - * The last file extension is removed and replaced by the proper extension. - * Then the private method synctex_scanner_new_with_contents_of_file is called. - * NULL is returned in case of an error or non existent file. +/* synctex_node_t is the type for all synctex nodes. + * The synctex file is parsed into a tree of nodes, either sheet, boxes, math nodes... */ +typedef struct _synctex_node * synctex_node_t; + +/* The main synctex object is a scanner + * Its implementation is considered private. + * The basic workflow is + * - create a "synctex scanner" with the contents of a file + * - perform actions on that scanner like display or edit queries + * - free the scanner when the work is done + */ +typedef struct __synctex_scanner_t _synctex_scanner_t; +typedef _synctex_scanner_t * synctex_scanner_t; + +/* This is the designated method to create a new synctex scanner object. + * output is the pdf/dvi/xdv file associated to the synctex file. + * If necessary, it can be the tex file that originated the synctex file + * but this might cause problems if the \jobname has a custom value. + * Despite this method can accept a relative path in practice, + * you should only pass a full path name. + * The path should be encoded by the underlying file system, + * assuming that it is based on 8 bits characters, including UTF8, + * not 16 bits nor 32 bits. + * The last file extension is removed and replaced by the proper extension. + * Then the private method _synctex_scanner_new_with_contents_of_file is called. + * NULL is returned in case of an error or non existent file. + * Once you have a scanner, use the synctex_display_query and synctex_edit_query below. + * The new "build_directory" argument is available since version 1.5. + * It is the directory where all the auxiliary stuff is created. + * Sometimes, the synctex output file and the pdf, dvi or xdv files are not created in the same directory. + * This is the case in MikTeX (I will include this into TeX Live). + * This directory path can be nil, it will be ignored. + * It can be either absolute or relative to the directory of the output pdf (dvi or xdv) file. + * If no synctex file is found in the same directory as the output file, then we try to find one in the build directory. + * Please note that this new "build_directory" is provided as a convenient argument but should not be used. + * In fact, this is implempented as a work around of a bug in MikTeX where the synctex file does not follow the pdf file. + * The new "parse" argument is available since version 1.5. In general, use 1. + * Use 0 only if you do not want to parse the content but just check the existence. */ -synctex_scanner_t synctex_scanner_new_with_output_file(const char * output); +synctex_scanner_t synctex_scanner_new_with_output_file(const char * output, const char * build_directory, int parse); -/* This is the designated method to delete a synctex scanner object. - * Frees all the memory. +/* This is the designated method to delete a synctex scanner object. + * Frees all the memory, you must call it when you are finished with the scanner. */ void synctex_scanner_free(synctex_scanner_t scanner); -/* Display all the information contained in the scanner object. - * If the records are too numerous, only the first ones are displayed. - * This is mainly for informatinal purpose to help developers. +/* Send this message to force the scanner to parse the contents of the synctex output file. + * Nothing is performed if the file was already parsed. + * In each query below, this message is sent, but if you need to access information more directly, + * you must be sure that the parsing did occur. + * Usage: + * if((my_scanner = synctex_scanner_parse(my_scanner))) { + * continue with my_scanner... + * } else { + * there was a problem + * } + */ +synctex_scanner_t synctex_scanner_parse(synctex_scanner_t scanner); + +/* The main entry points. + * Given the file name, a line and a column number, synctex_display_query returns the number of nodes + * satisfying the contrain. Use code like + * + * if(synctex_display_query(scanner,name,line,column)>0) { + * synctex_node_t node; + * while((node = synctex_next_result(scanner))) { + * // do something with node + * ... + * } + * } + * + * For example, one can + * - highlight each resulting node in the output, using synctex_node_h and synctex_node_v + * - highlight all the rectangles enclosing those nodes, using synctex_box_... functions + * - highlight just the character using that information + * + * Given the page and the position in the page, synctex_edit_query returns the number of nodes + * satisfying the contrain. Use code like + * + * if(synctex_edit_query(scanner,page,h,v)>0) { + * synctex_node_t node; + * while(node = synctex_next_result(scanner)) { + * // do something with node + * ... + * } + * } + * + * For example, one can + * - highlight each resulting line in the input, + * - highlight just the character using that information + * + * page is 1 based + * h and v are coordinates in 72 dpi unit, relative to the top left corner of the page. + * If you make a new query, the result of the previous one is discarded. + * If one of this function returns a non positive integer, + * it means that an error occurred. + * + * Both methods are conservative, in the sense that matching is weak. + * If the exact column number is not found, there will be an answer with the whole line. + * + * Sumatra-PDF, Skim, iTeXMac2 and Texworks are examples of open source software that use this library. + * You can browse their code for a concrete implementation. + */ +int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,int column); +int synctex_edit_query(synctex_scanner_t scanner,int page,float h,float v); +synctex_node_t synctex_next_result(synctex_scanner_t scanner); + +/* Display all the information contained in the scanner object. + * If the records are too numerous, only the first ones are displayed. + * This is mainly for informatinal purpose to help developers. */ void synctex_scanner_display(synctex_scanner_t scanner); -/* The x and y offset of the origin in TeX coordinates. The magnification +/* The x and y offset of the origin in TeX coordinates. The magnification These are used by pdf viewers that want to display the real box size. For example, getting the horizontal coordinates of a node would require synctex_node_box_h(node)*synctex_scanner_magnification(scanner)+synctex_scanner_x_offset(scanner) @@ -100,14 +183,14 @@ int synctex_scanner_x_offset(synctex_scanner_t scanner); int synctex_scanner_y_offset(synctex_scanner_t scanner); float synctex_scanner_magnification(synctex_scanner_t scanner); -/* Managing the input file names. - * Given a tag, synctex_scanner_get_name will return the corresponding file name. - * Conversely, given a file name, synctex_scanner_get_tag will retur, the corresponding tag. - * The file name must be the very same as understood by TeX. - * For example, if you \input myDir/foo.tex, the file name is myDir/foo.tex. - * No automatic path expansion is performed. - * Finally, synctex_scanner_input is the first input node of the scanner. - * To browse all the input node, use a loop like +/* Managing the input file names. + * Given a tag, synctex_scanner_get_name will return the corresponding file name. + * Conversely, given a file name, synctex_scanner_get_tag will retur, the corresponding tag. + * The file name must be the very same as understood by TeX. + * For example, if you \input myDir/foo.tex, the file name is myDir/foo.tex. + * No automatic path expansion is performed. + * Finally, synctex_scanner_input is the first input node of the scanner. + * To browse all the input node, use a loop like * * if((input_node = synctex_scanner_input(scanner))){ * do { @@ -115,9 +198,9 @@ float synctex_scanner_magnification(synctex_scanner_t scanner); * } while((input_node=synctex_node_sibling(input_node))); * } * - * The output is the name that was used to create the scanner. - * The synctex is the real name of the synctex file, - * it was obtained from output by setting the proper file extension. + * The output is the name that was used to create the scanner. + * The synctex is the real name of the synctex file, + * it was obtained from output by setting the proper file extension. */ const char * synctex_scanner_get_name(synctex_scanner_t scanner,int tag); int synctex_scanner_get_tag(synctex_scanner_t scanner,const char * name); @@ -125,27 +208,27 @@ synctex_node_t synctex_scanner_input(synctex_scanner_t scanner); const char * synctex_scanner_get_output(synctex_scanner_t scanner); const char * synctex_scanner_get_synctex(synctex_scanner_t scanner); -/* Browsing the nodes - * parent, child and sibling are standard names for tree nodes. - * The parent is one level higher, the child is one level deeper, - * and the sibling is at the same level. - * The sheet of a node is the first ancestor, it is of type sheet. - * A node and its sibling have the same parent. - * A node is the parent of its child. - * A node is either the child of its parent, - * or belongs to the sibling chain of its parent's child. - * The next node is either the child, the sibling or the parent's sibling, - * unless the parent is a sheet. - * This allows to navigate through all the nodes of a given sheet node: +/* Browsing the nodes + * parent, child and sibling are standard names for tree nodes. + * The parent is one level higher, the child is one level deeper, + * and the sibling is at the same level. + * The sheet of a node is the first ancestor, it is of type sheet. + * A node and its sibling have the same parent. + * A node is the parent of its child. + * A node is either the child of its parent, + * or belongs to the sibling chain of its parent's child. + * The next node is either the child, the sibling or the parent's sibling, + * unless the parent is a sheet. + * This allows to navigate through all the nodes of a given sheet node: * * synctex_node_t node = sheet; * while((node = synctex_node_next(node))) { * // do something with node * } * - * With synctex_sheet_content, you can retrieve the sheet node given the page. - * The page is 1 based, according to TeX standards. - * Conversely synctex_node_sheet allows to retrieve the sheet containing a given node. + * With synctex_sheet_content, you can retrieve the sheet node given the page. + * The page is 1 based, according to TeX standards. + * Conversely synctex_node_sheet allows to retrieve the sheet containing a given node. */ synctex_node_t synctex_node_parent(synctex_node_t node); synctex_node_t synctex_node_sheet(synctex_node_t node); @@ -154,77 +237,77 @@ synctex_node_t synctex_node_sibling(synctex_node_t node); synctex_node_t synctex_node_next(synctex_node_t node); synctex_node_t synctex_sheet_content(synctex_scanner_t scanner,int page); -/* These are the types of the synctex nodes */ +/* These are the types of the synctex nodes */ typedef enum { synctex_node_type_error = 0, + synctex_node_type_input, synctex_node_type_sheet, synctex_node_type_vbox, synctex_node_type_void_vbox, synctex_node_type_hbox, synctex_node_type_void_hbox, - synctex_node_type_hbox_non_void, synctex_node_type_kern, synctex_node_type_glue, synctex_node_type_math, - synctex_node_type_input, + synctex_node_type_boundary, synctex_node_number_of_types } synctex_node_type_t; -/* synctex_node_type gives the type of a given node, - * synctex_node_isa gives the same information as a human readable text. */ +/* synctex_node_type gives the type of a given node, + * synctex_node_isa gives the same information as a human readable text. */ synctex_node_type_t synctex_node_type(synctex_node_t node); const char * synctex_node_isa(synctex_node_t node); -/* This is primarily used for debugging purpose. - * The second one logs information for the node and recursively displays information for its next node */ +/* This is primarily used for debugging purpose. + * The second one logs information for the node and recursively displays information for its next node */ void synctex_node_log(synctex_node_t node); void synctex_node_display(synctex_node_t node); -/* Given a node, access to its tag, line and column. - * The line and column numbers are 1 based. - * The latter is not yet fully supported in TeX, the default implementation returns 0 which means the whole line. - * When the tag is known, the scanner of the node will give the corresponding file name. - * When the tag is known, the scanner of the node will give the name. +/* Given a node, access to its tag, line and column. + * The line and column numbers are 1 based. + * The latter is not yet fully supported in TeX, the default implementation returns 0 which means the whole line. + * When the tag is known, the scanner of the node will give the corresponding file name. + * When the tag is known, the scanner of the node will give the name. */ int synctex_node_tag(synctex_node_t node); int synctex_node_line(synctex_node_t node); int synctex_node_column(synctex_node_t node); -/* This is the page where the node appears. - * This is a 1 based index as given by TeX. +/* This is the page where the node appears. + * This is a 1 based index as given by TeX. */ int synctex_node_page(synctex_node_t node); -/* For quite all nodes, horizontal, vertical coordinates, and width. - * These are expressed in page coordinates, with origin at the top left corner. +/* For quite all nodes, horizontal, vertical coordinates, and width. + * These are expressed in TeX small points coordinates, with origin at the top left corner. */ -float synctex_node_h(synctex_node_t node); -float synctex_node_v(synctex_node_t node); -float synctex_node_width(synctex_node_t node); +int synctex_node_h(synctex_node_t node); +int synctex_node_v(synctex_node_t node); +int synctex_node_width(synctex_node_t node); -/* For all nodes, dimensions of the enclosing box. - * These are expressed in page coordinates, with origin at the top left corner. - * A box is enclosing itself. +/* For all nodes, dimensions of the enclosing box. + * These are expressed in TeX small points coordinates, with origin at the top left corner. + * A box is enclosing itself. */ -float synctex_node_box_h(synctex_node_t node); -float synctex_node_box_v(synctex_node_t node); -float synctex_node_box_width(synctex_node_t node); -float synctex_node_box_height(synctex_node_t node); -float synctex_node_box_depth(synctex_node_t node); - -/* For quite all nodes, horizontal, vertical coordinates, and width. - * The visible dimensions are bigger than real ones to compensate 0 width boxes - * that do contain nodes. - * These are expressed in page coordinates, with origin at the top left corner. - * A box is enclosing itself. +int synctex_node_box_h(synctex_node_t node); +int synctex_node_box_v(synctex_node_t node); +int synctex_node_box_width(synctex_node_t node); +int synctex_node_box_height(synctex_node_t node); +int synctex_node_box_depth(synctex_node_t node); + +/* For quite all nodes, horizontal, vertical coordinates, and width. + * The visible dimensions are bigger than real ones to compensate 0 width boxes + * that do contain nodes. + * These are expressed in page coordinates, with origin at the top left corner. + * A box is enclosing itself. */ float synctex_node_visible_h(synctex_node_t node); float synctex_node_visible_v(synctex_node_t node); float synctex_node_visible_width(synctex_node_t node); -/* For all nodes, visible dimensions of the enclosing box. - * A box is enclosing itself. - * The visible dimensions are bigger than real ones to compensate 0 width boxes - * that do contain nodes. +/* For all nodes, visible dimensions of the enclosing box. + * A box is enclosing itself. + * The visible dimensions are bigger than real ones to compensate 0 width boxes + * that do contain nodes. */ float synctex_node_box_visible_h(synctex_node_t node); float synctex_node_box_visible_v(synctex_node_t node); @@ -232,67 +315,31 @@ float synctex_node_box_visible_width(synctex_node_t node); float synctex_node_box_visible_height(synctex_node_t node); float synctex_node_box_visible_depth(synctex_node_t node); -/* The main entry points. - * Given the file name, a line and a column number, synctex_display_query returns the number of nodes - * satisfying the contrain. Use code like - * - * if(synctex_display_query(scanner,name,line,column)>0) { - * synctex_node_t node; - * while((node = synctex_next_result(scanner))) { - * // do something with node - * ... - * } - * } - * - * Given the page and the position in the page, synctex_edit_query returns the number of nodes - * satisfying the contrain. Use code like - * - * if(synctex_edit_query(scanner,page,h,v)>0) { - * synctex_node_t node; - * while(node = synctex_next_result(scanner)) { - * // do something with node - * ... - * } - * } - * - * page is 1 based - * h and v are coordinates relative to the top left corner of the page. - * If you make a new query, the result of the previous one is discarded. - * If one of this function returns a non positive integer, - * it means that an error occurred. - * - * Both methods are conservative, in the sense that matching is weak. - * If the exact column number is not found, there will be an answer with the whole line. - */ -int synctex_display_query(synctex_scanner_t scanner,const char * name,int line,int column); -int synctex_edit_query(synctex_scanner_t scanner,int page,float h,float v); -synctex_node_t synctex_next_result(synctex_scanner_t scanner); - -/* The main synctex updater object. - * This object is used to append information to the synctex file. - * Its implementation is considered private. - * It is used by the synctex command line tool to take into account modifications - * that could occur while postprocessing files by dvipdf like filters. +/* The main synctex updater object. + * This object is used to append information to the synctex file. + * Its implementation is considered private. + * It is used by the synctex command line tool to take into account modifications + * that could occur while postprocessing files by dvipdf like filters. */ typedef struct __synctex_updater_t _synctex_updater_t; typedef _synctex_updater_t * synctex_updater_t; -/* Designated initializer. - * Once you are done with your whole job, - * free the updater */ -synctex_updater_t synctex_updater_new_with_output_file(const char * output); +/* Designated initializer. + * Once you are done with your whole job, + * free the updater */ +synctex_updater_t synctex_updater_new_with_output_file(const char * output, const char * directory); -/* Use the next functions to append records to the synctex file, - * no consistency tests made on the arguments */ -void synctex_updater_append_magnification(synctex_updater_t updater, char * magnification); -void synctex_updater_append_x_offset(synctex_updater_t updater, char * x_offset); -void synctex_updater_append_y_offset(synctex_updater_t updater, char * y_offset); +/* Use the next functions to append records to the synctex file, + * no consistency tests made on the arguments */ +void synctex_updater_append_magnification(synctex_updater_t updater, char * magnification); +void synctex_updater_append_x_offset(synctex_updater_t updater, char * x_offset); +void synctex_updater_append_y_offset(synctex_updater_t updater, char * y_offset); -/* You MUST free the updater, once everything is properly appended */ +/* You MUST free the updater, once everything is properly appended */ void synctex_updater_free(synctex_updater_t updater); #ifdef __cplusplus -}; +} #endif #endif diff --git a/Build/source/texk/web2c/synctexdir/synctex_parser_local.h b/Build/source/texk/web2c/synctexdir/synctex_parser_local.h index f1018cfa24b..0e647922a20 100644 --- a/Build/source/texk/web2c/synctexdir/synctex_parser_local.h +++ b/Build/source/texk/web2c/synctexdir/synctex_parser_local.h @@ -1,8 +1,10 @@ /* -Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr This file is part of the SyncTeX package. +Latest Revision: Wed Jul 1 11:16:13 UTC 2009 + License: -------- Permission is hereby granted, free of charge, to any person @@ -34,4 +36,6 @@ authorization from the copyright holder. */ /* This local header file is for TEXLIVE, use your own header to fit your system */ -# include "web2c/c-auto.h" /* for inline && HAVE_xxx */ +# include "web2c/c-auto.h" /* for inline && HAVE_xxx */ +/* No inlining for synctex tool in texlive. */ +# define SYNCTEX_INLINE
\ No newline at end of file diff --git a/Build/source/texk/web2c/synctexdir/synctex_parser_readme.txt b/Build/source/texk/web2c/synctexdir/synctex_parser_readme.txt new file mode 100644 index 00000000000..3dab08a5bee --- /dev/null +++ b/Build/source/texk/web2c/synctexdir/synctex_parser_readme.txt @@ -0,0 +1,74 @@ +This file is part of the SyncTeX package. + +The Synchronization TeXnology named SyncTeX is a new feature +of recent TeX engines designed by Jerome Laurens. +It allows to synchronize between input and output, which means to +navigate from the source document to the typeset material and vice versa. +More informations on http://itexmac2.sourceforge.net/SyncTeX.html + +This package is mainly for developers, it contains the following files: + +synctex_parser_readme.txt +synctex_parser_version.txt +synctex_parser_utils.c
synctex_parser_utils.h +synctex_parser_local.h +synctex_parser.h +synctex_parser.c + +This file contains more informations about the SyncTeX parser history. + +In order to support SyncTeX in a viewer, it is sufficient to include +in the source the files synctex_parser.h and synctex_parser.c. +The synctex parser usage is described in synctex_parser.h header file. + +Version: +-------- +This is version 1, which refers to the synctex output file format. +The files are identified by a build number. +In order to help developers to automatically manage the version and build numbers +and download the parser only when necessary, the synctex_parser.version +is an ASCII text file just containing the current version and build numbers. + +History: +-------- +1.1: Thu Jul 17 09:28:13 UTC 2008 +- First official version available in TeXLive 2008 DVD. + Unfortunately, the backwards synchronization is not working properly mainly for ConTeXt users, see below. +1.2: Tue Sep 2 10:28:32 UTC 2008 +- Correction for ConTeXt support in the edit query. + The previous method was assuming that TeX boxes do not overlap, + which is reasonable for LaTeX but not for ConTeXt. + This assumption is no longer considered. +1.3: Fri Sep 5 09:39:57 UTC 2008 +- Local variable "read" renamed to "already_read" to avoid conflicts. +- "inline" compiler directive renamed to "SYNCTEX_INLINE" for code support and maintenance +- _synctex_error cannot be inlined due to variable arguments (thanks Christiaan Hofman) +- Correction in the display query, extra boundary nodes are used for a more precise forwards synchronization +1.4: Fri Sep 12 08:12:34 UTC 2008 +- For an unknown reason, the previous version was not the real 1.3 (as used in iTeXMac2 build 747). + As a consequence, a crash was observed. +- Some typos are fixed. +1.6: Mon Nov 3 20:20:02 UTC 2008 +- The bug that prevented synchronization with compressed files on windows has been fixed. +- New interface to allow system specific customization. +- Note that some APIs have changed. +1.7: Mer 8 jul 2009 11:32:38 UTC +- bug fix: synctex was causing a memory leak in pdftex and xetex, thus some processing speed degradation +- bug fix: the synctex command line tool was broken when updating a .synctex file +- enhancement: better accuracy of the synchronization process +- enhancement: the pdf output file and the associated .synctex file no longer need to live in the same directory. + The new -d option of the synctex command line tool manages this situation. + This is handy when using something like tex -output-directory=DIR ... + +Acknowledgments: +---------------- +The author received useful remarks from the pdfTeX developers, especially Hahn The Thanh, +and significant help from XeTeX developer Jonathan Kew + +Nota Bene: +---------- +If you include or use a significant part of the synctex package into a software, +I would appreciate to be listed as contributor and see "SyncTeX" highlighted. + +Copyright (c) 2008 jerome DOT laurens AT u-bourgogne DOT fr + diff --git a/Build/source/texk/web2c/synctexdir/synctex_parser_utils.c b/Build/source/texk/web2c/synctexdir/synctex_parser_utils.c new file mode 100644 index 00000000000..4078db088e6 --- /dev/null +++ b/Build/source/texk/web2c/synctexdir/synctex_parser_utils.c @@ -0,0 +1,451 @@ +/* +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr + +This file is part of the SyncTeX package. + +Latest Revision: Wed Jul 1 11:16:25 UTC 2009 + +Version: 1.6 +See synctex_parser_readme.txt for more details + +License: +-------- +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE + +Except as contained in this notice, the name of the copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in this Software without prior written +authorization from the copyright holder. + +*/ + +/* In this file, we find all the functions that may depend on the operating system. */ + +#include <synctex_parser_utils.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <stdio.h> + +#include <limits.h> +#include <ctype.h> +#include <string.h> + +#include <sys/stat.h> + +#ifdef _WIN32 +#include <windows.h> +#endif + +void *_synctex_malloc(size_t size) { + void * ptr = malloc(size); + if(ptr) { +/* In Visual C, bzero is not available */ +#ifdef _MSC_VER + memset(ptr,0, size); +#else + bzero(ptr,size); +#endif + } + return (void *)ptr; +} + +int _synctex_error(char * reason,...) { + va_list arg; + int result; + va_start (arg, reason); +# ifdef _WIN32 + {/* This code is contributed by William Blum */ + char *buff; + size_t len; + OutputDebugString("SyncTeX ERROR: "); + len = _vscprintf(reason, arg) + 1; + buff = (char*)malloc( len * sizeof(char) ); + result = vsprintf(buff, reason, arg) +strlen("SyncTeX ERROR: "); + OutputDebugString(buff); + OutputDebugString("\n"); + free(buff); + } +#else + result = fprintf(stderr,"SyncTeX ERROR: "); + result += vfprintf(stderr, reason, arg); + result += fprintf(stderr,"\n"); +#endif + va_end (arg); + return result; +} + +/* strip the last extension of the given string, this string is modified! */ +void _synctex_strip_last_path_extension(char * string) { + if(NULL != string){ + char * last_component = NULL; + char * last_extension = NULL; + char * next = NULL; + /* first we find the last path component */ + if(NULL == (last_component = strstr(string,"/"))){ + last_component = string; + } else { + ++last_component; + while((next = strstr(last_component,"/"))){ + last_component = next+1; + } + } +#ifdef _WIN32 + /* On Windows, the '\' is also a path separator. */ + while((next = strstr(last_component,"\\"))){ + last_component = next+1; + } +#endif + /* then we find the last path extension */ + if((last_extension = strstr(last_component,"."))){ + ++last_extension; + while((next = strstr(last_extension,"."))){ + last_extension = next+1; + } + --last_extension;/* back to the "." */ + if(last_extension>last_component){/* filter out paths like ....my/dir/.hidden"*/ + last_extension[0] = '\0'; + } + } + } +} + +/* Compare two file names, windows is sometimes case insensitive... */ +synctex_bool_t _synctex_is_equivalent_file_name(const char *lhs, const char *rhs) { +# if _WIN32 + /* On Windows, filename should be compared case insensitive. + * The characters '/' and '\' are both valid path separators. + * There will be a very serious problem concerning UTF8 because + * not all the characters must be toupper... + * I would like to have URL's instead of filenames. */ +next_character: + if(SYNCTEX_IS_PATH_SEPARATOR(*lhs)) {/* lhs points to a path separator */ + if(!SYNCTEX_IS_PATH_SEPARATOR(*rhs)) {/* but not rhs */ + return synctex_NO; + } + } else if(SYNCTEX_IS_PATH_SEPARATOR(*rhs)) {/* rhs points to a path separator but not lhs */ + return synctex_NO; + } else if(toupper(*lhs) != toupper(*rhs)){/* uppercase do not match */ + return synctex_NO; + } else if (!*lhs) {/* lhs is at the end of the string */ + return *rhs ? synctex_NO : synctex_YES; + } else if(!*rhs) {/* rhs is at the end of the string but not lhs */ + return synctex_NO; + } + ++lhs; + ++rhs; + goto next_character; +# else + return 0 == strcmp(lhs,rhs)?synctex_YES:synctex_NO; +# endif +} + +synctex_bool_t _synctex_path_is_absolute(const char * name) { + if(!strlen(name)) { + return synctex_NO; + } +# if _WIN32 + if(strlen(name)>2) { + return (name[1]==':' && SYNCTEX_IS_PATH_SEPARATOR(name[2]))?synctex_YES:synctex_NO; + } + return synctex_NO; +# else + return SYNCTEX_IS_PATH_SEPARATOR(name[0])?synctex_YES:synctex_NO; +# endif +} + +/* We do not take care of UTF-8 */ +char * _synctex_last_path_component(const char * name) { + const char * c = name+strlen(name); + if(c>name) { + if(!SYNCTEX_IS_PATH_SEPARATOR(*c)) { + do { + --c; + if(SYNCTEX_IS_PATH_SEPARATOR(*c)) { + return (char *)c+1; + } + } while(c>name); + } + return (char *)c;/* the last path component is the void string*/ + } + return (char *)c; +} + +int _synctex_copy_with_quoting_last_path_component(const char * src, char ** dest_ref, size_t size) { + char * lpc; + if(src && dest_ref) { +# define dest (*dest_ref) + dest = NULL; /* Default behavior: no change and sucess. */ + lpc = _synctex_last_path_component(src); + if(strlen(lpc)) { + if(strchr(lpc,' ') && lpc[0]!='"' && lpc[strlen(lpc)-1]!='"') { + /* We are in the situation where adding the quotes is allowed. */ + /* Time to add the quotes. */ + /* Consistency test: we must have dest+size>dest+strlen(dest)+2 + * or equivalently: strlen(dest)+2<size (see below) */ + if(strlen(src)<size) { + if((dest = (char *)malloc(size+2))) { + if(dest != strncpy(dest,src,size)) { + _synctex_error("! _synctex_copy_with_quoting_last_path_component: Copy problem"); + free(dest); + dest = NULL;/* Don't forget to reinitialize. */ + return -2; + } + lpc += dest - src; /* Now lpc is the last path component of dest. */ + memmove(lpc+1,lpc,strlen(lpc)+1); /* Also move the null terminating character. */ + lpc[0]='"'; + lpc[strlen(lpc)+1]='\0';/* Consistency test */ + lpc[strlen(lpc)]='"'; + return 0; /* Success. */ + } + return -1; /* Memory allocation error. */ + } + _synctex_error("! _synctex_copy_with_quoting_last_path_component: Internal inconsistency"); + return -3; + } + return 0; /* Success. */ + } + return 0; /* No last path component. */ +# undef dest + } + return 1; /* Bad parameter, this value is subject to changes. */ +} + +/* The client is responsible of the management of the returned string, if any. */ +char * _synctex_merge_strings(const char * first,...); + +char * _synctex_merge_strings(const char * first,...) { + va_list arg; + size_t size = 0; + const char * temp; + /* First retrieve the size necessary to store the merged string */ + va_start (arg, first); + temp = first; + do { + size_t len = strlen(temp); + if(UINT_MAX-len<size) { + _synctex_error("! _synctex_merge_strings: Capacity exceeded."); + return NULL; + } + size+=len; + } while( (temp = va_arg(arg, const char *)) != NULL); + va_end(arg); + if(size>0) { + char * result = NULL; + ++size; + /* Create the memory storage */ + if(NULL!=(result = (char *)malloc(size))) { + char * dest = result; + va_start (arg, first); + temp = first; + do { + if((size = strlen(temp))>0) { + /* There is something to merge */ + if(dest != strncpy(dest,temp,size)) { + _synctex_error("! _synctex_merge_strings: Copy problem"); + free(result); + result = NULL; + return NULL; + } + dest += size; + } + } while( (temp = va_arg(arg, const char *)) != NULL); + va_end(arg); + dest[0]='\0';/* Terminate the merged string */ + return result; + } + _synctex_error("! _synctex_merge_strings: Memory problem"); + return NULL; + } + return NULL; +} + +/* The purpose of _synctex_get_name is to find the name of the synctex file. + * There is a list of possible filenames from which we return the most recent one and try to remove all the others. + * With two runs of pdftex or xetex we are sure the the synctex file is really the most appropriate. + */ +int _synctex_get_name(const char * output, const char * build_directory, char ** synctex_name_ref, synctex_compress_mode_t * compress_mode_ref) +{ + if(output && synctex_name_ref && compress_mode_ref) { +# define synctex_name (*synctex_name_ref) +# define compress_mode (*compress_mode_ref) + /* If output is already absolute, we just have to manage the quotes and the compress mode */ + const char * basename = NULL; /* base name of output*/ + size_t size = 0; + /* Initialize the return values. */ + synctex_name = NULL; + compress_mode = synctex_compress_mode_none; + basename = _synctex_last_path_component(output); /* do not free, output is the owner. */ + /* Do we have a real base name ? */ + if((size = strlen(basename))>0) { + /* Yes, we do. */ + char * temp = NULL; + char * corename = NULL; /* base name of output without path extension. */ + char * dirname = NULL; /* dir name of output */ + char * quoted_corename = NULL; + char * none = NULL; + char * gz = NULL; + char * quoted = NULL; + char * quoted_gz = NULL; + char * build = NULL; + char * build_gz = NULL; + char * build_quoted = NULL; + char * build_quoted_gz = NULL; + struct stat buf; + time_t time = 0; + /* Create corename: let temp point to the dot before the path extension of basename; + * We start form the \0 terminating character and scan the string upward until we find a dot. + * The first dot is not accepted. */ + temp = strrchr(basename,'.'); + size = temp - basename; + if(size>0) { + /* dot properly found, now create corename */ + if(NULL == (corename = (char *)malloc(size+1))) { + _synctex_error("! _synctex_get_name: Memory problem 1"); + return -1; + } + if(corename != strncpy(corename,basename,size)) { + _synctex_error("! _synctex_get_name: Copy problem 1"); + free(corename); + dirname = NULL; + return -2; + } + corename[size] = '\0'; + } else { + /* There is no path extension, + * Just make a copy of basename */ + corename = _synctex_merge_strings(basename); + } + /* corename is properly set up, owned by "self". */ + /* creating dirname. */ + size = strlen(output)-strlen(basename); + if(size>0) { + /* output contains more than one path component */ + if(NULL == (dirname = (char *)malloc(size+1))) { + _synctex_error("! _synctex_get_name: Memory problem"); + free(corename); + dirname = NULL; + return -1; + } + if(dirname != strncpy(dirname,output,size)) { + _synctex_error("! _synctex_get_name: Copy problem"); + free(dirname); + dirname = NULL; + free(corename); + dirname = NULL; + return -2; + } + dirname[size] = '\0'; + } + /* dirname is properly set up. It ends with a path separator, if non void. */ + /* creating quoted_corename. */ + if(strchr(corename,' ')) { + quoted_corename = _synctex_merge_strings("\"",corename,"\""); + } + /* quoted_corename is properly set up. */ + if(dirname &&strlen(dirname)>0) { + none = _synctex_merge_strings(dirname,corename,synctex_suffix,NULL); + if(quoted_corename && strlen(quoted_corename)>0) { + quoted = _synctex_merge_strings(dirname,quoted_corename,synctex_suffix,NULL); + } + } else { + none = _synctex_merge_strings(corename,synctex_suffix,NULL); + if(quoted_corename && strlen(quoted_corename)>0) { + quoted = _synctex_merge_strings(quoted_corename,synctex_suffix,NULL); + } + } + if(!_synctex_path_is_absolute(output) && build_directory && (size = strlen(build_directory))) { + temp = (char *)build_directory + size - 1; + if(_synctex_path_is_absolute(temp)) { + build = _synctex_merge_strings(build_directory,none,NULL); + if(quoted_corename && strlen(quoted_corename)>0) { + build_quoted = _synctex_merge_strings(build_directory,quoted,NULL); + } + } else { + build = _synctex_merge_strings(build_directory,"/",none,NULL); + if(quoted_corename && strlen(quoted_corename)>0) { + build_quoted = _synctex_merge_strings(build_directory,"/",quoted,NULL); + } + } + } + if(none) { + gz = _synctex_merge_strings(none,synctex_suffix_gz,NULL); + } + if(quoted) { + quoted_gz = _synctex_merge_strings(quoted,synctex_suffix_gz,NULL); + } + if(build) { + build_gz = _synctex_merge_strings(build,synctex_suffix_gz,NULL); + } + if(build_quoted) { + build_quoted_gz = _synctex_merge_strings(build_quoted,synctex_suffix_gz,NULL); + } + /* All the others names are properly set up... */ + /* retain the most recently modified file */ +# define TEST(FILENAME,COMPRESS_MODE) \ + if(FILENAME) {\ + if (stat(FILENAME, &buf)) { \ + free(FILENAME);\ + FILENAME = NULL;\ + } else { \ + if(buf.st_mtime>time) { \ + time=buf.st_mtime; \ + synctex_name = FILENAME; \ + compress_mode = COMPRESS_MODE; \ + } \ + } \ + } + TEST(none,synctex_compress_mode_none); + TEST(gz,synctex_compress_mode_gz); + TEST(quoted,synctex_compress_mode_none); + TEST(quoted_gz,synctex_compress_mode_gz); + TEST(build,synctex_compress_mode_none); + TEST(build_gz,synctex_compress_mode_gz); + TEST(build_quoted,synctex_compress_mode_none); + TEST(build_quoted_gz,synctex_compress_mode_gz); +# undef TEST + /* Free all the intermediate filenames, except the on that will be used as returned value. */ +# define CLEAN_AND_REMOVE(FILENAME) \ + if(FILENAME && (FILENAME!=synctex_name)) {\ + remove(FILENAME);\ + printf("synctex tool info: %s removed\n",FILENAME);\ + free(FILENAME);\ + FILENAME = NULL;\ + } + CLEAN_AND_REMOVE(none); + CLEAN_AND_REMOVE(gz); + CLEAN_AND_REMOVE(quoted); + CLEAN_AND_REMOVE(quoted_gz); + CLEAN_AND_REMOVE(build); + CLEAN_AND_REMOVE(build_gz); + CLEAN_AND_REMOVE(build_quoted); + CLEAN_AND_REMOVE(build_quoted_gz); +# undef CLEAN_AND_REMOVE + return 0; + } + return -1;/* bad argument */ +# undef synctex_name +# undef compress_mode + } + return -2; +} + diff --git a/Build/source/texk/web2c/synctexdir/synctex_parser_utils.h b/Build/source/texk/web2c/synctexdir/synctex_parser_utils.h new file mode 100644 index 00000000000..12740b07b14 --- /dev/null +++ b/Build/source/texk/web2c/synctexdir/synctex_parser_utils.h @@ -0,0 +1,125 @@ +/* +Copyright (c) 2008, 2009 jerome DOT laurens AT u-bourgogne DOT fr + +This file is part of the SyncTeX package. + +Version: 1.6 +Latest Revision: Wed Jul 1 11:16:01 UTC 2009 +See synctex_parser_readme.txt for more details + +License: +-------- +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE + +Except as contained in this notice, the name of the copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in this Software without prior written +authorization from the copyright holder. + +*/ + +/* The utilities declared here are subject to conditional implementation. + * All the operating system special stuff goes here. + * The problem mainly comes from file name management: path separator, encoding... + */ + +# define synctex_bool_t int +# define synctex_YES -1 +# define synctex_NO 0 + +#ifndef __SYNCTEX_PARSER_UTILS__ +# define __SYNCTEX_PARSER_UTILS__ + +#include <stdlib.h> + +#ifdef __cplusplus +extern "C" { +#endif + +# if _WIN32 +# define SYNCTEX_IS_PATH_SEPARATOR(c) ('/' == c || '\\' == c) +# else +# define SYNCTEX_IS_PATH_SEPARATOR(c) ('/' == c) +# endif + +/* This custom malloc functions initializes to 0 the newly allocated memory. + * There is no bzero function on windows. */ +void *_synctex_malloc(size_t size); + +/* This is used to log some informational message to the standard error stream. + * On Windows, the stderr stream is not exposed and another method is used. + * The return value is the number of characters printed. */ +int _synctex_error(char * reason,...); + +/* strip the last extension of the given string, this string is modified! + * This function depends on the OS because the path separator may differ. + * This should be discussed more precisely. */ +void _synctex_strip_last_path_extension(char * string); + +/* Compare two file names, windows is sometimes case insensitive... + * The given strings may differ stricto sensu, but represent the same file name. + * It might not be the real way of doing things. + * The return value is an undefined non 0 value when the two file names are equivalent. + * It is 0 otherwise. */ +synctex_bool_t _synctex_is_equivalent_file_name(const char *lhs, const char *rhs); + +/* Description forthcoming.*/ +synctex_bool_t _synctex_path_is_absolute(const char * name); + +/* Description forthcoming...*/ +char * _synctex_last_path_component(const char * name); + +/* If the core of the last path component of src is not already enclosed with double quotes ('"') + * and contains a space character (' '), then a new buffer is created, the src is copied and quotes are added. + * In all other cases, no destination buffer is created and the src is not copied. + * 0 on success, which means no error, something non 0 means error, mainly due to memory allocation failure, or bad parameter. + * This is used to fix a bug in the first version of pdftex with synctex (1.40.9) for which names with spaces + * were not managed in a standard way. + * On success, the caller owns the buffer pointed to by dest_ref (is any) and + * is responsible of freeing the memory when done. + * The size argument is the size of the src buffer. On return the dest_ref points to a buffer sized size+2.*/ +int _synctex_copy_with_quoting_last_path_component(const char * src, char ** dest_ref, size_t size); + +/* These are the possible extensions of the synctex file */ +static const char * synctex_suffix = ".synctex"; +static const char * synctex_suffix_gz = ".gz"; + +typedef enum { + synctex_io_mode_read = 0, + synctex_io_mode_append = 2 +} synctex_io_mode_t; + +typedef enum { + synctex_compress_mode_none = 0, + synctex_compress_mode_gz = 1 +} synctex_compress_mode_t; + +static const char * synctex_io_modes[synctex_io_mode_append+2] = {"r","rb","a","ab"}; + +int _synctex_get_name(const char * output, const char * build_directory, char ** synctex_name_ref, synctex_compress_mode_t * compress_mode_ref); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Build/source/texk/web2c/synctexdir/synctex_parser_version.txt b/Build/source/texk/web2c/synctexdir/synctex_parser_version.txt new file mode 100644 index 00000000000..400122e60f5 --- /dev/null +++ b/Build/source/texk/web2c/synctexdir/synctex_parser_version.txt @@ -0,0 +1 @@ +1.5
\ No newline at end of file diff --git a/Build/source/texk/web2c/synctexdir/tests/LM-Volume-manuscript.tex b/Build/source/texk/web2c/synctexdir/tests/LM-Volume-manuscript.tex new file mode 100644 index 00000000000..ba4ddbd48fd --- /dev/null +++ b/Build/source/texk/web2c/synctexdir/tests/LM-Volume-manuscript.tex @@ -0,0 +1,6 @@ +\documentclass[ a4paper, oneside]{amsart}
%\listfiles
\RequirePackage{amsmath}
\RequirePackage{bm}
\RequirePackage{amssymb}
\RequirePackage{upref}
\RequirePackage{amsthm}
\RequirePackage{enumerate}
%\RequirePackage{pb-diagram}
\RequirePackage{amsfonts}
\RequirePackage[mathscr]{eucal}
\RequirePackage{verbatim}
\RequirePackage{xr}
\def\@thm#1#2#3{%
\ifhmode\unskip\unskip\par\fi
\normalfont
\trivlist
\let\thmheadnl\relax
\let\thm@swap\@gobble
\let\thm@indent\indent % no indent
\thm@headfont{\scshape}% heading font bold
%\thm@notefont{\fontseries\mddefault\upshape}%
\thm@notefont{}%
\thm@headpunct{.}% add period after heading
\thm@headsep 5\p@ plus\p@ minus\p@\relax
\thm@preskip\topsep
\thm@postskip\thm@preskip
#1% style overrides
\@topsep \thm@preskip % used by thm head
\@topsepadd \thm@postskip % used by \@endparenv
\def\@tempa{#2}\ifx\@empty\@tempa
\def\@tempa{\@oparg{\@begintheorem{#3}{}}[]}%
\else
\refstepcounter{#2}%
\def\@tempa{\@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]}%
\fi
\@tempa
}
%Redefined commands
%Greek Letters
\newcommand{\al}{\alpha}
\newcommand{\bet}{\beta}
\newcommand{\ga}{\gamma}
\newcommand{\de}{\delta }
\newcommand{\e}{\epsilon}
\newcommand{\ve}{\varepsilon}
\newcommand{\f}{\varphi}
\newcommand{\h}{\eta}
\newcommand{\io}{\iota}
\newcommand{\tht}{\theta}
\newcommand{\ka}{\kappa}
\newcommand{\lam}{\lambda}
\newcommand{\m}{\mu}
\newcommand{\n}{\nu}
\newcommand{\om}{\omega}
\newcommand{\p}{\pi}
\newcommand{\vt}{\vartheta}
\newcommand{\vr}{\varrho}
\newcommand{\s}{\sigma}
\newcommand{\x}{\xi}
\newcommand{\z}{\zeta}
\newcommand{\C}{\varGamma}
\newcommand{\D}{\varDelta}
\newcommand{\F}{\varPhi}
\newcommand{\Lam}{\varLambda}
\newcommand{\Om}{\varOmega}
\newcommand{\vPsi}{\varPsi}
\newcommand{\Si}{\varSigma}
%New Commands
\newcommand{\di}[1]{#1\nobreakdash-\hspace{0pt}dimensional}%\di n
\newcommand{\nbdd}{\nobreakdash--}
\newcommand{\nbd}{\nobreakdash-\hspace{0pt}}
\newcommand{\ce}[1]{$C^#1$\nbd{estimate}}
\newcommand{\ces}[1]{$C^#1$\nbd{estimates}}
\newcommand{\fm}[1]{F_{|_{M_#1}}}
\newcommand{\fmo}[1]{F_{|_{#1}}}%\fmo M
\newcommand{\fu}[3]{#1\hspace{0pt}_{|_{#2_#3}}}
\newcommand{\fv}[2]{#1\hspace{0pt}_{|_{#2}}}
\newcommand{\cchi}[1]{\chi\hspace{0pt}_{_{#1}}}
\newcommand{\so}{{\mc S_0}}
%\newcommand\sql[1][u]{\sqrt{1-|D#1|^2}}
\newcommand{\const}{\tup{const}}
\newcommand{\slim}[2]{\lim_{\substack{#1\ra #2\\#1\ne #2}}}
\newcommand{\pih}{\frac{\pi}{2}}
\newcommand{\msp[1]}[1]{\mspace{#1mu}}
\newcommand{\low}[1]{{\hbox{}_{#1}}}
%Special Symbols
\newcommand{\R}[1][n+1]{{\protect\mathbb R}^{#1}}
\newcommand{\Cc}{{\protect\mathbb C}}
\newcommand{\K}{{\protect\mathbb K}}
\newcommand{\N}{{\protect\mathbb N}}
\newcommand{\Q}{{\protect\mathbb Q}}
\newcommand{\Z}{{\protect\mathbb Z}}
\newcommand{\eR}{\stackrel{\lower1ex \hbox{\rule{6.5pt}{0.5pt}}}{\msp[3]\R[]}}
\newcommand{\eN}{\stackrel{\lower1ex \hbox{\rule{6.5pt}{0.5pt}}}{\msp[1]\N}}
\newcommand{\eO}{\stackrel{\lower1ex
\hbox{\rule{6pt}{0.5pt}}}{\msc O}}
%Special math symbols
\DeclareMathOperator{\arccot}{arccot}
\DeclareMathOperator{\diam}{diam}
\DeclareMathOperator{\Grad}{Grad}
\DeclareMathOperator*{\es}{ess\,sup}
\DeclareMathOperator{\graph}{graph}
\DeclareMathOperator{\sub}{sub}
\DeclareMathOperator{\supp}{supp}
\DeclareMathOperator{\id}{id}
\DeclareMathOperator{\lc}{lc}
\DeclareMathOperator{\osc}{osc}
\DeclareMathOperator{\pr}{pr}
\DeclareMathOperator{\rec}{Re}
\DeclareMathOperator{\imc}{Im}
\DeclareMathOperator{\sign}{sign}
\DeclareMathOperator{\proj}{proj}
\DeclareMathOperator{\grad}{grad}
\DeclareMathOperator{\Diff}{Diff}
\DeclareMathOperator{\rg}{rg}
\newcommand\im{\implies}
\newcommand\ra{\rightarrow}
\newcommand\xra{\xrightarrow}
\newcommand\rra{\rightrightarrows}
\newcommand\hra{\hookrightarrow}
\newcommand{\nea}{\nearrow}
\newcommand{\sea}{\searrow}
\newcommand{\ua}{\uparrow}
\newcommand{\da}{\downarrow}
\newcommand{\rha}{\rightharpoondown}
\newcommand{\wha}{\underset{w^*}\rightharpoondown}
%PDE commands
\newcommand\pa{\partial}
\newcommand\pde[2]{\frac {\partial#1}{\partial#2}}
\newcommand\pd[3]{\frac {\partial#1}{\partial#2^#3}} %e.g. \pd fxi
\newcommand\pdc[3]{\frac {\partial#1}{\partial#2_#3}} %contravariant
\newcommand\pdm[4]{\frac {\partial#1}{\partial#2_#3^#4}} %mixed
\newcommand\pdd[4]{\frac {{\partial\hskip0.15em}^2#1}{\partial {#2^
#3}\,\partial{#2^#4}}} %e.g. \pdd fxij, Abl. zweiter Ordnung
\newcommand\pddc[4]{\frac {{\partial\hskip0.15em}^2#1}{\partial {#2_
#3}\,\partial{#2_#4}}}
\newcommand\PD[3]{\frac {{\partial\hskip0.15em}^2#1}{\partial
#2\,\partial#3}} %e.g \PD fxy
\newcommand\df[2]{\frac {d#1}{d#2}}
\newcommand\sd{\vartriangle}
\newcommand\sq[1][u]{\sqrt{1+|D#1|^2}}
\newcommand\sql[1][u]{\sqrt{1-|D#1|^2}}
\newcommand{\un}{\infty}
\newcommand{\A}{\forall}
\newcommand{\E}{\exists}
%Set commands
\newcommand{\set}[2]{\{\,#1\colon #2\,\}}
\newcommand{\uu}{\cup}
\newcommand{\ii}{\cap}
\newcommand{\uuu}{\bigcup}
\newcommand{\iii}{\bigcap}
\newcommand{\uud}{ \stackrel{\lower 1ex \hbox {.}}{\uu}}
\newcommand{\uuud}[1]{ \stackrel{\lower 1ex \hbox {.}}{\uuu_{#1}}}
\newcommand\su{\subset}
\newcommand\Su{\Subset}
\newcommand\nsu{\nsubset}
\newcommand\eS{\emptyset}
\newcommand{\sminus}[1][28]{\raise 0.#1ex\hbox{$\scriptstyle\setminus$}}
\newcommand{\cpl}{\complement}
\newcommand\inn[1]{{\stackrel{\msp[9]\circ}{#1}}}
%Embellishments
\newcommand{\ol}{\overline}
\newcommand{\pri}[1]{#1^\prime}
\newcommand{\whn}[1]{\widehat{(#1_n)}}
\newcommand{\wh}{\widehat}
%Logical commands
\newcommand{\wed}{\wedge}
\newcommand{\eqv}{\Longleftrightarrow}
\newcommand{\lla}{\Longleftarrow}
\newcommand{\lra}{\Longrightarrow}
\newcommand{\bv}{\bigvee}
\newcommand{\bw}{\bigwedge}
\newcommand{\nim}{{\hskip2.2ex\not\hskip-1.5ex\im}}
\DeclareMathOperator*{\Au}{\A}
\DeclareMathOperator*{\Eu}{\E}
\newcommand\ti{\times }
%Norms
\newcommand{\abs}[1]{\lvert#1\rvert}
\newcommand{\absb}[1]{\Bigl|#1\Bigr|}
\newcommand{\norm}[1]{\lVert#1\rVert}
\newcommand{\normb}[1]{\Big\lVert#1\Big\rVert}
\newcommand{\nnorm}[1]{| \mspace{-2mu} |\mspace{-2mu}|#1| \mspace{-2mu}
|\mspace{-2mu}|}
\newcommand{\spd}[2]{\protect\langle #1,#2\protect\rangle}
%Geometry
\newcommand\ch[3]{\varGamma_{#1#2}^#3}
\newcommand\cha[3]{{\bar\varGamma}_{#1#2}^#3}
\newcommand{\riem}[4]{R_{#1#2#3#4}}
\newcommand{\riema}[4]{{\bar R}_{#1#2#3#4}}
\newcommand{\cod}{h_{ij;k}-h_{ik;j}=\riema\al\bet\ga\de\n^\al x_i^\bet x_j^\ga x_k^\de}
\newcommand{\gau}[1][\s]{\riem ijkl=#1 \{h_{ik}h_{jl}-h_{il}h_{jk}\} + \riema
\al\bet\ga\de x_i^\al x_j^\bet x_k^\ga x_l^\de}
\newcommand{\ric}{\h_{i;jk}=\h_{i;kj}+\riem lijk\msp \h^l}
%Font commands
\newcommand{\tbf}{\textbf}
\newcommand{\tit}{\textit}
\newcommand{\tsl}{\textsl}
\newcommand{\tsc}{\textsc}
\newcommand{\trm}{\textrm}
\newcommand{\tup}{\textup}% text upright
\newcommand{\mbf}{\protect\mathbf}
\newcommand{\mitc}{\protect\mathit}
\newcommand{\mrm}{\protect\mathrm}
\newcommand{\bs}{\protect\boldsymbol}
\newcommand{\mc}{\protect\mathcal}
\newcommand{\msc}{\protect\mathscr}
%Miscellaneous
\providecommand{\bysame}{\makeboc[3em]{\hrulefill}\thinspace}
\newcommand{\la}{\label}
\newcommand{\ci}{\cite}
\newcommand{\bib}{\bibitem}
\newcommand{\cq}[1]{\glqq{#1}\grqq\,}
\newcommand{\cqr}{\glqq{$\lra$}\grqq\,}
\newcommand{\cql}{\glqq{$\lla$}\grqq\,}
\newcommand{\bt}{\begin{thm}}
\newcommand{\bl}{\begin{lem}}
\newcommand{\bc}{\begin{cor}}
\newcommand{\bd}{\begin{definition}}
\newcommand{\bpp}{\begin{prop}}
\newcommand{\br}{\begin{rem}}
\newcommand{\bn}{\begin{note}}
\newcommand{\be}{\begin{ex}}
\newcommand{\bes}{\begin{exs}}
\newcommand{\bb}{\begin{example}}
\newcommand{\bbs}{\begin{examples}}
\newcommand{\ba}{\begin{axiom}}
\newcommand{\et}{\end{thm}}
\newcommand{\el}{\end{lem}}
\newcommand{\ec}{\end{cor}}
\newcommand{\ed}{\end{definition}}
\newcommand{\epp}{\end{prop}}
\newcommand{\er}{\end{rem}}
\newcommand{\en}{\end{note}}
\newcommand{\ee}{\end{ex}}
\newcommand{\ees}{\end{exs}}
\newcommand{\eb}{\end{example}}
\newcommand{\ebs}{\end{examples}}
\newcommand{\ea}{\end{axiom}}
\newcommand{\bp}{\begin{proof}}
\newcommand{\ep}{\end{proof}}
\newcommand{\eps}{\renewcommand{\qed}{}\end{proof}}
\newcommand{\bal}{\begin{align}}
%\newcommand{\eal}{\end{align}}
\newcommand{\bi}[1][1.]{\begin{enumerate}[\upshape #1]}
\newcommand{\bia}[1][(1)]{\begin{enumerate}[\upshape #1]}
\newcommand{\bin}[1][1]{\begin{enumerate}[\upshape\bfseries #1]}
\newcommand{\bir}[1][(i)]{\begin{enumerate}[\upshape #1]}
\newcommand{\bic}[1][(i)]{\begin{enumerate}[\upshape\hspace{2\cma}#1]}
\newcommand{\bis}[2][1.]{\begin{enumerate}[\upshape\hspace{#2\parindent}#1]}
\newcommand{\ei}{\end{enumerate}}
% comma is raised when components are quotients
\newcommand\ndots{\raise 0.47ex \hbox {,}\hskip0.06em\cdots %
\raise 0.47ex \hbox {,}\hskip0.06em}
%Layout commands
\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}}
\newcommand{\q}{\quad}
\newcommand{\qq}{\qquad}
\newcommand{\vs}[1][3]{\vskip#1pt}
\newcommand{\hs}[1][12]{\hskip#1pt}
\newcommand{\hp}{\hphantom}
\newcommand{\vp}{\vphantom}
\newcommand\cl{\centerline}
\newcommand\nl{\newline}
\newcommand\nd{\noindent}
\newcommand{\nt}{\notag}
% %my private skips; set to 0 to restore default
\newskip\Csmallskipamount
\Csmallskipamount=\smallskipamount
\newskip\Cmedskipamount
\Cmedskipamount=\medskipamount
\newskip\Cbigskipamount
\Cbigskipamount=\bigskipamount
\newcommand\cvs{\vspace\Csmallskipamount}
\newcommand\cvm{\vspace\Cmedskipamount}
\newcommand\cvb{\vspace\Cbigskipamount}
\newskip\csa
\csa=\smallskipamount
\newskip\cma
\cma=\medskipamount
\newskip\cba
\cba=\bigskipamount
\newdimen\spt
\spt=0.5pt
%%special roster macro
\newcommand\citem{\cvs\advance\itemno by
1{(\romannumeral\the\itemno})\hskip3pt}
\newcommand{\bitem}{\cvm\nd\advance\itemno by
1{\bf\the\itemno}\hspace{\cma}}
\newcommand\cendroster{\cvm\itemno=0}
%New counts
\newcount\itemno
\itemno=0
%Labels
\newcommand{\las}[1]{\label{S:#1}}
\newcommand{\lass}[1]{\label{SS:#1}}
\newcommand{\lae}[1]{\label{E:#1}}
\newcommand{\lat}[1]{\label{T:#1}}
\newcommand{\lal}[1]{\label{L:#1}}
\newcommand{\lad}[1]{\label{D:#1}}
\newcommand{\lac}[1]{\label{C:#1}}
\newcommand{\lan}[1]{\label{N:#1}}
\newcommand{\lap}[1]{\label{P:#1}}
\newcommand{\lar}[1]{\label{R:#1}}
\newcommand{\laa}[1]{\label{A:#1}}
%Referencing
\newcommand{\rs}[1]{Section~\ref{S:#1}}
\newcommand{\rss}[1]{Section~\ref{SS:#1}}
\newcommand{\rt}[1]{Theorem~\ref{T:#1}}
\newcommand{\rl}[1]{Lemma~\ref{L:#1}}
\newcommand{\rd}[1]{Definition~\ref{D:#1}}
\newcommand{\rc}[1]{Corollary~\ref{C:#1}}
\newcommand{\rn}[1]{Number~\ref{N:#1}}
\newcommand{\rp}[1]{Proposition~\ref{P:#1}}
\newcommand{\rr}[1]{Remark~\ref{R:#1}}
\newcommand{\raa}[1]{Axiom~\ref{A:#1}}
\newcommand{\re}[1]{\eqref{E:#1}}
%Index
\newcommand{\ind}[1]{#1\index{#1}}
\RequirePackage{upref}
\RequirePackage{amsthm}
%\usepackage{amsfonts}
%\usepackage{amsintx}
\RequirePackage{enumerate}%\begin{enumerate}[(i)]
%%\usepackage{showkeys}
\setlength{\textwidth}{4.7in}%JDG
\setlength{\textheight}{7.5in}
\usepackage{germanquotes}
\theoremstyle{plain}
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}[thm]{Lemma}
\newtheorem{prop}[thm]{Proposition}
\newtheorem{cor}[thm]{Corollary}
\theoremstyle{definition}
\newtheorem{rem}[thm]{Remark}
\newtheorem{definition}[thm]{Definition}
\newtheorem{example}[thm]{Example}
\newtheorem{ex}[thm]{Exercise}
\swapnumbers
\theoremstyle{remark}
\newtheorem{case}{Case}
\numberwithin{equation}{section}
%\renewcommand{\qed}{q.e.d.}
\usepackage{xr-hyper} +\usepackage{url}
\usepackage[hyperindex=true, pdfauthor= Claus\ Gerhardt, pdftitle= LM-Volume, bookmarks=true, extension= pdf, colorlinks=true, plainpages=false,hyperfootnotes=true, debug=false, pagebackref]{hyperref}
\newcommand{\anl}{\htmladdnormallink}
%\listfiles
\begin{document}
%\larger[1]
\title{Estimates for the volume of a Lorentzian manifold}
% author one information
\author{Claus Gerhardt}
\address{Ruprecht-Karls-Universit\"at, Institut f\"ur Angewandte Mathematik,
Im Neuenheimer Feld 294, 69120 Heidelberg, Germany}
%\curraddr{}
\email{gerhardt@math.uni-heidelberg.de}
\urladdr{\url{http://www.math.uni-heidelberg.de/studinfo/gerhardt/}}
%\thanks{}
% author two information
%\author{}
%\address{}
%\curraddr{}
%\email{}
%\thanks{}
%
\subjclass[2000]{35J60, 53C21, 53C44, 53C50, 58J05}
\keywords{Lorentzian manifold, volume estimates, cosmological spacetime, general relativity, constant mean curvature, CMC hypersurface}
\date{April 18, 2002}
%
% at present the "communicated by" line appears only in ERA and PROC
%\commby{}
%\dedicatory{}
\begin{abstract} We prove new estimates for the volume of a Lorentzian
mani\-fold and show especially that cosmological spacetimes with crushing
singularities have finite volume.
\end{abstract}
\maketitle
\thispagestyle{empty}
\setcounter{section}{-1}
\section{Introduction}
\cvb
Let $N$ be a $(n+1)$-dimensional Lorentzian manifold and suppose that $N$ can be
decomposed in the form
\begin{equation}\lae{0.1}
N=N_0\uu N_-\uu N_+,
\end{equation}
\cvm
\nd where $N_0$ has finite volume and $N_-$ resp. $N_+$ represent the critical
past resp. future Cauchy developments with not necessarily a priori bounded
volume. We assume that $N_+$ is the future Cauchy development of a Cauchy
hypersurface $M_1$, and $N_-$ the past Cauchy development of a hypersurface
$M_2$, or, more precisely, we assume the existence of a time function $x^0$,
such that
\begin{equation}
\begin{aligned}
N_+&={x^0}^{-1}([t_1,T_+)),&\qq M_1=\{x^0=t_1\}&,\\
N_-&={x^0}^{-1}((T_-,t_2]),&\qq M_2=\{x^0=t_2\}&,
\end{aligned}
\end{equation}
\cvm
\nd and that the Lorentz metric can be expressed as
\begin{equation}\lae{0.3}
d\bar s^2=e^{2\psi}\{-{dx^0}^2+\s_{ij}(x^0,x)dx^idx^j\},
\end{equation}
\cvm
\nd where $x=(x^i)$ are local coordinates for the space-like hypersurface $M_1$
if $N_+$ is considered resp. $M_2$ in case of $N_-$.
The coordinate system $(x^\al)_{0\le\al\le n}$ is supposed to be future
directed, i.e. the \tit{past} directed unit normal $(\nu^\al)$ of the level sets
\begin{equation}
M(t)=\{x^0=t\}
\end{equation}
\cvm
\nd is of the form
\begin{equation}\lae{0.5}
(\nu^\al)=-e^{-\psi}(1,0,\ldots,0).
\end{equation}
\cvm
If we assume the mean curvature of the slices $M(t)$ with respect to the past
directed normal---cf. \ci[Section 2]{cg8} for a more detailed explanation of our
conventions---is strictly bounded away from zero, then, the following volume
estimates can be proved
\bt\lat{0.1}
Suppose there exists a positive constant $\e_0$ such that
\begin{align}
H(t)&\ge \e_0&\A\,t_1\le t< T_+&,\lae{0.6}\\
\intertext{and}
H(t)&\le-\e_0&\A\,T_-<t\le t_2&,\lae{0.7}
\end{align}
\cvm
\nd then
\begin{align}
\abs{N_+}&\le \frac1{\e_0}\abs{M(t_1)},\\
\intertext{and}
\abs{N_-}&\le \frac1{\e_0}\abs{M(t_2}.
\end{align}
These estimates also hold locally, i.e. if $E_i\su M(t_i)$, $i=1,2$, are measurable
subsets and $E_1^+,E_2^-$ the corresponding future resp. past directed
cylinders, then,
\begin{align}
\abs{E_1^+}&\le\frac1{\e_0}\abs{E_1},\lae{0.10}\\
\intertext{and}
\abs{E_2^-}&\le\frac1{\e_0}\abs{E_2}.
\end{align}
\et
\cvb
\section{Proof of \rt{0.1}}\las{1}
\cvb
In the following we shall only prove the estimate for $N_+$, since the other case
$N_-$ can easily be considered as a future development by reversing the time
direction.
\cvm
Let $x=x(\xi)$ be an embedding of a space-like hypersurface and $(\nu^\al)$ be
the past directed normal. Then, we have the Gau{\ss} formula
\begin{equation}
x^\al_{ij}=h_{ij}\nu^\al.
\end{equation}
\cvm
\nd where $(h_{ij})$ is the second fundamental form, and the Weingarten equation
\begin{equation}
\nu^\al_i=h^k_ix^\al_k.
\end{equation}
\cvm
We emphasize that covariant derivatives, indicated simply by indices, are
always \tit{full} tensors.
\cvm
The slices $M(t)$ can be viewed as special embeddings of the form
\begin{equation}
x(t)=(t,x^i),
\end{equation}
\cvm
\nd where $(x^i)$ are coordinates of the \tit{initial} slice $M(t_1)$. Hence, the
slices $M(t)$ can be considered as the solution of the evolution problem
\begin{equation}\lae{1.4}
\dot x=-e^\psi \nu, \qq t_1\le t<T_+,
\end{equation}
\cvm
\nd with initial hypersurface $M(t_1)$, in view of \re{0.5}.
\cvm From the equation \re{1.4} we can immediately derive evolution equations
for the geometric quantities $g_{ij}, h_{ij}, \nu$, and $H=g^{ij}h_{ij}$ of $M(t)$, cf.
e.g.
\ci[Section 4]{cg4}, where the corresponding evolution equations are derived in
Riemannian space.
\cvm
For our purpose, we are only interested in the evolution equation for the metric,
and we deduce
\begin{equation}
\dot g_{ij}=\spd{\dot x_i}{x_j}+\spd{x_i}{\dot x_j}=- 2e^\psi h_{ij},
\end{equation}
\cvm
\nd in view of the Weingarten equation.
\cvm
Let $g=\det(g_{ij})$, then,
\begin{equation}\lae{1.6}
\dot g= g g^{ij}\dot g_{ij}=-2e^\psi H g,
\end{equation}
\cvm
\nd and thus, the volume of $M(t), \abs{M(t)}$, evolves according to
\begin{equation}\lae{1.7}
\frac d{dt} \abs{M(t)}=\int_{M(t_1)}\frac d{dt}\sqrt g=-\int_{M(t)}e^\psi H,
\end{equation}
\cvm
\nd where we shall assume without loss of generality that $\abs{M(t_1}$ is finite,
otherwise, we replace $M(t_1)$ by an arbitrary measurable subset of $M(t_1)$
with finite volume.
\cvm
Now, let $T\in [t_1, T_+)$ be arbitrary and denote by $Q(t_1,T)$ the
cylinder
\begin{equation}\lae{1.8}
Q(t_1,T)=\set{(x^0,x)}{t_1\le x^0\le T},
\end{equation}
\cvm
\nd then,
\begin{equation}\lae{1.9}
\abs{Q(t_1,T)}=\int_{t_1}^T\int_Me^\psi,
\end{equation}
\cvm
\nd where we omit the volume elements, and where, $M=M(x^0)$.
\cvm
By assumption, the mean curvature $H$ of the slices is bounded from below by
$\e_0$, and we conclude further, with the help of \re{1.7},
\begin{equation}
\begin{aligned}
\abs{Q(t_1,T)}&\le\frac 1{\e_0} \int_{t_1}^T\int_Me^\psi H\\
&=\frac1{\e_0}\{\abs{M(t_1)}-\abs{M(T)}\}\\
&\le \frac1{\e_0}\abs{M(t_1)}.
\end{aligned}
\end{equation}
\cvm
Letting $T$ tend to $T_+$ gives the estimate for $\abs {N_+}$.
\cvm
To prove the estimate \re{0.10}, we simply replace $M(t_1)$ by $E_1$.
\cvb
If we relax the conditions \re{0.6} and \re{0.7} to include the case $\e_0=0$, a
volume estimate is still possible. +
+\cvm
\bt
If the assumptions of \rt{0.1} are valid with $\e_0=0$, and if in addition the
length of any future directed curve starting from $M(t_1)$ is bounded by a
constant $\ga_1$ and the length of any past directed curve starting from $M(t_2)$
is bounded by a constant $\ga_2$, then,
\begin{align}
\abs{N_+}&\le \ga_1\abs{M(t_1)}\\
\intertext{and}
\abs{N_-}&\le \ga_2\abs{M(t_2)}.
\end{align}
\et +
+\cvm
\bp
As before, we only consider the estimate for $N_+$.
\cvm
From \re{1.6} we infer that the volume element of the slices $M(t)$ is decreasing
in $t$, and hence,
\begin{equation}\lae{1.13}
\sqrt{g(t)}\le \sqrt{g(t_1)}\qq\A\,t_1\le t.
\end{equation}
\cvm
Furthermore, for fixed $x\in M(t_1)$ and $t>t_1$
\begin{equation}\lae{1.14}
\int_{t_1}^te^\psi\le \ga_1
\end{equation}
because the left-hand side is the length of the future directed curve
\begin{equation}
\ga(\tau)=(\tau,x)\qq t_1\le\tau\le t.
\end{equation}
\cvm
Let us now look at the cylinder $Q(t_1,T)$ as in \re{1.8} and \re{1.9}. We have
\begin{equation}
\begin{aligned}
\abs{Q(t_1,T)}&=\int_{t_1}^T\int_{M(t_1)}e^\psi\sqrt{g(t,x)}\le
\int_{t_1}^T\int_{M(t_1)}e^\psi\sqrt{g(t_1,x)}\\[\cma]
&\le \ga_1\int_{M(t_1)}\sqrt{g(t_1,x)}=\ga_1\abs{M(t_1)}
\end{aligned}
\end{equation}
by applying Fubini's theorem and the estimates \re{1.13} and \re{1.14}.
\ep
\cvb
\section{Cosmological spacetimes}\las{2}
\cvb
A cosmological spacetime is a globally hyperbolic Lorentzian manifold $N$ with
compact Cauchy hypersurface $\so$, that satisfies the timelike convergence
condition, i.e.
\begin{equation}
\bar R_{\al\bet}\nu^\al\nu^\bet\ge 0 \qq \A\,\spd\nu\nu=-1.
\end{equation}
\cvm
If there exist crushing singularities, see \ci{es} or \ci{cg1} for a definition, then,
we proved in
\ci{cg1} that
$N$ can be foliated by spacelike hypersurfaces $M(\tau)$ of constant mean
curvature $\tau$, $-\un<\tau<\un$,
\begin{equation}
N=\uuu_{0\ne\tau\in \R[]}M(\tau)\uu{\msc C}_0,
\end{equation}
\cvm
\nd where $\msc C_0$ consists either of a single maximal slice or of a whole
continuum of maximal slices in which case the metric is stationary in $\msc
C_0$. But in any case $\msc C_0$ is a compact subset of $N$.
\cvm
In the complement of $\msc C_0$ the mean curvature function $\tau$ is a regular
function with non-vanishing gradient that can be used as a new time function, cf.
\ci{cg6} for a simple proof.
\cvm
Thus, the Lorentz metric can be expressed in Gaussian coordinates $(x^\al)$ with
$x^0=\tau$ as in \re{0.3}. We choose arbitrary $\tau_2<0<\tau_1$ and de\-fine
\begin{equation}
\begin{aligned}
N_0&=\set{(\tau,x)}{\tau_2\le\tau \le \tau_1},\\
N_-&=\set{(\tau,x)}{-\un<\tau \le \tau_2},\\
N_+&=\set{(\tau,x)}{\tau_1\le \tau<\un}.
\end{aligned}
\end{equation}
\cvm
Then, $N_0$ is compact, and the volumes of $N_-, N_+$ can be estimated by
\begin{align}
\abs{N_+}&\le \frac1{\tau_1}\abs{M(\tau_1)},\\
\intertext{and}
\abs{N_-}&\le \frac1{\abs{\tau_2}}\abs{M(\tau_2)}.
\end{align}
\cvm
Hence, we have proved
\bt
A cosmological spacetime $N$ with crushing singularities has finite volume.
\et
\cvb
\br
Let $N$ be a spacetime with compact Cauchy hypersurface and suppose that a
subset
$N_-\su N$ is foliated by constant mean curvature slices $M(\tau)$ such that
\begin{equation}
N_-=\uuu_{0<\tau\le \tau_2}M(\tau)
\end{equation}
\cvm
\nd and suppose furthermore, that $x^0=\tau$ is a time function---which will be
the case if the timelike convergence condition is satisfied---so that the metric
can be represented in Gaussian coordinates $(x^\al)$ with $x^0=\tau$.
\cvm
Consider the cylinder $Q(\tau,\tau_2)=\{\tau\le x^0\le \tau_2\}$ for some
fixed $\tau$. Then,
\begin{equation}
\abs{Q(\tau,\tau_2)}=\int_\tau^{\tau_2}\int_Me^\psi=\int_\tau
^{\tau_2}H^{-1}\int_MH e^\psi,
\end{equation}
\cvm
\nd and we obtain in view of \re{1.7}
\begin{equation}
\tau^{-1}_2\{\abs {M(\tau)}-\abs{M(\tau_2)}\}\le\abs{Q(\tau,\tau_2)},
\end{equation}
\cvm
\nd and conclude further
\begin{equation}
\lim_{\tau\ra 0}\msp[2]\abs{M(\tau)}\le \tau_2\abs{N_-}+\abs{M(\tau_2)},
\end{equation}
\nd i.e.
\begin{equation}
\lim_{\tau\ra 0}\msp[2]\abs{M(\tau)}=\un\im \abs{N_-}=\un.
\end{equation}
\er
\cvb
\section{The Riemannian case}
\cvb
Suppose that $N$ is a Riemannian manifold that is decomposed as in \re{0.1} with
metric
\begin{equation}
d\bar s^2=e^{2\psi}\{{dx^0}^2+\s_{ij}(x^0,x)dx^idx^j\}.
\end{equation}
\cvm
The Gau{\ss} formula and the Weingarten equation for a hypersurface now have
the form
\begin{align}
x^\al_{ij}&=-h_{ij}\nu^\al,\\
\intertext{and}
\nu^\al_i&=h^k_ix^\al_k.
\end{align}
\cvm
As default normal vector---if such a choice is possible---we choose the outward
normal, which, in case of the coordinate slices $M(t)=\{x^0=t\}$ is given by
\begin{equation}
(\nu^\al)=e^{-\psi}(1,0,\ldots,0).
\end{equation}
\cvm
Thus, the coordinate slices are solutions of the evolution problem
\begin{equation}
\dot x=e^\psi \nu,
\end{equation}
\cvm
\nd and, therefore,
\begin{equation}
\dot g_{ij}=2e^\psi h_{ij},
\end{equation}
\cvm
\nd i.e. we have the opposite sign compared to the Lorentzian case leading to
\begin{equation}
\frac d{dt}\abs{M(t)}=\int_Me^\psi H.
\end{equation}
\cvm
The arguments in \rs{1} now yield
\bt
\tup{(i)} Suppose there exists a positive constant $\e_0$ such that the mean
curvature $H(t)$ of the slices $M(t)$ is estimated by
\begin{align}
H(t)&\ge \e_0&\A\,t_1\le t< T_+&,\\
\intertext{and}
H(t)&\le-\e_0&\A\,T_-<t\le t_2&,
\end{align}
\cvm
\nd then
\begin{align}
\abs{N_+}&\le \frac1{\e_0}\lim_{t\ra T_+}\abs{M(t)},\\
\intertext{and}
\abs{N_-}&\le \frac1{\e_0}\lim_{t\ra T_-}\abs{M(t}.
\end{align}
\cvm
\tup{(ii)} On the other hand, if the mean curvature $H$ is negative in $N_+$ and
positive in $N_-$, then, we obtain the same estimates as \rt{0.1}, namely,
\begin{align}
\abs{N_+}&\le \frac1{\e_0}\abs{M(t_1)},\\
\intertext{and}
\abs{N_-}&\le \frac1{\e_0}\abs{M(t_2)}.
\end{align}
\et
\cvb
\begin{thebibliography}{99}
\bib{es}
D. Eardley \& L. Smarr, \emph{Time functions in numerical relativity: marginally
bound dust collapse}, Phys. Rev. D \tbf{19} (1979) 2239\nbdd2259.
\bib{cg1}
C. Gerhardt, \emph{H-surfaces in Lorentzian manifolds}, Commun. Math. Phys.
\tbf{89} (1983) 523\nbdd{553}.
\bib{cg4}
\bysame, \emph{Hypersurfaces of prescribed Weingarten curvature}, Math. Z.
\tbf{224} (1997) 167\nbdd{194}.
\url{http://www.math.uni-heidelberg.de/studinfo/gerhardt/MZ224,97.pdf}
\bib{cg6}
\bysame, \emph{On the foliation of space-time by constant mean curvature
hypersurfaces}, preprint,
\url{http://www.math.uni-heidelberg.de/studinfo/gerhardt/Foliation.pdf}
\bib{cg8}
\bysame, \emph{Hypersurfaces of
prescribed curvature in Lorentzian manifolds}, Indiana Univ. Math. J. \tbf{49}
(2000) 1125\nbdd1153.
\url{http://www.math.uni-heidelberg.de/studinfo/gerhardt/GaussLorentz.pdf}]
\bib{HE}
S. W. Hawking \& G. F. R. Ellis, \emph{The large scale structure of space-time},
Cambridge University Press, Cambridge, 1973.
\end{thebibliography}
\end{document}
%------------------------------------------------------------------------------
% End of journal.top
%------------------------------------------------------------------------------
\ No newline at end of file diff --git a/Build/source/texk/web2c/synctexdir/tests/bartest.synctex.gz b/Build/source/texk/web2c/synctexdir/tests/bartest.synctex.gz Binary files differnew file mode 100644 index 00000000000..7cdd7cb2dab --- /dev/null +++ b/Build/source/texk/web2c/synctexdir/tests/bartest.synctex.gz diff --git a/Build/source/texk/web2c/synctexdir/tests/footest.synctex b/Build/source/texk/web2c/synctexdir/tests/footest.synctex new file mode 100644 index 00000000000..6004cb6391f --- /dev/null +++ b/Build/source/texk/web2c/synctexdir/tests/footest.synctex @@ -0,0 +1,8587 @@ +SyncTeX Version:1 +Input:1:test.tex +Input:2:/usr/local/texlive/2008/texmf-dist/tex/latex/base/book.cls +Input:3:/usr/local/texlive/2008/texmf-dist/tex/latex/base/bk11.clo +Input:4:/usr/local/texlive/2008/texmf-dist/tex/generic/babel/babel.sty +Input:5:/usr/local/texlive/2008/texmf-dist/tex/generic/babel/english.ldf +Input:6:/usr/local/texlive/2008/texmf-dist/tex/generic/babel/babel.def +Input:7:/usr/local/texlive/2008/texmf-dist/tex/generic/babel/bahasai.ldf +Input:8:/usr/local/texlive/2008/texmf-dist/tex/latex/booktabs/booktabs.sty +Input:9:/usr/local/texlive/2008/texmf-dist/tex/latex/graphics/graphicx.sty +Input:10:/usr/local/texlive/2008/texmf-dist/tex/latex/graphics/keyval.sty +Input:11:/usr/local/texlive/2008/texmf-dist/tex/latex/graphics/graphics.sty +Input:12:/usr/local/texlive/2008/texmf-dist/tex/latex/graphics/trig.sty +Input:13:/usr/local/texlive/2008/texmf/tex/latex/config/graphics.cfg +Input:14:/usr/local/texlive/2008/texmf-dist/tex/latex/pdftex-def/pdftex.def +Input:15:/usr/local/texlive/2008/texmf-dist/tex/latex/amsfonts/amssymb.sty +Input:16:/usr/local/texlive/2008/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Input:17:/usr/local/texlive/2008/texmf-dist/tex/latex/jknapltx/mathrsfs.sty +Input:18:/usr/local/texlive/2008/texmf-dist/tex/latex/base/textcomp.sty +Input:19:/usr/local/texlive/2008/texmf-dist/tex/latex/base/ts1enc.def +Input:20:/usr/local/texlive/2008/texmf-dist/tex/latex/base/syntonly.sty +Input:21:/usr/local/texlive/2008/texmf-dist/tex/latex/mhchem/mhchem.sty +Input:22:/usr/local/texlive/2008/texmf-dist/tex/latex/base/ifthen.sty +Input:23:/usr/local/texlive/2008/texmf-dist/tex/latex/tools/calc.sty +Input:24:/usr/local/texlive/2008/texmf-dist/tex/latex/oberdiek/twoopt.sty +Input:25:/usr/local/texlive/2008/texmf-dist/tex/latex/amsmath/amsmath.sty +Input:26:/usr/local/texlive/2008/texmf-dist/tex/latex/amsmath/amstext.sty +Input:27:/usr/local/texlive/2008/texmf-dist/tex/latex/amsmath/amsgen.sty +Input:28:/usr/local/texlive/2008/texmf-dist/tex/latex/amsmath/amsbsy.sty +Input:29:/usr/local/texlive/2008/texmf-dist/tex/latex/amsmath/amsopn.sty +Input:30:/usr/local/texlive/2008/texmf-dist/tex/latex/mh/xfrac.sty +Input:31:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3names.sty +Input:32:/usr/local/texlive/2008/texmf-dist/tex/latex/xpackages/template.sty +Input:33:/usr/local/texlive/2008/texmf-dist/tex/latex/xpackages/ldcsetup.sty +Input:34:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3calc.sty +Input:35:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3int.sty +Input:36:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3num.sty +Input:37:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3expan.sty +Input:38:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3tlp.sty +Input:39:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3basics.sty +Input:40:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3skip.sty +Input:41:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3prg.sty +Input:42:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3quark.sty +Input:43:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3toks.sty +Input:44:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3box.sty +Input:45:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3token.sty +Input:46:/usr/local/texlive/2008/texmf-dist/tex/latex/xpackages/xparse.sty +Input:47:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3seq.sty +Input:48:/usr/local/texlive/2008/texmf-dist/tex/latex/expl3/l3clist.sty +Input:49:/usr/local/texlive/2008/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Input:50:/usr/local/texlive/2008/texmf-dist/tex/generic/xkeyval/xkeyval.tex +Input:51:/usr/local/texlive/2008/texmf-dist/tex/latex/siunitx/siunitx.sty +Input:52:/usr/local/texlive/2008/texmf-dist/tex/latex/tools/array.sty +Input:53:/usr/local/texlive/2008/texmf-dist/tex/latex/tools/xspace.sty +Input:54:/usr/local/texlive/2008/texmf-dist/tex/latex/siunitx/config/si-prefix.cfg +Input:55:/usr/local/texlive/2008/texmf-dist/tex/latex/siunitx/config/si-named.cfg +Input:56:/usr/local/texlive/2008/texmf-dist/tex/latex/siunitx/config/si-addn.cfg +Input:57:/usr/local/texlive/2008/texmf-dist/tex/latex/siunitx/config/si-prefixed.cfg +Input:58:/usr/local/texlive/2008/texmf-dist/tex/latex/siunitx/config/si-accepted.cfg +Input:59:/usr/local/texlive/2008/texmf-dist/tex/latex/siunitx/config/si-physical.cfg +Input:60:/usr/local/texlive/2008/texmf-dist/tex/latex/siunitx/config/si-abbr.cfg +Input:61:/usr/local/texlive/2008/texmf-dist/tex/latex/titlesec/titlesec.sty +Input:62:/usr/local/texlive/2008/texmf-dist/tex/latex/graphics/color.sty +Input:63:/usr/local/texlive/2008/texmf/tex/latex/config/color.cfg +Input:64:test.aux +Input:65:/usr/local/texlive/2008/texmf-dist/tex/latex/base/ts1cmr.fd +Input:66:/usr/local/texlive/2008/texmf-dist/tex/context/base/supp-pdf.tex +Input:67:/usr/local/texlive/2008/texmf-dist/tex/latex/amsfonts/umsa.fd +Input:68:/usr/local/texlive/2008/texmf-dist/tex/latex/amsfonts/umsb.fd +Input:69:/usr/local/texlive/2008/texmf-dist/tex/latex/jknapltx/ursfs.fd +Output:pdf +Magnification:1000 +Unit:1 +X Offset:0 +Y Offset:0 +Content: +!5050 +{1 +[1,24:4736286,45679049:25493504,40942763,0 +[1,24:6636830,45679049:23592960,39369899,0 +[1,24:6636830,7095582:23592960,786432,0 +(1,24:6636830,7095582:23592960,0,0 +h1,24:6636830,7095582:23592960,0,0 +) +] +[1,24:6636830,43879237:23592960,35481206,0 +h1,24:6636830,9118927:0,0,0 +(1,24:6636830,22608969:23592960,786432,220273 +k1,24:12651320,22608969:6014490 +(1,24:12651320,22608969:0,0,0 +g1,24:12651320,22608969 +g1,24:12651320,22608969 +g1,24:12292510,22608969 +(1,24:12292510,22608969:0,0,0 +) +g1,24:12651320,22608969 +) +x1,24:15351466,22608969 +x1,24:17316524,22608969 +g1,24:17658400,22608969 +x1,24:20432273,22608969 +g1,24:20774149,22608969 +x1,24:23087820,22608969 +x1,24:24215301,22608969 +g1,24:24215301,22608969 +k1,24:30229790,22608969:6014489 +) +(1,24:6636830,25679336:23592960,642250,275254 +k1,24:15356059,25679336:8719229 +h1,24:15356059,25679336:0,0,0 +(1,24:15356059,25679336:6154503,642250,275254 +$1,24:15356059,25679336 +[1,24:15356059,25679336:6154503,642250,275254 +(1,24:15356059,25679336:6154503,642250,275254 +g1,24:15356059,25679336 +(1,24:15356059,25679336:6154503,642250,275254 +r1,24:15356059,25679336:0,917504,275254 +g1,24:15749275,25679336 +g1,24:15749275,25679336 +x1,24:19150012,25679336 +g1,24:19406692,25679336 +x1,24:21117346,25679336 +g1,24:21117346,25679336 +g1,24:21510562,25679336 +) +g1,24:21510562,25679336 +) +] +$1,24:21510562,25679336 +) +g1,24:21510562,25679336 +k1,24:30229790,25679336:8719228 +) +h1,24:6636830,35763147:0,0,0 +] +(1,24:6636830,45679049:23592960,0,0 +h1,24:6636830,45679049:23592960,0,0 +) +] +] +!1515 +}1 +!9 +{2 +[1,25:4736286,45679049:28835840,40942763,0 +[1,25:9979166,45679049:23592960,39369899,0 +[1,25:9979166,7095582:23592960,786432,0 +(1,25:9979166,7095582:23592960,479268,0 +(1,25:9979166,7095582:23592960,479268,0 +x1,25:10377844,7095582 +k1,25:33572126,7095582:23194282 +) +) +] +[1,25:9979166,43879237:0,35481206,0 +h1,25:9979166,9118927:0,0,0 +] +(1,25:9979166,45679049:23592960,0,0 +h1,25:9979166,45679049:23592960,0,0 +) +] +] +!417 +}2 +Input:70:test.toc +!34 +{3 +[1,26:4736286,45679049:25493504,40942763,0 +[1,26:6636830,45679049:23592960,39369899,0 +[1,26:6636830,7095582:23592960,786432,0 +(1,26:6636830,7095582:23592960,0,0 +h1,26:6636830,7095582:23592960,0,0 +) +] +[1,26:6636830,43879237:23592960,35481206,0 +(1,25:6636830,14361807:23592960,1132315,0 +h1,25:6636830,14361807:0,0,0 +x1,25:11849261,14361807 +g1,25:12460712,14361807 +x1,25:14376972,14361807 +k1,25:22303381,14361807:7926409 +k1,25:30229790,14361807:7926409 +) +(70,2:6636830,18592158:23592960,498346,139537 +g70,2:7713261,18592158 +g70,2:6636830,18592158 +(70,2:6636830,18592158:1076431,462465,0 +x70,2:7049458,18592158 +k70,2:7713261,18592158:663803 +) +x70,2:10101921,18592158 +g70,2:10377006,18592158 +x70,2:11672201,18592158 +x70,2:12084829,18592158 +x70,2:12463071,18592158 +x70,2:13036166,18592158 +x70,2:13414408,18592158 +g70,2:13689493,18592158 +x70,2:15535856,18592158 +x70,2:16429883,18592158 +k70,2:28950640,18592158:12520757 +(70,2:28950640,18592158:1279150,462465,0 +k70,2:29817162,18592158:866522 +x70,2:30229790,18592158 +) +g70,2:29117476,18592158 +g70,2:30229790,18592158 +) +(70,3:6636830,19483448:23592960,498346,0 +g70,3:9363791,19483448 +h70,3:9363791,19483448:1076431,0,0 +h70,3:10440222,19483448:0,0,0 +g70,3:7713261,19483448 +(70,3:7713261,19483448:1650530,462465,0 +x70,3:8630220,19483448 +k70,3:9363791,19483448:733571 +) +x70,3:11430936,19483448 +g70,3:11670142,19483448 +x70,3:14787804,19483448 +(70,3:15008945,19483448:558141,75748,0 +$70,3:15008945,19483448 +(70,3:15188346,19483448:199339,75748,0 +x70,3:15387685,19483448 +) +$70,3:15567086,19483448 +) +(70,3:15567086,19483448:558141,75748,0 +(70,3:15746487,19483448:199339,75748,0 +x70,3:15945826,19483448 +) +) +(70,3:16125227,19483448:558141,75748,0 +(70,3:16304628,19483448:199339,75748,0 +x70,3:16503967,19483448 +) +) +(70,3:16683368,19483448:558141,75748,0 +(70,3:16862769,19483448:199339,75748,0 +x70,3:17062108,19483448 +) +) +(70,3:17241509,19483448:558141,75748,0 +(70,3:17420910,19483448:199339,75748,0 +x70,3:17620249,19483448 +) +) +(70,3:17799650,19483448:558141,75748,0 +(70,3:17979051,19483448:199339,75748,0 +x70,3:18178390,19483448 +) +) +(70,3:18357791,19483448:558141,75748,0 +(70,3:18537192,19483448:199339,75748,0 +x70,3:18736531,19483448 +) +) +(70,3:18915932,19483448:558141,75748,0 +(70,3:19095333,19483448:199339,75748,0 +x70,3:19294672,19483448 +) +) +(70,3:19474073,19483448:558141,75748,0 +(70,3:19653474,19483448:199339,75748,0 +x70,3:19852813,19483448 +) +) +(70,3:20032214,19483448:558141,75748,0 +(70,3:20211615,19483448:199339,75748,0 +x70,3:20410954,19483448 +) +) +(70,3:20590355,19483448:558141,75748,0 +(70,3:20769756,19483448:199339,75748,0 +x70,3:20969095,19483448 +) +) +(70,3:21148496,19483448:558141,75748,0 +(70,3:21327897,19483448:199339,75748,0 +x70,3:21527236,19483448 +) +) +(70,3:21706637,19483448:558141,75748,0 +(70,3:21886038,19483448:199339,75748,0 +x70,3:22085377,19483448 +) +) +(70,3:22264778,19483448:558141,75748,0 +(70,3:22444179,19483448:199339,75748,0 +x70,3:22643518,19483448 +) +) +(70,3:22822919,19483448:558141,75748,0 +(70,3:23002320,19483448:199339,75748,0 +x70,3:23201659,19483448 +) +) +(70,3:23381060,19483448:558141,75748,0 +(70,3:23560461,19483448:199339,75748,0 +x70,3:23759800,19483448 +) +) +(70,3:23939201,19483448:558141,75748,0 +(70,3:24118602,19483448:199339,75748,0 +x70,3:24317941,19483448 +) +) +(70,3:24497342,19483448:558141,75748,0 +(70,3:24676743,19483448:199339,75748,0 +x70,3:24876082,19483448 +) +) +(70,3:25055483,19483448:558141,75748,0 +(70,3:25234884,19483448:199339,75748,0 +x70,3:25434223,19483448 +) +) +(70,3:25613624,19483448:558141,75748,0 +(70,3:25793025,19483448:199339,75748,0 +x70,3:25992364,19483448 +) +) +(70,3:26171765,19483448:558141,75748,0 +(70,3:26351166,19483448:199339,75748,0 +x70,3:26550505,19483448 +) +) +(70,3:26729906,19483448:558141,75748,0 +(70,3:26909307,19483448:199339,75748,0 +x70,3:27108646,19483448 +) +) +(70,3:27288047,19483448:558141,75748,0 +(70,3:27467448,19483448:199339,75748,0 +x70,3:27666787,19483448 +) +) +(70,3:27846188,19483448:558141,75748,0 +(70,3:28025589,19483448:199339,75748,0 +x70,3:28224928,19483448 +) +) +(70,3:28404329,19483448:558141,75748,0 +(70,3:28583730,19483448:199339,75748,0 +x70,3:28783069,19483448 +) +) +(70,3:29117476,19483448:1112314,462465,0 +k70,3:29870980,19483448:753504 +x70,3:30229790,19483448 +) +g70,3:28399855,19483448 +g70,3:30229790,19483448 +) +(70,4:6636830,20374738:23592960,498346,0 +g70,4:11660176,20374738 +h70,4:11660176,20374738:2726961,0,0 +h70,4:14387137,20374738:0,0,0 +g70,4:9363791,20374738 +(70,4:9363791,20374738:2296385,462465,0 +x70,4:10838899,20374738 +k70,4:11660176,20374738:821277 +) +x70,4:14777838,20374738 +g70,4:15017044,20374738 +x70,4:17209773,20374738 +x70,4:18385874,20374738 +(70,4:18915932,20374738:558141,75748,0 +$70,4:18915932,20374738 +(70,4:19095333,20374738:199339,75748,0 +x70,4:19294672,20374738 +) +$70,4:19474073,20374738 +) +(70,4:19474073,20374738:558141,75748,0 +(70,4:19653474,20374738:199339,75748,0 +x70,4:19852813,20374738 +) +) +(70,4:20032214,20374738:558141,75748,0 +(70,4:20211615,20374738:199339,75748,0 +x70,4:20410954,20374738 +) +) +(70,4:20590355,20374738:558141,75748,0 +(70,4:20769756,20374738:199339,75748,0 +x70,4:20969095,20374738 +) +) +(70,4:21148496,20374738:558141,75748,0 +(70,4:21327897,20374738:199339,75748,0 +x70,4:21527236,20374738 +) +) +(70,4:21706637,20374738:558141,75748,0 +(70,4:21886038,20374738:199339,75748,0 +x70,4:22085377,20374738 +) +) +(70,4:22264778,20374738:558141,75748,0 +(70,4:22444179,20374738:199339,75748,0 +x70,4:22643518,20374738 +) +) +(70,4:22822919,20374738:558141,75748,0 +(70,4:23002320,20374738:199339,75748,0 +x70,4:23201659,20374738 +) +) +(70,4:23381060,20374738:558141,75748,0 +(70,4:23560461,20374738:199339,75748,0 +x70,4:23759800,20374738 +) +) +(70,4:23939201,20374738:558141,75748,0 +(70,4:24118602,20374738:199339,75748,0 +x70,4:24317941,20374738 +) +) +(70,4:24497342,20374738:558141,75748,0 +(70,4:24676743,20374738:199339,75748,0 +x70,4:24876082,20374738 +) +) +(70,4:25055483,20374738:558141,75748,0 +(70,4:25234884,20374738:199339,75748,0 +x70,4:25434223,20374738 +) +) +(70,4:25613624,20374738:558141,75748,0 +(70,4:25793025,20374738:199339,75748,0 +x70,4:25992364,20374738 +) +) +(70,4:26171765,20374738:558141,75748,0 +(70,4:26351166,20374738:199339,75748,0 +x70,4:26550505,20374738 +) +) +(70,4:26729906,20374738:558141,75748,0 +(70,4:26909307,20374738:199339,75748,0 +x70,4:27108646,20374738 +) +) +(70,4:27288047,20374738:558141,75748,0 +(70,4:27467448,20374738:199339,75748,0 +x70,4:27666787,20374738 +) +) +(70,4:27846188,20374738:558141,75748,0 +(70,4:28025589,20374738:199339,75748,0 +x70,4:28224928,20374738 +) +) +(70,4:28404329,20374738:558141,75748,0 +(70,4:28583730,20374738:199339,75748,0 +x70,4:28783069,20374738 +) +) +(70,4:29117476,20374738:1112314,462465,0 +k70,4:29870980,20374738:753504 +x70,4:30229790,20374738 +) +g70,4:28399855,20374738 +g70,4:30229790,20374738 +) +(70,5:6636830,21266028:23592960,498346,0 +g70,5:11660176,21266028 +h70,5:11660176,21266028:2726961,0,0 +h70,5:14387137,21266028:0,0,0 +g70,5:9363791,21266028 +(70,5:9363791,21266028:2296385,462465,0 +x70,5:10838899,21266028 +k70,5:11660176,21266028:821277 +) +x70,5:14777838,21266028 +g70,5:15017044,21266028 +x70,5:17321403,21266028 +x70,5:18497504,21266028 +(70,5:18915932,21266028:558141,75748,0 +$70,5:18915932,21266028 +(70,5:19095333,21266028:199339,75748,0 +x70,5:19294672,21266028 +) +$70,5:19474073,21266028 +) +(70,5:19474073,21266028:558141,75748,0 +(70,5:19653474,21266028:199339,75748,0 +x70,5:19852813,21266028 +) +) +(70,5:20032214,21266028:558141,75748,0 +(70,5:20211615,21266028:199339,75748,0 +x70,5:20410954,21266028 +) +) +(70,5:20590355,21266028:558141,75748,0 +(70,5:20769756,21266028:199339,75748,0 +x70,5:20969095,21266028 +) +) +(70,5:21148496,21266028:558141,75748,0 +(70,5:21327897,21266028:199339,75748,0 +x70,5:21527236,21266028 +) +) +(70,5:21706637,21266028:558141,75748,0 +(70,5:21886038,21266028:199339,75748,0 +x70,5:22085377,21266028 +) +) +(70,5:22264778,21266028:558141,75748,0 +(70,5:22444179,21266028:199339,75748,0 +x70,5:22643518,21266028 +) +) +(70,5:22822919,21266028:558141,75748,0 +(70,5:23002320,21266028:199339,75748,0 +x70,5:23201659,21266028 +) +) +(70,5:23381060,21266028:558141,75748,0 +(70,5:23560461,21266028:199339,75748,0 +x70,5:23759800,21266028 +) +) +(70,5:23939201,21266028:558141,75748,0 +(70,5:24118602,21266028:199339,75748,0 +x70,5:24317941,21266028 +) +) +(70,5:24497342,21266028:558141,75748,0 +(70,5:24676743,21266028:199339,75748,0 +x70,5:24876082,21266028 +) +) +(70,5:25055483,21266028:558141,75748,0 +(70,5:25234884,21266028:199339,75748,0 +x70,5:25434223,21266028 +) +) +(70,5:25613624,21266028:558141,75748,0 +(70,5:25793025,21266028:199339,75748,0 +x70,5:25992364,21266028 +) +) +(70,5:26171765,21266028:558141,75748,0 +(70,5:26351166,21266028:199339,75748,0 +x70,5:26550505,21266028 +) +) +(70,5:26729906,21266028:558141,75748,0 +(70,5:26909307,21266028:199339,75748,0 +x70,5:27108646,21266028 +) +) +(70,5:27288047,21266028:558141,75748,0 +(70,5:27467448,21266028:199339,75748,0 +x70,5:27666787,21266028 +) +) +(70,5:27846188,21266028:558141,75748,0 +(70,5:28025589,21266028:199339,75748,0 +x70,5:28224928,21266028 +) +) +(70,5:28404329,21266028:558141,75748,0 +(70,5:28583730,21266028:199339,75748,0 +x70,5:28783069,21266028 +) +) +(70,5:29117476,21266028:1112314,462465,0 +k70,5:29870980,21266028:753504 +x70,5:30229790,21266028 +) +g70,5:28399855,21266028 +g70,5:30229790,21266028 +) +(70,6:6636830,22157318:23592960,498346,139537 +g70,6:14602427,22157318 +h70,6:14602427,22157318:5023347,0,0 +h70,6:19625774,22157318:0,0,0 +g70,6:11660177,22157318 +x70,6:15032991,22157318 +(70,6:15567086,22157318:558141,75748,0 +$70,6:15567086,22157318 +(70,6:15746487,22157318:199339,75748,0 +x70,6:15945826,22157318 +) +$70,6:16125227,22157318 +) +(70,6:16125227,22157318:558141,75748,0 +(70,6:16304628,22157318:199339,75748,0 +x70,6:16503967,22157318 +) +) +(70,6:16683368,22157318:558141,75748,0 +(70,6:16862769,22157318:199339,75748,0 +x70,6:17062108,22157318 +) +) +(70,6:17241509,22157318:558141,75748,0 +(70,6:17420910,22157318:199339,75748,0 +x70,6:17620249,22157318 +) +) +(70,6:17799650,22157318:558141,75748,0 +(70,6:17979051,22157318:199339,75748,0 +x70,6:18178390,22157318 +) +) +(70,6:18357791,22157318:558141,75748,0 +(70,6:18537192,22157318:199339,75748,0 +x70,6:18736531,22157318 +) +) +(70,6:18915932,22157318:558141,75748,0 +(70,6:19095333,22157318:199339,75748,0 +x70,6:19294672,22157318 +) +) +(70,6:19474073,22157318:558141,75748,0 +(70,6:19653474,22157318:199339,75748,0 +x70,6:19852813,22157318 +) +) +(70,6:20032214,22157318:558141,75748,0 +(70,6:20211615,22157318:199339,75748,0 +x70,6:20410954,22157318 +) +) +(70,6:20590355,22157318:558141,75748,0 +(70,6:20769756,22157318:199339,75748,0 +x70,6:20969095,22157318 +) +) +(70,6:21148496,22157318:558141,75748,0 +(70,6:21327897,22157318:199339,75748,0 +x70,6:21527236,22157318 +) +) +(70,6:21706637,22157318:558141,75748,0 +(70,6:21886038,22157318:199339,75748,0 +x70,6:22085377,22157318 +) +) +(70,6:22264778,22157318:558141,75748,0 +(70,6:22444179,22157318:199339,75748,0 +x70,6:22643518,22157318 +) +) +(70,6:22822919,22157318:558141,75748,0 +(70,6:23002320,22157318:199339,75748,0 +x70,6:23201659,22157318 +) +) +(70,6:23381060,22157318:558141,75748,0 +(70,6:23560461,22157318:199339,75748,0 +x70,6:23759800,22157318 +) +) +(70,6:23939201,22157318:558141,75748,0 +(70,6:24118602,22157318:199339,75748,0 +x70,6:24317941,22157318 +) +) +(70,6:24497342,22157318:558141,75748,0 +(70,6:24676743,22157318:199339,75748,0 +x70,6:24876082,22157318 +) +) +(70,6:25055483,22157318:558141,75748,0 +(70,6:25234884,22157318:199339,75748,0 +x70,6:25434223,22157318 +) +) +(70,6:25613624,22157318:558141,75748,0 +(70,6:25793025,22157318:199339,75748,0 +x70,6:25992364,22157318 +) +) +(70,6:26171765,22157318:558141,75748,0 +(70,6:26351166,22157318:199339,75748,0 +x70,6:26550505,22157318 +) +) +(70,6:26729906,22157318:558141,75748,0 +(70,6:26909307,22157318:199339,75748,0 +x70,6:27108646,22157318 +) +) +(70,6:27288047,22157318:558141,75748,0 +(70,6:27467448,22157318:199339,75748,0 +x70,6:27666787,22157318 +) +) +(70,6:27846188,22157318:558141,75748,0 +(70,6:28025589,22157318:199339,75748,0 +x70,6:28224928,22157318 +) +) +(70,6:28404329,22157318:558141,75748,0 +(70,6:28583730,22157318:199339,75748,0 +x70,6:28783069,22157318 +) +) +(70,6:29117476,22157318:1112314,462465,0 +k70,6:29870980,22157318:753504 +x70,6:30229790,22157318 +) +g70,6:28399855,22157318 +g70,6:30229790,22157318 +) +(70,7:6636830,23048608:23592960,498346,139537 +g70,7:14602427,23048608 +h70,7:14602427,23048608:5023347,0,0 +h70,7:19625774,23048608:0,0,0 +g70,7:11660177,23048608 +x70,7:14215703,23048608 +g70,7:14454909,23048608 +x70,7:16522054,23048608 +g70,7:16761260,23048608 +x70,7:17229707,23048608 +x70,7:19125418,23048608 +x70,7:21064986,23048608 +(70,7:21148496,23048608:558141,75748,0 +$70,7:21148496,23048608 +(70,7:21327897,23048608:199339,75748,0 +x70,7:21527236,23048608 +) +$70,7:21706637,23048608 +) +(70,7:21706637,23048608:558141,75748,0 +(70,7:21886038,23048608:199339,75748,0 +x70,7:22085377,23048608 +) +) +(70,7:22264778,23048608:558141,75748,0 +(70,7:22444179,23048608:199339,75748,0 +x70,7:22643518,23048608 +) +) +(70,7:22822919,23048608:558141,75748,0 +(70,7:23002320,23048608:199339,75748,0 +x70,7:23201659,23048608 +) +) +(70,7:23381060,23048608:558141,75748,0 +(70,7:23560461,23048608:199339,75748,0 +x70,7:23759800,23048608 +) +) +(70,7:23939201,23048608:558141,75748,0 +(70,7:24118602,23048608:199339,75748,0 +x70,7:24317941,23048608 +) +) +(70,7:24497342,23048608:558141,75748,0 +(70,7:24676743,23048608:199339,75748,0 +x70,7:24876082,23048608 +) +) +(70,7:25055483,23048608:558141,75748,0 +(70,7:25234884,23048608:199339,75748,0 +x70,7:25434223,23048608 +) +) +(70,7:25613624,23048608:558141,75748,0 +(70,7:25793025,23048608:199339,75748,0 +x70,7:25992364,23048608 +) +) +(70,7:26171765,23048608:558141,75748,0 +(70,7:26351166,23048608:199339,75748,0 +x70,7:26550505,23048608 +) +) +(70,7:26729906,23048608:558141,75748,0 +(70,7:26909307,23048608:199339,75748,0 +x70,7:27108646,23048608 +) +) +(70,7:27288047,23048608:558141,75748,0 +(70,7:27467448,23048608:199339,75748,0 +x70,7:27666787,23048608 +) +) +(70,7:27846188,23048608:558141,75748,0 +(70,7:28025589,23048608:199339,75748,0 +x70,7:28224928,23048608 +) +) +(70,7:28404329,23048608:558141,75748,0 +(70,7:28583730,23048608:199339,75748,0 +x70,7:28783069,23048608 +) +) +(70,7:29117476,23048608:1112314,462465,0 +k70,7:29870980,23048608:753504 +x70,7:30229790,23048608 +) +g70,7:28399855,23048608 +g70,7:30229790,23048608 +) +(70,8:6636830,23939898:23592960,498346,0 +g70,8:14602427,23939898 +h70,8:14602427,23939898:5023347,0,0 +h70,8:19625774,23939898:0,0,0 +g70,8:11660177,23939898 +x70,8:13721341,23939898 +g70,8:13960547,23939898 +x70,8:14428994,23939898 +x70,8:16324705,23939898 +x70,8:18264273,23939898 +(70,8:18357791,23939898:558141,75748,0 +$70,8:18357791,23939898 +(70,8:18537192,23939898:199339,75748,0 +x70,8:18736531,23939898 +) +$70,8:18915932,23939898 +) +(70,8:18915932,23939898:558141,75748,0 +(70,8:19095333,23939898:199339,75748,0 +x70,8:19294672,23939898 +) +) +(70,8:19474073,23939898:558141,75748,0 +(70,8:19653474,23939898:199339,75748,0 +x70,8:19852813,23939898 +) +) +(70,8:20032214,23939898:558141,75748,0 +(70,8:20211615,23939898:199339,75748,0 +x70,8:20410954,23939898 +) +) +(70,8:20590355,23939898:558141,75748,0 +(70,8:20769756,23939898:199339,75748,0 +x70,8:20969095,23939898 +) +) +(70,8:21148496,23939898:558141,75748,0 +(70,8:21327897,23939898:199339,75748,0 +x70,8:21527236,23939898 +) +) +(70,8:21706637,23939898:558141,75748,0 +(70,8:21886038,23939898:199339,75748,0 +x70,8:22085377,23939898 +) +) +(70,8:22264778,23939898:558141,75748,0 +(70,8:22444179,23939898:199339,75748,0 +x70,8:22643518,23939898 +) +) +(70,8:22822919,23939898:558141,75748,0 +(70,8:23002320,23939898:199339,75748,0 +x70,8:23201659,23939898 +) +) +(70,8:23381060,23939898:558141,75748,0 +(70,8:23560461,23939898:199339,75748,0 +x70,8:23759800,23939898 +) +) +(70,8:23939201,23939898:558141,75748,0 +(70,8:24118602,23939898:199339,75748,0 +x70,8:24317941,23939898 +) +) +(70,8:24497342,23939898:558141,75748,0 +(70,8:24676743,23939898:199339,75748,0 +x70,8:24876082,23939898 +) +) +(70,8:25055483,23939898:558141,75748,0 +(70,8:25234884,23939898:199339,75748,0 +x70,8:25434223,23939898 +) +) +(70,8:25613624,23939898:558141,75748,0 +(70,8:25793025,23939898:199339,75748,0 +x70,8:25992364,23939898 +) +) +(70,8:26171765,23939898:558141,75748,0 +(70,8:26351166,23939898:199339,75748,0 +x70,8:26550505,23939898 +) +) +(70,8:26729906,23939898:558141,75748,0 +(70,8:26909307,23939898:199339,75748,0 +x70,8:27108646,23939898 +) +) +(70,8:27288047,23939898:558141,75748,0 +(70,8:27467448,23939898:199339,75748,0 +x70,8:27666787,23939898 +) +) +(70,8:27846188,23939898:558141,75748,0 +(70,8:28025589,23939898:199339,75748,0 +x70,8:28224928,23939898 +) +) +(70,8:28404329,23939898:558141,75748,0 +(70,8:28583730,23939898:199339,75748,0 +x70,8:28783069,23939898 +) +) +(70,8:29117476,23939898:1112314,462465,0 +k70,8:29870980,23939898:753504 +x70,8:30229790,23939898 +) +g70,8:28399855,23939898 +g70,8:30229790,23939898 +) +(70,9:6636830,24831188:23592960,490372,0 +g70,9:14602427,24831188 +h70,9:14602427,24831188:5023347,0,0 +h70,9:19625774,24831188:0,0,0 +g70,9:11660177,24831188 +x70,9:13799084,24831188 +(70,9:13892663,24831188:558141,75748,0 +$70,9:13892663,24831188 +(70,9:14072064,24831188:199339,75748,0 +x70,9:14271403,24831188 +) +$70,9:14450804,24831188 +) +(70,9:14450804,24831188:558141,75748,0 +(70,9:14630205,24831188:199339,75748,0 +x70,9:14829544,24831188 +) +) +(70,9:15008945,24831188:558141,75748,0 +(70,9:15188346,24831188:199339,75748,0 +x70,9:15387685,24831188 +) +) +(70,9:15567086,24831188:558141,75748,0 +(70,9:15746487,24831188:199339,75748,0 +x70,9:15945826,24831188 +) +) +(70,9:16125227,24831188:558141,75748,0 +(70,9:16304628,24831188:199339,75748,0 +x70,9:16503967,24831188 +) +) +(70,9:16683368,24831188:558141,75748,0 +(70,9:16862769,24831188:199339,75748,0 +x70,9:17062108,24831188 +) +) +(70,9:17241509,24831188:558141,75748,0 +(70,9:17420910,24831188:199339,75748,0 +x70,9:17620249,24831188 +) +) +(70,9:17799650,24831188:558141,75748,0 +(70,9:17979051,24831188:199339,75748,0 +x70,9:18178390,24831188 +) +) +(70,9:18357791,24831188:558141,75748,0 +(70,9:18537192,24831188:199339,75748,0 +x70,9:18736531,24831188 +) +) +(70,9:18915932,24831188:558141,75748,0 +(70,9:19095333,24831188:199339,75748,0 +x70,9:19294672,24831188 +) +) +(70,9:19474073,24831188:558141,75748,0 +(70,9:19653474,24831188:199339,75748,0 +x70,9:19852813,24831188 +) +) +(70,9:20032214,24831188:558141,75748,0 +(70,9:20211615,24831188:199339,75748,0 +x70,9:20410954,24831188 +) +) +(70,9:20590355,24831188:558141,75748,0 +(70,9:20769756,24831188:199339,75748,0 +x70,9:20969095,24831188 +) +) +(70,9:21148496,24831188:558141,75748,0 +(70,9:21327897,24831188:199339,75748,0 +x70,9:21527236,24831188 +) +) +(70,9:21706637,24831188:558141,75748,0 +(70,9:21886038,24831188:199339,75748,0 +x70,9:22085377,24831188 +) +) +(70,9:22264778,24831188:558141,75748,0 +(70,9:22444179,24831188:199339,75748,0 +x70,9:22643518,24831188 +) +) +(70,9:22822919,24831188:558141,75748,0 +(70,9:23002320,24831188:199339,75748,0 +x70,9:23201659,24831188 +) +) +(70,9:23381060,24831188:558141,75748,0 +(70,9:23560461,24831188:199339,75748,0 +x70,9:23759800,24831188 +) +) +(70,9:23939201,24831188:558141,75748,0 +(70,9:24118602,24831188:199339,75748,0 +x70,9:24317941,24831188 +) +) +(70,9:24497342,24831188:558141,75748,0 +(70,9:24676743,24831188:199339,75748,0 +x70,9:24876082,24831188 +) +) +(70,9:25055483,24831188:558141,75748,0 +(70,9:25234884,24831188:199339,75748,0 +x70,9:25434223,24831188 +) +) +(70,9:25613624,24831188:558141,75748,0 +(70,9:25793025,24831188:199339,75748,0 +x70,9:25992364,24831188 +) +) +(70,9:26171765,24831188:558141,75748,0 +(70,9:26351166,24831188:199339,75748,0 +x70,9:26550505,24831188 +) +) +(70,9:26729906,24831188:558141,75748,0 +(70,9:26909307,24831188:199339,75748,0 +x70,9:27108646,24831188 +) +) +(70,9:27288047,24831188:558141,75748,0 +(70,9:27467448,24831188:199339,75748,0 +x70,9:27666787,24831188 +) +) +(70,9:27846188,24831188:558141,75748,0 +(70,9:28025589,24831188:199339,75748,0 +x70,9:28224928,24831188 +) +) +(70,9:28404329,24831188:558141,75748,0 +(70,9:28583730,24831188:199339,75748,0 +x70,9:28783069,24831188 +) +) +(70,9:29117476,24831188:1112314,462465,0 +k70,9:29870980,24831188:753504 +x70,9:30229790,24831188 +) +g70,9:28399855,24831188 +g70,9:30229790,24831188 +) +(70,10:6636830,25722478:23592960,498346,0 +g70,10:14602427,25722478 +h70,10:14602427,25722478:5023347,0,0 +h70,10:19625774,25722478:0,0,0 +g70,10:11660177,25722478 +x70,10:14474843,25722478 +(70,10:15008945,25722478:558141,75748,0 +$70,10:15008945,25722478 +(70,10:15188346,25722478:199339,75748,0 +x70,10:15387685,25722478 +) +$70,10:15567086,25722478 +) +(70,10:15567086,25722478:558141,75748,0 +(70,10:15746487,25722478:199339,75748,0 +x70,10:15945826,25722478 +) +) +(70,10:16125227,25722478:558141,75748,0 +(70,10:16304628,25722478:199339,75748,0 +x70,10:16503967,25722478 +) +) +(70,10:16683368,25722478:558141,75748,0 +(70,10:16862769,25722478:199339,75748,0 +x70,10:17062108,25722478 +) +) +(70,10:17241509,25722478:558141,75748,0 +(70,10:17420910,25722478:199339,75748,0 +x70,10:17620249,25722478 +) +) +(70,10:17799650,25722478:558141,75748,0 +(70,10:17979051,25722478:199339,75748,0 +x70,10:18178390,25722478 +) +) +(70,10:18357791,25722478:558141,75748,0 +(70,10:18537192,25722478:199339,75748,0 +x70,10:18736531,25722478 +) +) +(70,10:18915932,25722478:558141,75748,0 +(70,10:19095333,25722478:199339,75748,0 +x70,10:19294672,25722478 +) +) +(70,10:19474073,25722478:558141,75748,0 +(70,10:19653474,25722478:199339,75748,0 +x70,10:19852813,25722478 +) +) +(70,10:20032214,25722478:558141,75748,0 +(70,10:20211615,25722478:199339,75748,0 +x70,10:20410954,25722478 +) +) +(70,10:20590355,25722478:558141,75748,0 +(70,10:20769756,25722478:199339,75748,0 +x70,10:20969095,25722478 +) +) +(70,10:21148496,25722478:558141,75748,0 +(70,10:21327897,25722478:199339,75748,0 +x70,10:21527236,25722478 +) +) +(70,10:21706637,25722478:558141,75748,0 +(70,10:21886038,25722478:199339,75748,0 +x70,10:22085377,25722478 +) +) +(70,10:22264778,25722478:558141,75748,0 +(70,10:22444179,25722478:199339,75748,0 +x70,10:22643518,25722478 +) +) +(70,10:22822919,25722478:558141,75748,0 +(70,10:23002320,25722478:199339,75748,0 +x70,10:23201659,25722478 +) +) +(70,10:23381060,25722478:558141,75748,0 +(70,10:23560461,25722478:199339,75748,0 +x70,10:23759800,25722478 +) +) +(70,10:23939201,25722478:558141,75748,0 +(70,10:24118602,25722478:199339,75748,0 +x70,10:24317941,25722478 +) +) +(70,10:24497342,25722478:558141,75748,0 +(70,10:24676743,25722478:199339,75748,0 +x70,10:24876082,25722478 +) +) +(70,10:25055483,25722478:558141,75748,0 +(70,10:25234884,25722478:199339,75748,0 +x70,10:25434223,25722478 +) +) +(70,10:25613624,25722478:558141,75748,0 +(70,10:25793025,25722478:199339,75748,0 +x70,10:25992364,25722478 +) +) +(70,10:26171765,25722478:558141,75748,0 +(70,10:26351166,25722478:199339,75748,0 +x70,10:26550505,25722478 +) +) +(70,10:26729906,25722478:558141,75748,0 +(70,10:26909307,25722478:199339,75748,0 +x70,10:27108646,25722478 +) +) +(70,10:27288047,25722478:558141,75748,0 +(70,10:27467448,25722478:199339,75748,0 +x70,10:27666787,25722478 +) +) +(70,10:27846188,25722478:558141,75748,0 +(70,10:28025589,25722478:199339,75748,0 +x70,10:28224928,25722478 +) +) +(70,10:28404329,25722478:558141,75748,0 +(70,10:28583730,25722478:199339,75748,0 +x70,10:28783069,25722478 +) +) +(70,10:29117476,25722478:1112314,462465,0 +k70,10:29870980,25722478:753504 +x70,10:30229790,25722478 +) +g70,10:28399855,25722478 +g70,10:30229790,25722478 +) +(70,11:6636830,26613768:23592960,498346,0 +g70,11:11660176,26613768 +h70,11:11660176,26613768:2726961,0,0 +h70,11:14387137,26613768:0,0,0 +g70,11:9363791,26613768 +(70,11:9363791,26613768:2296385,462465,0 +x70,11:10838899,26613768 +k70,11:11660176,26613768:821277 +) +x70,11:14777838,26613768 +g70,11:15017044,26613768 +x70,11:16880864,26613768 +x70,11:17399145,26613768 +g70,11:17638351,26613768 +x70,11:19506157,26613768 +(70,11:20032214,26613768:558141,75748,0 +$70,11:20032214,26613768 +(70,11:20211615,26613768:199339,75748,0 +x70,11:20410954,26613768 +) +$70,11:20590355,26613768 +) +(70,11:20590355,26613768:558141,75748,0 +(70,11:20769756,26613768:199339,75748,0 +x70,11:20969095,26613768 +) +) +(70,11:21148496,26613768:558141,75748,0 +(70,11:21327897,26613768:199339,75748,0 +x70,11:21527236,26613768 +) +) +(70,11:21706637,26613768:558141,75748,0 +(70,11:21886038,26613768:199339,75748,0 +x70,11:22085377,26613768 +) +) +(70,11:22264778,26613768:558141,75748,0 +(70,11:22444179,26613768:199339,75748,0 +x70,11:22643518,26613768 +) +) +(70,11:22822919,26613768:558141,75748,0 +(70,11:23002320,26613768:199339,75748,0 +x70,11:23201659,26613768 +) +) +(70,11:23381060,26613768:558141,75748,0 +(70,11:23560461,26613768:199339,75748,0 +x70,11:23759800,26613768 +) +) +(70,11:23939201,26613768:558141,75748,0 +(70,11:24118602,26613768:199339,75748,0 +x70,11:24317941,26613768 +) +) +(70,11:24497342,26613768:558141,75748,0 +(70,11:24676743,26613768:199339,75748,0 +x70,11:24876082,26613768 +) +) +(70,11:25055483,26613768:558141,75748,0 +(70,11:25234884,26613768:199339,75748,0 +x70,11:25434223,26613768 +) +) +(70,11:25613624,26613768:558141,75748,0 +(70,11:25793025,26613768:199339,75748,0 +x70,11:25992364,26613768 +) +) +(70,11:26171765,26613768:558141,75748,0 +(70,11:26351166,26613768:199339,75748,0 +x70,11:26550505,26613768 +) +) +(70,11:26729906,26613768:558141,75748,0 +(70,11:26909307,26613768:199339,75748,0 +x70,11:27108646,26613768 +) +) +(70,11:27288047,26613768:558141,75748,0 +(70,11:27467448,26613768:199339,75748,0 +x70,11:27666787,26613768 +) +) +(70,11:27846188,26613768:558141,75748,0 +(70,11:28025589,26613768:199339,75748,0 +x70,11:28224928,26613768 +) +) +(70,11:28404329,26613768:558141,75748,0 +(70,11:28583730,26613768:199339,75748,0 +x70,11:28783069,26613768 +) +) +(70,11:29117476,26613768:1112314,462465,0 +k70,11:29870980,26613768:753504 +x70,11:30229790,26613768 +) +g70,11:28399855,26613768 +g70,11:30229790,26613768 +) +(70,12:6636830,27505058:23592960,498346,0 +g70,12:9363791,27505058 +h70,12:9363791,27505058:1076431,0,0 +h70,12:10440222,27505058:0,0,0 +g70,12:7713261,27505058 +(70,12:7713261,27505058:1650530,462465,0 +x70,12:8630220,27505058 +k70,12:9363791,27505058:733571 +) +x70,12:11430936,27505058 +g70,12:11670142,27505058 +x70,12:13288774,27505058 +(70,12:13334522,27505058:558141,75748,0 +$70,12:13334522,27505058 +(70,12:13513923,27505058:199339,75748,0 +x70,12:13713262,27505058 +) +$70,12:13892663,27505058 +) +(70,12:13892663,27505058:558141,75748,0 +(70,12:14072064,27505058:199339,75748,0 +x70,12:14271403,27505058 +) +) +(70,12:14450804,27505058:558141,75748,0 +(70,12:14630205,27505058:199339,75748,0 +x70,12:14829544,27505058 +) +) +(70,12:15008945,27505058:558141,75748,0 +(70,12:15188346,27505058:199339,75748,0 +x70,12:15387685,27505058 +) +) +(70,12:15567086,27505058:558141,75748,0 +(70,12:15746487,27505058:199339,75748,0 +x70,12:15945826,27505058 +) +) +(70,12:16125227,27505058:558141,75748,0 +(70,12:16304628,27505058:199339,75748,0 +x70,12:16503967,27505058 +) +) +(70,12:16683368,27505058:558141,75748,0 +(70,12:16862769,27505058:199339,75748,0 +x70,12:17062108,27505058 +) +) +(70,12:17241509,27505058:558141,75748,0 +(70,12:17420910,27505058:199339,75748,0 +x70,12:17620249,27505058 +) +) +(70,12:17799650,27505058:558141,75748,0 +(70,12:17979051,27505058:199339,75748,0 +x70,12:18178390,27505058 +) +) +(70,12:18357791,27505058:558141,75748,0 +(70,12:18537192,27505058:199339,75748,0 +x70,12:18736531,27505058 +) +) +(70,12:18915932,27505058:558141,75748,0 +(70,12:19095333,27505058:199339,75748,0 +x70,12:19294672,27505058 +) +) +(70,12:19474073,27505058:558141,75748,0 +(70,12:19653474,27505058:199339,75748,0 +x70,12:19852813,27505058 +) +) +(70,12:20032214,27505058:558141,75748,0 +(70,12:20211615,27505058:199339,75748,0 +x70,12:20410954,27505058 +) +) +(70,12:20590355,27505058:558141,75748,0 +(70,12:20769756,27505058:199339,75748,0 +x70,12:20969095,27505058 +) +) +(70,12:21148496,27505058:558141,75748,0 +(70,12:21327897,27505058:199339,75748,0 +x70,12:21527236,27505058 +) +) +(70,12:21706637,27505058:558141,75748,0 +(70,12:21886038,27505058:199339,75748,0 +x70,12:22085377,27505058 +) +) +(70,12:22264778,27505058:558141,75748,0 +(70,12:22444179,27505058:199339,75748,0 +x70,12:22643518,27505058 +) +) +(70,12:22822919,27505058:558141,75748,0 +(70,12:23002320,27505058:199339,75748,0 +x70,12:23201659,27505058 +) +) +(70,12:23381060,27505058:558141,75748,0 +(70,12:23560461,27505058:199339,75748,0 +x70,12:23759800,27505058 +) +) +(70,12:23939201,27505058:558141,75748,0 +(70,12:24118602,27505058:199339,75748,0 +x70,12:24317941,27505058 +) +) +(70,12:24497342,27505058:558141,75748,0 +(70,12:24676743,27505058:199339,75748,0 +x70,12:24876082,27505058 +) +) +(70,12:25055483,27505058:558141,75748,0 +(70,12:25234884,27505058:199339,75748,0 +x70,12:25434223,27505058 +) +) +(70,12:25613624,27505058:558141,75748,0 +(70,12:25793025,27505058:199339,75748,0 +x70,12:25992364,27505058 +) +) +(70,12:26171765,27505058:558141,75748,0 +(70,12:26351166,27505058:199339,75748,0 +x70,12:26550505,27505058 +) +) +(70,12:26729906,27505058:558141,75748,0 +(70,12:26909307,27505058:199339,75748,0 +x70,12:27108646,27505058 +) +) +(70,12:27288047,27505058:558141,75748,0 +(70,12:27467448,27505058:199339,75748,0 +x70,12:27666787,27505058 +) +) +(70,12:27846188,27505058:558141,75748,0 +(70,12:28025589,27505058:199339,75748,0 +x70,12:28224928,27505058 +) +) +(70,12:28404329,27505058:558141,75748,0 +(70,12:28583730,27505058:199339,75748,0 +x70,12:28783069,27505058 +) +) +(70,12:29117476,27505058:1112314,462465,0 +k70,12:29870980,27505058:753504 +x70,12:30229790,27505058 +) +g70,12:28399855,27505058 +g70,12:30229790,27505058 +) +(70,13:6636830,28396348:23592960,498346,0 +g70,13:11660176,28396348 +h70,13:11660176,28396348:2726961,0,0 +h70,13:14387137,28396348:0,0,0 +g70,13:9363791,28396348 +(70,13:9363791,28396348:2296385,462465,0 +x70,13:10838899,28396348 +k70,13:11660176,28396348:821277 +) +x70,13:13278808,28396348 +g70,13:13518014,28396348 +x70,13:15822373,28396348 +x70,13:16998474,28396348 +(70,13:17241509,28396348:558141,75748,0 +$70,13:17241509,28396348 +(70,13:17420910,28396348:199339,75748,0 +x70,13:17620249,28396348 +) +$70,13:17799650,28396348 +) +(70,13:17799650,28396348:558141,75748,0 +(70,13:17979051,28396348:199339,75748,0 +x70,13:18178390,28396348 +) +) +(70,13:18357791,28396348:558141,75748,0 +(70,13:18537192,28396348:199339,75748,0 +x70,13:18736531,28396348 +) +) +(70,13:18915932,28396348:558141,75748,0 +(70,13:19095333,28396348:199339,75748,0 +x70,13:19294672,28396348 +) +) +(70,13:19474073,28396348:558141,75748,0 +(70,13:19653474,28396348:199339,75748,0 +x70,13:19852813,28396348 +) +) +(70,13:20032214,28396348:558141,75748,0 +(70,13:20211615,28396348:199339,75748,0 +x70,13:20410954,28396348 +) +) +(70,13:20590355,28396348:558141,75748,0 +(70,13:20769756,28396348:199339,75748,0 +x70,13:20969095,28396348 +) +) +(70,13:21148496,28396348:558141,75748,0 +(70,13:21327897,28396348:199339,75748,0 +x70,13:21527236,28396348 +) +) +(70,13:21706637,28396348:558141,75748,0 +(70,13:21886038,28396348:199339,75748,0 +x70,13:22085377,28396348 +) +) +(70,13:22264778,28396348:558141,75748,0 +(70,13:22444179,28396348:199339,75748,0 +x70,13:22643518,28396348 +) +) +(70,13:22822919,28396348:558141,75748,0 +(70,13:23002320,28396348:199339,75748,0 +x70,13:23201659,28396348 +) +) +(70,13:23381060,28396348:558141,75748,0 +(70,13:23560461,28396348:199339,75748,0 +x70,13:23759800,28396348 +) +) +(70,13:23939201,28396348:558141,75748,0 +(70,13:24118602,28396348:199339,75748,0 +x70,13:24317941,28396348 +) +) +(70,13:24497342,28396348:558141,75748,0 +(70,13:24676743,28396348:199339,75748,0 +x70,13:24876082,28396348 +) +) +(70,13:25055483,28396348:558141,75748,0 +(70,13:25234884,28396348:199339,75748,0 +x70,13:25434223,28396348 +) +) +(70,13:25613624,28396348:558141,75748,0 +(70,13:25793025,28396348:199339,75748,0 +x70,13:25992364,28396348 +) +) +(70,13:26171765,28396348:558141,75748,0 +(70,13:26351166,28396348:199339,75748,0 +x70,13:26550505,28396348 +) +) +(70,13:26729906,28396348:558141,75748,0 +(70,13:26909307,28396348:199339,75748,0 +x70,13:27108646,28396348 +) +) +(70,13:27288047,28396348:558141,75748,0 +(70,13:27467448,28396348:199339,75748,0 +x70,13:27666787,28396348 +) +) +(70,13:27846188,28396348:558141,75748,0 +(70,13:28025589,28396348:199339,75748,0 +x70,13:28224928,28396348 +) +) +(70,13:28404329,28396348:558141,75748,0 +(70,13:28583730,28396348:199339,75748,0 +x70,13:28783069,28396348 +) +) +(70,13:29117476,28396348:1112314,462465,0 +k70,13:29870980,28396348:753504 +x70,13:30229790,28396348 +) +g70,13:28399855,28396348 +g70,13:30229790,28396348 +) +(70,14:6636830,29287638:23592960,498346,0 +g70,14:11660176,29287638 +h70,14:11660176,29287638:2726961,0,0 +h70,14:14387137,29287638:0,0,0 +g70,14:9363791,29287638 +(70,14:9363791,29287638:2296385,462465,0 +x70,14:10838899,29287638 +k70,14:11660176,29287638:821277 +) +x70,14:13278808,29287638 +g70,14:13518014,29287638 +x70,14:15710743,29287638 +x70,14:16886844,29287638 +(70,14:17241509,29287638:558141,75748,0 +$70,14:17241509,29287638 +(70,14:17420910,29287638:199339,75748,0 +x70,14:17620249,29287638 +) +$70,14:17799650,29287638 +) +(70,14:17799650,29287638:558141,75748,0 +(70,14:17979051,29287638:199339,75748,0 +x70,14:18178390,29287638 +) +) +(70,14:18357791,29287638:558141,75748,0 +(70,14:18537192,29287638:199339,75748,0 +x70,14:18736531,29287638 +) +) +(70,14:18915932,29287638:558141,75748,0 +(70,14:19095333,29287638:199339,75748,0 +x70,14:19294672,29287638 +) +) +(70,14:19474073,29287638:558141,75748,0 +(70,14:19653474,29287638:199339,75748,0 +x70,14:19852813,29287638 +) +) +(70,14:20032214,29287638:558141,75748,0 +(70,14:20211615,29287638:199339,75748,0 +x70,14:20410954,29287638 +) +) +(70,14:20590355,29287638:558141,75748,0 +(70,14:20769756,29287638:199339,75748,0 +x70,14:20969095,29287638 +) +) +(70,14:21148496,29287638:558141,75748,0 +(70,14:21327897,29287638:199339,75748,0 +x70,14:21527236,29287638 +) +) +(70,14:21706637,29287638:558141,75748,0 +(70,14:21886038,29287638:199339,75748,0 +x70,14:22085377,29287638 +) +) +(70,14:22264778,29287638:558141,75748,0 +(70,14:22444179,29287638:199339,75748,0 +x70,14:22643518,29287638 +) +) +(70,14:22822919,29287638:558141,75748,0 +(70,14:23002320,29287638:199339,75748,0 +x70,14:23201659,29287638 +) +) +(70,14:23381060,29287638:558141,75748,0 +(70,14:23560461,29287638:199339,75748,0 +x70,14:23759800,29287638 +) +) +(70,14:23939201,29287638:558141,75748,0 +(70,14:24118602,29287638:199339,75748,0 +x70,14:24317941,29287638 +) +) +(70,14:24497342,29287638:558141,75748,0 +(70,14:24676743,29287638:199339,75748,0 +x70,14:24876082,29287638 +) +) +(70,14:25055483,29287638:558141,75748,0 +(70,14:25234884,29287638:199339,75748,0 +x70,14:25434223,29287638 +) +) +(70,14:25613624,29287638:558141,75748,0 +(70,14:25793025,29287638:199339,75748,0 +x70,14:25992364,29287638 +) +) +(70,14:26171765,29287638:558141,75748,0 +(70,14:26351166,29287638:199339,75748,0 +x70,14:26550505,29287638 +) +) +(70,14:26729906,29287638:558141,75748,0 +(70,14:26909307,29287638:199339,75748,0 +x70,14:27108646,29287638 +) +) +(70,14:27288047,29287638:558141,75748,0 +(70,14:27467448,29287638:199339,75748,0 +x70,14:27666787,29287638 +) +) +(70,14:27846188,29287638:558141,75748,0 +(70,14:28025589,29287638:199339,75748,0 +x70,14:28224928,29287638 +) +) +(70,14:28404329,29287638:558141,75748,0 +(70,14:28583730,29287638:199339,75748,0 +x70,14:28783069,29287638 +) +) +(70,14:29117476,29287638:1112314,462465,0 +k70,14:29870980,29287638:753504 +x70,14:30229790,29287638 +) +g70,14:28399855,29287638 +g70,14:30229790,29287638 +) +(70,15:6636830,30178928:23592960,498346,0 +g70,15:11660176,30178928 +h70,15:11660176,30178928:2726961,0,0 +h70,15:14387137,30178928:0,0,0 +g70,15:9363791,30178928 +(70,15:9363791,30178928:2296385,462465,0 +x70,15:10838899,30178928 +k70,15:11660176,30178928:821277 +) +x70,15:13278808,30178928 +g70,15:13518014,30178928 +x70,15:15381834,30178928 +x70,15:15900115,30178928 +g70,15:16139321,30178928 +x70,15:18007127,30178928 +(70,15:18357791,30178928:558141,75748,0 +$70,15:18357791,30178928 +(70,15:18537192,30178928:199339,75748,0 +x70,15:18736531,30178928 +) +$70,15:18915932,30178928 +) +(70,15:18915932,30178928:558141,75748,0 +(70,15:19095333,30178928:199339,75748,0 +x70,15:19294672,30178928 +) +) +(70,15:19474073,30178928:558141,75748,0 +(70,15:19653474,30178928:199339,75748,0 +x70,15:19852813,30178928 +) +) +(70,15:20032214,30178928:558141,75748,0 +(70,15:20211615,30178928:199339,75748,0 +x70,15:20410954,30178928 +) +) +(70,15:20590355,30178928:558141,75748,0 +(70,15:20769756,30178928:199339,75748,0 +x70,15:20969095,30178928 +) +) +(70,15:21148496,30178928:558141,75748,0 +(70,15:21327897,30178928:199339,75748,0 +x70,15:21527236,30178928 +) +) +(70,15:21706637,30178928:558141,75748,0 +(70,15:21886038,30178928:199339,75748,0 +x70,15:22085377,30178928 +) +) +(70,15:22264778,30178928:558141,75748,0 +(70,15:22444179,30178928:199339,75748,0 +x70,15:22643518,30178928 +) +) +(70,15:22822919,30178928:558141,75748,0 +(70,15:23002320,30178928:199339,75748,0 +x70,15:23201659,30178928 +) +) +(70,15:23381060,30178928:558141,75748,0 +(70,15:23560461,30178928:199339,75748,0 +x70,15:23759800,30178928 +) +) +(70,15:23939201,30178928:558141,75748,0 +(70,15:24118602,30178928:199339,75748,0 +x70,15:24317941,30178928 +) +) +(70,15:24497342,30178928:558141,75748,0 +(70,15:24676743,30178928:199339,75748,0 +x70,15:24876082,30178928 +) +) +(70,15:25055483,30178928:558141,75748,0 +(70,15:25234884,30178928:199339,75748,0 +x70,15:25434223,30178928 +) +) +(70,15:25613624,30178928:558141,75748,0 +(70,15:25793025,30178928:199339,75748,0 +x70,15:25992364,30178928 +) +) +(70,15:26171765,30178928:558141,75748,0 +(70,15:26351166,30178928:199339,75748,0 +x70,15:26550505,30178928 +) +) +(70,15:26729906,30178928:558141,75748,0 +(70,15:26909307,30178928:199339,75748,0 +x70,15:27108646,30178928 +) +) +(70,15:27288047,30178928:558141,75748,0 +(70,15:27467448,30178928:199339,75748,0 +x70,15:27666787,30178928 +) +) +(70,15:27846188,30178928:558141,75748,0 +(70,15:28025589,30178928:199339,75748,0 +x70,15:28224928,30178928 +) +) +(70,15:28404329,30178928:558141,75748,0 +(70,15:28583730,30178928:199339,75748,0 +x70,15:28783069,30178928 +) +) +(70,15:29117476,30178928:1112314,462465,0 +k70,15:29870980,30178928:753504 +x70,15:30229790,30178928 +) +g70,15:28399855,30178928 +g70,15:30229790,30178928 +) +(70,16:6636830,31070218:23592960,498346,0 +g70,16:9363791,31070218 +h70,16:9363791,31070218:1076431,0,0 +h70,16:10440222,31070218:0,0,0 +g70,16:7713261,31070218 +(70,16:7713261,31070218:1650530,462465,0 +x70,16:8630220,31070218 +k70,16:9363791,31070218:733571 +) +x70,16:11430936,31070218 +g70,16:11670142,31070218 +x70,16:14594444,31070218 +(70,16:15008945,31070218:558141,75748,0 +$70,16:15008945,31070218 +(70,16:15188346,31070218:199339,75748,0 +x70,16:15387685,31070218 +) +$70,16:15567086,31070218 +) +(70,16:15567086,31070218:558141,75748,0 +(70,16:15746487,31070218:199339,75748,0 +x70,16:15945826,31070218 +) +) +(70,16:16125227,31070218:558141,75748,0 +(70,16:16304628,31070218:199339,75748,0 +x70,16:16503967,31070218 +) +) +(70,16:16683368,31070218:558141,75748,0 +(70,16:16862769,31070218:199339,75748,0 +x70,16:17062108,31070218 +) +) +(70,16:17241509,31070218:558141,75748,0 +(70,16:17420910,31070218:199339,75748,0 +x70,16:17620249,31070218 +) +) +(70,16:17799650,31070218:558141,75748,0 +(70,16:17979051,31070218:199339,75748,0 +x70,16:18178390,31070218 +) +) +(70,16:18357791,31070218:558141,75748,0 +(70,16:18537192,31070218:199339,75748,0 +x70,16:18736531,31070218 +) +) +(70,16:18915932,31070218:558141,75748,0 +(70,16:19095333,31070218:199339,75748,0 +x70,16:19294672,31070218 +) +) +(70,16:19474073,31070218:558141,75748,0 +(70,16:19653474,31070218:199339,75748,0 +x70,16:19852813,31070218 +) +) +(70,16:20032214,31070218:558141,75748,0 +(70,16:20211615,31070218:199339,75748,0 +x70,16:20410954,31070218 +) +) +(70,16:20590355,31070218:558141,75748,0 +(70,16:20769756,31070218:199339,75748,0 +x70,16:20969095,31070218 +) +) +(70,16:21148496,31070218:558141,75748,0 +(70,16:21327897,31070218:199339,75748,0 +x70,16:21527236,31070218 +) +) +(70,16:21706637,31070218:558141,75748,0 +(70,16:21886038,31070218:199339,75748,0 +x70,16:22085377,31070218 +) +) +(70,16:22264778,31070218:558141,75748,0 +(70,16:22444179,31070218:199339,75748,0 +x70,16:22643518,31070218 +) +) +(70,16:22822919,31070218:558141,75748,0 +(70,16:23002320,31070218:199339,75748,0 +x70,16:23201659,31070218 +) +) +(70,16:23381060,31070218:558141,75748,0 +(70,16:23560461,31070218:199339,75748,0 +x70,16:23759800,31070218 +) +) +(70,16:23939201,31070218:558141,75748,0 +(70,16:24118602,31070218:199339,75748,0 +x70,16:24317941,31070218 +) +) +(70,16:24497342,31070218:558141,75748,0 +(70,16:24676743,31070218:199339,75748,0 +x70,16:24876082,31070218 +) +) +(70,16:25055483,31070218:558141,75748,0 +(70,16:25234884,31070218:199339,75748,0 +x70,16:25434223,31070218 +) +) +(70,16:25613624,31070218:558141,75748,0 +(70,16:25793025,31070218:199339,75748,0 +x70,16:25992364,31070218 +) +) +(70,16:26171765,31070218:558141,75748,0 +(70,16:26351166,31070218:199339,75748,0 +x70,16:26550505,31070218 +) +) +(70,16:26729906,31070218:558141,75748,0 +(70,16:26909307,31070218:199339,75748,0 +x70,16:27108646,31070218 +) +) +(70,16:27288047,31070218:558141,75748,0 +(70,16:27467448,31070218:199339,75748,0 +x70,16:27666787,31070218 +) +) +(70,16:27846188,31070218:558141,75748,0 +(70,16:28025589,31070218:199339,75748,0 +x70,16:28224928,31070218 +) +) +(70,16:28404329,31070218:558141,75748,0 +(70,16:28583730,31070218:199339,75748,0 +x70,16:28783069,31070218 +) +) +(70,16:29117476,31070218:1112314,462465,0 +k70,16:29870980,31070218:753504 +x70,16:30229790,31070218 +) +g70,16:28399855,31070218 +g70,16:30229790,31070218 +) +(70,17:6636830,31961508:23592960,498346,0 +g70,17:9363791,31961508 +h70,17:9363791,31961508:1076431,0,0 +h70,17:10440222,31961508:0,0,0 +g70,17:7713261,31961508 +(70,17:7713261,31961508:1650530,462465,0 +x70,17:8630220,31961508 +k70,17:9363791,31961508:733571 +) +x70,17:11430936,31961508 +g70,17:11670142,31961508 +x70,17:13936626,31961508 +(70,17:14450804,31961508:558141,75748,0 +$70,17:14450804,31961508 +(70,17:14630205,31961508:199339,75748,0 +x70,17:14829544,31961508 +) +$70,17:15008945,31961508 +) +(70,17:15008945,31961508:558141,75748,0 +(70,17:15188346,31961508:199339,75748,0 +x70,17:15387685,31961508 +) +) +(70,17:15567086,31961508:558141,75748,0 +(70,17:15746487,31961508:199339,75748,0 +x70,17:15945826,31961508 +) +) +(70,17:16125227,31961508:558141,75748,0 +(70,17:16304628,31961508:199339,75748,0 +x70,17:16503967,31961508 +) +) +(70,17:16683368,31961508:558141,75748,0 +(70,17:16862769,31961508:199339,75748,0 +x70,17:17062108,31961508 +) +) +(70,17:17241509,31961508:558141,75748,0 +(70,17:17420910,31961508:199339,75748,0 +x70,17:17620249,31961508 +) +) +(70,17:17799650,31961508:558141,75748,0 +(70,17:17979051,31961508:199339,75748,0 +x70,17:18178390,31961508 +) +) +(70,17:18357791,31961508:558141,75748,0 +(70,17:18537192,31961508:199339,75748,0 +x70,17:18736531,31961508 +) +) +(70,17:18915932,31961508:558141,75748,0 +(70,17:19095333,31961508:199339,75748,0 +x70,17:19294672,31961508 +) +) +(70,17:19474073,31961508:558141,75748,0 +(70,17:19653474,31961508:199339,75748,0 +x70,17:19852813,31961508 +) +) +(70,17:20032214,31961508:558141,75748,0 +(70,17:20211615,31961508:199339,75748,0 +x70,17:20410954,31961508 +) +) +(70,17:20590355,31961508:558141,75748,0 +(70,17:20769756,31961508:199339,75748,0 +x70,17:20969095,31961508 +) +) +(70,17:21148496,31961508:558141,75748,0 +(70,17:21327897,31961508:199339,75748,0 +x70,17:21527236,31961508 +) +) +(70,17:21706637,31961508:558141,75748,0 +(70,17:21886038,31961508:199339,75748,0 +x70,17:22085377,31961508 +) +) +(70,17:22264778,31961508:558141,75748,0 +(70,17:22444179,31961508:199339,75748,0 +x70,17:22643518,31961508 +) +) +(70,17:22822919,31961508:558141,75748,0 +(70,17:23002320,31961508:199339,75748,0 +x70,17:23201659,31961508 +) +) +(70,17:23381060,31961508:558141,75748,0 +(70,17:23560461,31961508:199339,75748,0 +x70,17:23759800,31961508 +) +) +(70,17:23939201,31961508:558141,75748,0 +(70,17:24118602,31961508:199339,75748,0 +x70,17:24317941,31961508 +) +) +(70,17:24497342,31961508:558141,75748,0 +(70,17:24676743,31961508:199339,75748,0 +x70,17:24876082,31961508 +) +) +(70,17:25055483,31961508:558141,75748,0 +(70,17:25234884,31961508:199339,75748,0 +x70,17:25434223,31961508 +) +) +(70,17:25613624,31961508:558141,75748,0 +(70,17:25793025,31961508:199339,75748,0 +x70,17:25992364,31961508 +) +) +(70,17:26171765,31961508:558141,75748,0 +(70,17:26351166,31961508:199339,75748,0 +x70,17:26550505,31961508 +) +) +(70,17:26729906,31961508:558141,75748,0 +(70,17:26909307,31961508:199339,75748,0 +x70,17:27108646,31961508 +) +) +(70,17:27288047,31961508:558141,75748,0 +(70,17:27467448,31961508:199339,75748,0 +x70,17:27666787,31961508 +) +) +(70,17:27846188,31961508:558141,75748,0 +(70,17:28025589,31961508:199339,75748,0 +x70,17:28224928,31961508 +) +) +(70,17:28404329,31961508:558141,75748,0 +(70,17:28583730,31961508:199339,75748,0 +x70,17:28783069,31961508 +) +) +(70,17:29117476,31961508:1112314,462465,0 +k70,17:29870980,31961508:753504 +x70,17:30229790,31961508 +) +g70,17:28399855,31961508 +g70,17:30229790,31961508 +) +(70,18:6636830,32852798:23592960,498346,0 +g70,18:11660176,32852798 +h70,18:11660176,32852798:2726961,0,0 +h70,18:14387137,32852798:0,0,0 +g70,18:9363791,32852798 +(70,18:9363791,32852798:2296385,462465,0 +x70,18:10838899,32852798 +k70,18:11660176,32852798:821277 +) +x70,18:14319359,32852798 +(70,18:14450804,32852798:558141,75748,0 +$70,18:14450804,32852798 +(70,18:14630205,32852798:199339,75748,0 +x70,18:14829544,32852798 +) +$70,18:15008945,32852798 +) +(70,18:15008945,32852798:558141,75748,0 +(70,18:15188346,32852798:199339,75748,0 +x70,18:15387685,32852798 +) +) +(70,18:15567086,32852798:558141,75748,0 +(70,18:15746487,32852798:199339,75748,0 +x70,18:15945826,32852798 +) +) +(70,18:16125227,32852798:558141,75748,0 +(70,18:16304628,32852798:199339,75748,0 +x70,18:16503967,32852798 +) +) +(70,18:16683368,32852798:558141,75748,0 +(70,18:16862769,32852798:199339,75748,0 +x70,18:17062108,32852798 +) +) +(70,18:17241509,32852798:558141,75748,0 +(70,18:17420910,32852798:199339,75748,0 +x70,18:17620249,32852798 +) +) +(70,18:17799650,32852798:558141,75748,0 +(70,18:17979051,32852798:199339,75748,0 +x70,18:18178390,32852798 +) +) +(70,18:18357791,32852798:558141,75748,0 +(70,18:18537192,32852798:199339,75748,0 +x70,18:18736531,32852798 +) +) +(70,18:18915932,32852798:558141,75748,0 +(70,18:19095333,32852798:199339,75748,0 +x70,18:19294672,32852798 +) +) +(70,18:19474073,32852798:558141,75748,0 +(70,18:19653474,32852798:199339,75748,0 +x70,18:19852813,32852798 +) +) +(70,18:20032214,32852798:558141,75748,0 +(70,18:20211615,32852798:199339,75748,0 +x70,18:20410954,32852798 +) +) +(70,18:20590355,32852798:558141,75748,0 +(70,18:20769756,32852798:199339,75748,0 +x70,18:20969095,32852798 +) +) +(70,18:21148496,32852798:558141,75748,0 +(70,18:21327897,32852798:199339,75748,0 +x70,18:21527236,32852798 +) +) +(70,18:21706637,32852798:558141,75748,0 +(70,18:21886038,32852798:199339,75748,0 +x70,18:22085377,32852798 +) +) +(70,18:22264778,32852798:558141,75748,0 +(70,18:22444179,32852798:199339,75748,0 +x70,18:22643518,32852798 +) +) +(70,18:22822919,32852798:558141,75748,0 +(70,18:23002320,32852798:199339,75748,0 +x70,18:23201659,32852798 +) +) +(70,18:23381060,32852798:558141,75748,0 +(70,18:23560461,32852798:199339,75748,0 +x70,18:23759800,32852798 +) +) +(70,18:23939201,32852798:558141,75748,0 +(70,18:24118602,32852798:199339,75748,0 +x70,18:24317941,32852798 +) +) +(70,18:24497342,32852798:558141,75748,0 +(70,18:24676743,32852798:199339,75748,0 +x70,18:24876082,32852798 +) +) +(70,18:25055483,32852798:558141,75748,0 +(70,18:25234884,32852798:199339,75748,0 +x70,18:25434223,32852798 +) +) +(70,18:25613624,32852798:558141,75748,0 +(70,18:25793025,32852798:199339,75748,0 +x70,18:25992364,32852798 +) +) +(70,18:26171765,32852798:558141,75748,0 +(70,18:26351166,32852798:199339,75748,0 +x70,18:26550505,32852798 +) +) +(70,18:26729906,32852798:558141,75748,0 +(70,18:26909307,32852798:199339,75748,0 +x70,18:27108646,32852798 +) +) +(70,18:27288047,32852798:558141,75748,0 +(70,18:27467448,32852798:199339,75748,0 +x70,18:27666787,32852798 +) +) +(70,18:27846188,32852798:558141,75748,0 +(70,18:28025589,32852798:199339,75748,0 +x70,18:28224928,32852798 +) +) +(70,18:28404329,32852798:558141,75748,0 +(70,18:28583730,32852798:199339,75748,0 +x70,18:28783069,32852798 +) +) +(70,18:29117476,32852798:1112314,462465,0 +k70,18:29870980,32852798:753504 +x70,18:30229790,32852798 +) +g70,18:28399855,32852798 +g70,18:30229790,32852798 +) +(70,19:6636830,33744088:23592960,498346,139537 +g70,19:14602427,33744088 +h70,19:14602427,33744088:5023347,0,0 +h70,19:19625774,33744088:0,0,0 +g70,19:11660177,33744088 +x70,19:14042277,33744088 +g70,19:14281483,33744088 +x70,19:14769863,33744088 +x70,19:18286201,33744088 +g70,19:18525407,33744088 +x70,19:20648367,33744088 +(70,19:21148496,33744088:558141,75748,0 +$70,19:21148496,33744088 +(70,19:21327897,33744088:199339,75748,0 +x70,19:21527236,33744088 +) +$70,19:21706637,33744088 +) +(70,19:21706637,33744088:558141,75748,0 +(70,19:21886038,33744088:199339,75748,0 +x70,19:22085377,33744088 +) +) +(70,19:22264778,33744088:558141,75748,0 +(70,19:22444179,33744088:199339,75748,0 +x70,19:22643518,33744088 +) +) +(70,19:22822919,33744088:558141,75748,0 +(70,19:23002320,33744088:199339,75748,0 +x70,19:23201659,33744088 +) +) +(70,19:23381060,33744088:558141,75748,0 +(70,19:23560461,33744088:199339,75748,0 +x70,19:23759800,33744088 +) +) +(70,19:23939201,33744088:558141,75748,0 +(70,19:24118602,33744088:199339,75748,0 +x70,19:24317941,33744088 +) +) +(70,19:24497342,33744088:558141,75748,0 +(70,19:24676743,33744088:199339,75748,0 +x70,19:24876082,33744088 +) +) +(70,19:25055483,33744088:558141,75748,0 +(70,19:25234884,33744088:199339,75748,0 +x70,19:25434223,33744088 +) +) +(70,19:25613624,33744088:558141,75748,0 +(70,19:25793025,33744088:199339,75748,0 +x70,19:25992364,33744088 +) +) +(70,19:26171765,33744088:558141,75748,0 +(70,19:26351166,33744088:199339,75748,0 +x70,19:26550505,33744088 +) +) +(70,19:26729906,33744088:558141,75748,0 +(70,19:26909307,33744088:199339,75748,0 +x70,19:27108646,33744088 +) +) +(70,19:27288047,33744088:558141,75748,0 +(70,19:27467448,33744088:199339,75748,0 +x70,19:27666787,33744088 +) +) +(70,19:27846188,33744088:558141,75748,0 +(70,19:28025589,33744088:199339,75748,0 +x70,19:28224928,33744088 +) +) +(70,19:28404329,33744088:558141,75748,0 +(70,19:28583730,33744088:199339,75748,0 +x70,19:28783069,33744088 +) +) +(70,19:29117476,33744088:1112314,462465,0 +k70,19:29870980,33744088:753504 +x70,19:30229790,33744088 +) +g70,19:28399855,33744088 +g70,19:30229790,33744088 +) +(70,20:6636830,34635378:23592960,498346,139537 +g70,20:14602427,34635378 +h70,20:14602427,34635378:5023347,0,0 +h70,20:19625774,34635378:0,0,0 +g70,20:11660177,34635378 +x70,20:14042277,34635378 +g70,20:14281483,34635378 +x70,20:14769863,34635378 +x70,20:18286201,34635378 +g70,20:18525407,34635378 +x70,20:20758003,34635378 +(70,20:21148496,34635378:558141,75748,0 +$70,20:21148496,34635378 +(70,20:21327897,34635378:199339,75748,0 +x70,20:21527236,34635378 +) +$70,20:21706637,34635378 +) +(70,20:21706637,34635378:558141,75748,0 +(70,20:21886038,34635378:199339,75748,0 +x70,20:22085377,34635378 +) +) +(70,20:22264778,34635378:558141,75748,0 +(70,20:22444179,34635378:199339,75748,0 +x70,20:22643518,34635378 +) +) +(70,20:22822919,34635378:558141,75748,0 +(70,20:23002320,34635378:199339,75748,0 +x70,20:23201659,34635378 +) +) +(70,20:23381060,34635378:558141,75748,0 +(70,20:23560461,34635378:199339,75748,0 +x70,20:23759800,34635378 +) +) +(70,20:23939201,34635378:558141,75748,0 +(70,20:24118602,34635378:199339,75748,0 +x70,20:24317941,34635378 +) +) +(70,20:24497342,34635378:558141,75748,0 +(70,20:24676743,34635378:199339,75748,0 +x70,20:24876082,34635378 +) +) +(70,20:25055483,34635378:558141,75748,0 +(70,20:25234884,34635378:199339,75748,0 +x70,20:25434223,34635378 +) +) +(70,20:25613624,34635378:558141,75748,0 +(70,20:25793025,34635378:199339,75748,0 +x70,20:25992364,34635378 +) +) +(70,20:26171765,34635378:558141,75748,0 +(70,20:26351166,34635378:199339,75748,0 +x70,20:26550505,34635378 +) +) +(70,20:26729906,34635378:558141,75748,0 +(70,20:26909307,34635378:199339,75748,0 +x70,20:27108646,34635378 +) +) +(70,20:27288047,34635378:558141,75748,0 +(70,20:27467448,34635378:199339,75748,0 +x70,20:27666787,34635378 +) +) +(70,20:27846188,34635378:558141,75748,0 +(70,20:28025589,34635378:199339,75748,0 +x70,20:28224928,34635378 +) +) +(70,20:28404329,34635378:558141,75748,0 +(70,20:28583730,34635378:199339,75748,0 +x70,20:28783069,34635378 +) +) +(70,20:29117476,34635378:1112314,462465,0 +k70,20:29870980,34635378:753504 +x70,20:30229790,34635378 +) +g70,20:28399855,34635378 +g70,20:30229790,34635378 +) +(70,21:6636830,35526668:23592960,498346,139537 +g70,21:14602427,35526668 +h70,21:14602427,35526668:5023347,0,0 +h70,21:19625774,35526668:0,0,0 +g70,21:11660177,35526668 +x70,21:14042277,35526668 +g70,21:14281483,35526668 +x70,21:14769863,35526668 +x70,21:18286201,35526668 +g70,21:18525407,35526668 +x70,21:20120120,35526668 +(70,21:20590355,35526668:558141,75748,0 +$70,21:20590355,35526668 +(70,21:20769756,35526668:199339,75748,0 +x70,21:20969095,35526668 +) +$70,21:21148496,35526668 +) +(70,21:21148496,35526668:558141,75748,0 +(70,21:21327897,35526668:199339,75748,0 +x70,21:21527236,35526668 +) +) +(70,21:21706637,35526668:558141,75748,0 +(70,21:21886038,35526668:199339,75748,0 +x70,21:22085377,35526668 +) +) +(70,21:22264778,35526668:558141,75748,0 +(70,21:22444179,35526668:199339,75748,0 +x70,21:22643518,35526668 +) +) +(70,21:22822919,35526668:558141,75748,0 +(70,21:23002320,35526668:199339,75748,0 +x70,21:23201659,35526668 +) +) +(70,21:23381060,35526668:558141,75748,0 +(70,21:23560461,35526668:199339,75748,0 +x70,21:23759800,35526668 +) +) +(70,21:23939201,35526668:558141,75748,0 +(70,21:24118602,35526668:199339,75748,0 +x70,21:24317941,35526668 +) +) +(70,21:24497342,35526668:558141,75748,0 +(70,21:24676743,35526668:199339,75748,0 +x70,21:24876082,35526668 +) +) +(70,21:25055483,35526668:558141,75748,0 +(70,21:25234884,35526668:199339,75748,0 +x70,21:25434223,35526668 +) +) +(70,21:25613624,35526668:558141,75748,0 +(70,21:25793025,35526668:199339,75748,0 +x70,21:25992364,35526668 +) +) +(70,21:26171765,35526668:558141,75748,0 +(70,21:26351166,35526668:199339,75748,0 +x70,21:26550505,35526668 +) +) +(70,21:26729906,35526668:558141,75748,0 +(70,21:26909307,35526668:199339,75748,0 +x70,21:27108646,35526668 +) +) +(70,21:27288047,35526668:558141,75748,0 +(70,21:27467448,35526668:199339,75748,0 +x70,21:27666787,35526668 +) +) +(70,21:27846188,35526668:558141,75748,0 +(70,21:28025589,35526668:199339,75748,0 +x70,21:28224928,35526668 +) +) +(70,21:28404329,35526668:558141,75748,0 +(70,21:28583730,35526668:199339,75748,0 +x70,21:28783069,35526668 +) +) +(70,21:29117476,35526668:1112314,462465,0 +k70,21:29870980,35526668:753504 +x70,21:30229790,35526668 +) +g70,21:28399855,35526668 +g70,21:30229790,35526668 +) +(70,22:6636830,36417958:23592960,498346,0 +g70,22:11660176,36417958 +h70,22:11660176,36417958:2726961,0,0 +h70,22:14387137,36417958:0,0,0 +g70,22:9363791,36417958 +(70,22:9363791,36417958:2296385,462465,0 +x70,22:10838899,36417958 +k70,22:11660176,36417958:821277 +) +x70,22:14165867,36417958 +(70,22:14450804,36417958:558141,75748,0 +$70,22:14450804,36417958 +(70,22:14630205,36417958:199339,75748,0 +x70,22:14829544,36417958 +) +$70,22:15008945,36417958 +) +(70,22:15008945,36417958:558141,75748,0 +(70,22:15188346,36417958:199339,75748,0 +x70,22:15387685,36417958 +) +) +(70,22:15567086,36417958:558141,75748,0 +(70,22:15746487,36417958:199339,75748,0 +x70,22:15945826,36417958 +) +) +(70,22:16125227,36417958:558141,75748,0 +(70,22:16304628,36417958:199339,75748,0 +x70,22:16503967,36417958 +) +) +(70,22:16683368,36417958:558141,75748,0 +(70,22:16862769,36417958:199339,75748,0 +x70,22:17062108,36417958 +) +) +(70,22:17241509,36417958:558141,75748,0 +(70,22:17420910,36417958:199339,75748,0 +x70,22:17620249,36417958 +) +) +(70,22:17799650,36417958:558141,75748,0 +(70,22:17979051,36417958:199339,75748,0 +x70,22:18178390,36417958 +) +) +(70,22:18357791,36417958:558141,75748,0 +(70,22:18537192,36417958:199339,75748,0 +x70,22:18736531,36417958 +) +) +(70,22:18915932,36417958:558141,75748,0 +(70,22:19095333,36417958:199339,75748,0 +x70,22:19294672,36417958 +) +) +(70,22:19474073,36417958:558141,75748,0 +(70,22:19653474,36417958:199339,75748,0 +x70,22:19852813,36417958 +) +) +(70,22:20032214,36417958:558141,75748,0 +(70,22:20211615,36417958:199339,75748,0 +x70,22:20410954,36417958 +) +) +(70,22:20590355,36417958:558141,75748,0 +(70,22:20769756,36417958:199339,75748,0 +x70,22:20969095,36417958 +) +) +(70,22:21148496,36417958:558141,75748,0 +(70,22:21327897,36417958:199339,75748,0 +x70,22:21527236,36417958 +) +) +(70,22:21706637,36417958:558141,75748,0 +(70,22:21886038,36417958:199339,75748,0 +x70,22:22085377,36417958 +) +) +(70,22:22264778,36417958:558141,75748,0 +(70,22:22444179,36417958:199339,75748,0 +x70,22:22643518,36417958 +) +) +(70,22:22822919,36417958:558141,75748,0 +(70,22:23002320,36417958:199339,75748,0 +x70,22:23201659,36417958 +) +) +(70,22:23381060,36417958:558141,75748,0 +(70,22:23560461,36417958:199339,75748,0 +x70,22:23759800,36417958 +) +) +(70,22:23939201,36417958:558141,75748,0 +(70,22:24118602,36417958:199339,75748,0 +x70,22:24317941,36417958 +) +) +(70,22:24497342,36417958:558141,75748,0 +(70,22:24676743,36417958:199339,75748,0 +x70,22:24876082,36417958 +) +) +(70,22:25055483,36417958:558141,75748,0 +(70,22:25234884,36417958:199339,75748,0 +x70,22:25434223,36417958 +) +) +(70,22:25613624,36417958:558141,75748,0 +(70,22:25793025,36417958:199339,75748,0 +x70,22:25992364,36417958 +) +) +(70,22:26171765,36417958:558141,75748,0 +(70,22:26351166,36417958:199339,75748,0 +x70,22:26550505,36417958 +) +) +(70,22:26729906,36417958:558141,75748,0 +(70,22:26909307,36417958:199339,75748,0 +x70,22:27108646,36417958 +) +) +(70,22:27288047,36417958:558141,75748,0 +(70,22:27467448,36417958:199339,75748,0 +x70,22:27666787,36417958 +) +) +(70,22:27846188,36417958:558141,75748,0 +(70,22:28025589,36417958:199339,75748,0 +x70,22:28224928,36417958 +) +) +(70,22:28404329,36417958:558141,75748,0 +(70,22:28583730,36417958:199339,75748,0 +x70,22:28783069,36417958 +) +) +(70,22:29117476,36417958:1112314,462465,0 +k70,22:29870980,36417958:753504 +x70,22:30229790,36417958 +) +g70,22:28399855,36417958 +g70,22:30229790,36417958 +) +] +(1,26:6636830,45679049:23592960,479268,0 +(1,26:6636830,45679049:23592960,479268,0 +k1,26:18134302,45679049:11497472 +x1,26:18732319,45679049 +k1,26:30229790,45679049:11497471 +) +) +] +] +!56917 +}3 +!10 +{4 +[1,26:4736286,45679049:28835840,40942763,0 +[1,26:9979166,45679049:23592960,39369899,0 +[1,26:9979166,7095582:23592960,786432,0 +(1,26:9979166,7095582:23592960,490372,0 +(1,26:9979166,7095582:23592960,490372,0 +x1,26:10557250,7095582 +k1,26:29356112,7095582:18798862 +x1,26:29904294,7095582 +x1,26:31409302,7095582 +x1,26:32415962,7095582 +g1,26:32655168,7095582 +x1,26:33572126,7095582 +) +) +] +[1,26:9979166,43879237:0,35481206,0 +h1,26:9979166,9118927:0,0,0 +] +(1,26:9979166,45679049:23592960,0,0 +h1,26:9979166,45679049:23592960,0,0 +) +] +] +!533 +}4 +!8 +{5 +[1,53:4736286,45679049:25760436,40942763,0 +[1,53:6636830,45679049:23859892,39369899,0 +[1,53:6636830,7095582:23592960,786432,0 +(1,53:6636830,7095582:23592960,0,0 +h1,53:6636830,7095582:23592960,0,0 +) +] +[1,53:6636830,43879237:23859892,35481206,0 +(1,27:6636830,14116311:23592960,943899,0 +h1,27:6636830,14116311:0,0,0 +x1,27:9316721,14116311 +g1,27:9826427,14116311 +x1,27:10590986,14116311 +k1,27:20410388,14116311:9819402 +k1,27:30229790,14116311:9819402 +) +(1,27:6636830,17475296:23592960,1132315,317047 +h1,27:6636830,17475296:0,0,0 +x1,27:11934942,17475296 +g1,27:12546393,17475296 +x1,27:15421534,17475296 +x1,27:16338709,17475296 +x1,27:17179453,17475296 +x1,27:18453308,17475296 +x1,27:19294052,17475296 +g1,27:19905503,17475296 +x1,27:24001660,17475296 +x1,27:25988875,17475296 +k1,27:28109333,17475296:2120458 +k1,27:30229790,17475296:2120457 +) +(1,29:6636830,21358568:23592960,825750,353898 +g1,29:9055105,21358568 +r1,29:9055105,21358568:0,1179648,353898 +(1,29:9055105,21358568:0,825750,353898 +k1,29:6636830,21358568:-2418275 +(1,29:6636830,21358568:2418275,825750,353898 +x1,29:7993423,21358568 +g1,29:9055105,21358568 +r1,29:9055105,21358568:0,1179648,353898 +g1,29:9055105,21358568 +) +) +x1,29:12121533,21358568 +g1,29:12475427,21358568 +x1,29:17087845,21358568 +r1,29:17087845,21358568:0,1179648,353898 +k1,29:30229790,21358568:13141945 +g1,29:30229790,21358568 +) +(1,31:6636830,23120174:23592960,490372,59802 +$1,30:6636830,23120174 +(1,30:6636830,23120174:1624613,490372,59802 +(1,30:6636830,23120174:528248,490372,0 +(1,30:6636830,23120174:528248,490372,0 +x1,30:7165078,23120174 +) +) +(1,30:7165078,23120174:558150,418611,59802 +x1,30:7723228,23120174 +) +(1,30:7723228,23120174:538215,490372,0 +(1,30:7723228,23120174:538215,490372,0 +x1,30:8261443,23120174 +) +) +) +g1,30:8420911,23120174 +x1,30:8979061,23120174 +g1,30:9138529,23120174 +h1,30:9138529,23120174:0,0,0 +(1,30:9138529,23120174:1076430,490372,0 +(1,30:9138529,23120174:1076430,490372,0 +x1,30:10214959,23120174 +) +) +(1,30:10214959,23120174:1549563,478561,0 +h1,30:10214959,23120174:0,0,0 +g1,30:10414294,23120174 +(1,30:10414294,23120174:1150893,478561,0 +[1,30:10414294,23120174:1150893,478561,0 +(1,30:10414294,22713375:1150893,0,0 +k1,30:10584508,22713375:170214 +g1,30:11302129,22713375 +k1,30:11565187,22713375:170214 +) +(1,30:10414294,23120174:1150893,263276,0 +$1,30:10414294,23120174 +(1,30:10414294,23120174:558150,0,0 +(1,30:10414294,23120174:558150,0,0 +$1,30:10414294,23120174 +(1,30:10414294,23120174:558150,418611,59802 +x1,30:10972444,23120174 +) +$1,30:10972444,23120174 +) +) +(1,30:10710669,23120174:398682,0,0 +$1,30:10710669,23120174 +(1,30:10630935,23120174:558150,0,0 +(1,30:10630935,23120174:558150,0,0 +$1,30:10630935,23120174 +(1,30:10630935,23120174:558150,418611,59802 +x1,30:11189085,23120174 +) +$1,30:11189085,23120174 +) +) +$1,30:11109351,23120174 +) +x1,30:11565187,23120174 +$1,30:11565187,23120174 +) +] +) +g1,30:11764522,23120174 +h1,30:11764522,23120174:0,0,0 +) +(1,30:11764522,23120174:1624613,490372,59802 +(1,30:11764522,23120174:528248,490372,0 +(1,30:11764522,23120174:528248,490372,0 +x1,30:12292770,23120174 +) +) +(1,30:12292770,23120174:558150,418611,59802 +x1,30:12850920,23120174 +) +(1,30:12850920,23120174:538215,490372,0 +(1,30:12850920,23120174:538215,490372,0 +x1,30:13389135,23120174 +) +) +) +g1,30:13548603,23120174 +x1,30:14106753,23120174 +g1,30:14266221,23120174 +h1,30:14266221,23120174:0,0,0 +(1,30:14266221,23120174:1076430,490372,0 +(1,30:14266221,23120174:1076430,490372,0 +x1,30:15342651,23120174 +) +) +$1,30:15342651,23120174 +k1,31:30229790,23120174:14887139 +g1,31:30229790,23120174 +) +(1,31:6636830,25511491:23592960,642250,275254 +g1,31:9340190,25511491 +r1,31:9340190,25511491:0,917504,275254 +(1,31:9340190,25511491:0,642250,275254 +k1,31:6636830,25511491:-2703360 +(1,31:6636830,25511491:2703360,642250,275254 +x1,31:8455454,25511491 +g1,31:9340190,25511491 +r1,31:9340190,25511491:0,917504,275254 +g1,31:9340190,25511491 +) +) +x1,31:13183878,25511491 +g1,31:13478790,25511491 +x1,31:16220835,25511491 +x1,31:17670819,25511491 +r1,31:17670819,25511491:0,917504,275254 +k1,31:30229790,25511491:12558971 +g1,31:30229790,25511491 +) +(1,32:6636830,27025917:23592960,498346,139537 +x1,32:7862765,27025917 +x1,32:9599007,27025917 +g1,32:9838213,27025917 +x1,32:10914643,27025917 +x1,32:12130610,27025917 +k1,32:30229790,27025917:18099180 +g1,32:30229790,27025917 +) +(1,36:6636830,28884656:23859892,623900,267389 +g1,36:6636830,28884656 +(1,36:6636830,28884656:7193139,623900,267389 +k1,36:8921587,28884656:2284757 +(1,36:8921587,28884656:0,623900,267389 +[1,36:8921587,28884656:0,623900,267389 +(1,21:8921587,28884656:0,623900,267389 +r1,36:8921587,28884656:0,891289,267389 +) +] +) +(1,36:8921587,28884656:4908382,498346,205512 +$1,36:8921587,28884656 +(1,36:8921587,28884656:4908382,498346,205512 +h1,36:8921587,28884656:0,0,0 +(1,36:8921587,28884656:4908382,498346,205512 +(1,36:8921587,28884656:2775461,490372,205512 +x1,36:9439868,28884656 +[1,36:9439868,29090168:311300,507307,0 +(1,36:9439868,28582861:32768,0,54616 +h1,36:9439868,28582861:0,0,0 +h1,36:9439868,28582861:0,0,54616 +h1,36:9439868,28582861:0,0,0 +) +(1,36:9439868,29090168:311300,337875,0 +h1,36:9439868,29090168:0,0,0 +x1,36:9718400,29090168 +) +] +x1,36:10289383,28884656 +[1,36:10289383,29090168:311300,507307,0 +(1,36:10289383,28582861:32768,0,54616 +h1,36:10289383,28582861:0,0,0 +h1,36:10289383,28582861:0,0,54616 +h1,36:10289383,28582861:0,0,0 +) +(1,36:10289383,29090168:311300,337875,0 +h1,36:10289383,29090168:0,0,0 +x1,36:10567915,29090168 +) +] +(1,36:10600683,28884656:1096365,490372,0 +x1,36:11697048,28884656 +) +) +g1,36:11856516,28884656 +x1,36:12414666,28884656 +g1,36:12574134,28884656 +h1,36:12574134,28884656:0,0,0 +(1,36:12574134,28884656:1255835,498346,0 +x1,36:13829969,28884656 +) +) +) +$1,36:13829969,28884656 +) +) +g1,36:13829969,28884656 +(1,36:13829969,28884656:16666753,623900,267389 +(1,36:13829969,28884656:6231030,498346,205512 +$1,36:13829969,28884656 +(1,36:13829969,28884656:6231030,498346,205512 +h1,36:13829969,28884656:0,0,0 +(1,36:13829969,28884656:6231030,498346,205512 +(1,36:13829969,28884656:1549563,478561,0 +h1,36:13829969,28884656:0,0,0 +g1,36:14029304,28884656 +(1,36:14029304,28884656:1150893,478561,0 +[1,36:14029304,28884656:1150893,478561,0 +(1,36:14029304,28477857:1150893,0,0 +k1,36:14199518,28477857:170214 +g1,36:14917139,28477857 +k1,36:15180197,28477857:170214 +) +(1,36:14029304,28884656:1150893,263276,0 +$1,36:14029304,28884656 +(1,36:14029304,28884656:558150,0,0 +(1,36:14029304,28884656:558150,0,0 +$1,36:14029304,28884656 +(1,36:14029304,28884656:558150,418611,59802 +x1,36:14587454,28884656 +) +$1,36:14587454,28884656 +) +) +(1,36:14325679,28884656:398682,0,0 +$1,36:14325679,28884656 +(1,36:14245945,28884656:558150,0,0 +(1,36:14245945,28884656:558150,0,0 +$1,36:14245945,28884656 +(1,36:14245945,28884656:558150,418611,59802 +x1,36:14804095,28884656 +) +$1,36:14804095,28884656 +) +) +$1,36:14724361,28884656 +) +x1,36:15180197,28884656 +$1,36:15180197,28884656 +) +] +) +g1,36:15379532,28884656 +h1,36:15379532,28884656:0,0,0 +) +(1,36:15379532,28884656:2396716,498346,205512 +x1,36:15897813,28884656 +[1,36:15897813,29090168:311300,507307,0 +(1,36:15897813,28582861:32768,0,54616 +h1,36:15897813,28582861:0,0,0 +h1,36:15897813,28582861:0,0,54616 +h1,36:15897813,28582861:0,0,0 +) +(1,36:15897813,29090168:311300,337875,0 +h1,36:15897813,29090168:0,0,0 +x1,36:16176345,29090168 +) +] +x1,36:16747328,28884656 +[1,36:16747328,29090168:311300,507307,0 +(1,36:16747328,28582861:32768,0,54616 +h1,36:16747328,28582861:0,0,0 +h1,36:16747328,28582861:0,0,54616 +h1,36:16747328,28582861:0,0,0 +) +(1,36:16747328,29090168:311300,337875,0 +h1,36:16747328,29090168:0,0,0 +x1,36:17025860,29090168 +) +] +(1,36:17058628,28884656:717620,498346,0 +x1,36:17776248,28884656 +) +) +g1,36:17935716,28884656 +x1,36:18493866,28884656 +g1,36:18653334,28884656 +h1,36:18653334,28884656:0,0,0 +(1,36:18653334,28884656:1407665,490372,205512 +x1,36:19191549,28884656 +[1,36:19191549,29090168:311300,507307,0 +(1,36:19191549,28582861:32768,0,54616 +h1,36:19191549,28582861:0,0,0 +h1,36:19191549,28582861:0,0,54616 +h1,36:19191549,28582861:0,0,0 +) +(1,36:19191549,29090168:311300,337875,0 +h1,36:19191549,29090168:0,0,0 +x1,36:19470081,29090168 +) +] +x1,36:20060999,28884656 +) +) +) +$1,36:20060999,28884656 +) +k1,36:30496722,28884656:10435723 +) +g1,36:31152082,28884656 +(1,36:31152082,28884656:-655360,623900,267389 +) +g1,36:30496722,28884656 +) +(1,36:6636830,29972554:23859892,623900,267389 +g1,36:6636830,29972554 +(1,36:6636830,29972554:7193139,623900,267389 +k1,36:7421896,29972554:785066 +(1,36:7421896,29972554:0,623900,267389 +[1,36:7421896,29972554:0,623900,267389 +(1,21:7421896,29972554:0,623900,267389 +r1,36:7421896,29972554:0,891289,267389 +) +] +) +(1,36:7421896,29972554:6408073,498346,205512 +$1,36:7421896,29972554 +(1,36:7421896,29972554:6408073,498346,205512 +h1,36:7421896,29972554:0,0,0 +(1,36:7421896,29972554:6408073,498346,205512 +(1,36:7421896,29972554:2396716,498346,205512 +x1,36:7940177,29972554 +[1,36:7940177,30178066:311300,507307,0 +(1,36:7940177,29670759:32768,0,54616 +h1,36:7940177,29670759:0,0,0 +h1,36:7940177,29670759:0,0,54616 +h1,36:7940177,29670759:0,0,0 +) +(1,36:7940177,30178066:311300,337875,0 +h1,36:7940177,30178066:0,0,0 +x1,36:8218709,30178066 +) +] +x1,36:8789692,29972554 +[1,36:8789692,30178066:311300,507307,0 +(1,36:8789692,29670759:32768,0,54616 +h1,36:8789692,29670759:0,0,0 +h1,36:8789692,29670759:0,0,54616 +h1,36:8789692,29670759:0,0,0 +) +(1,36:8789692,30178066:311300,337875,0 +h1,36:8789692,30178066:0,0,0 +x1,36:9068224,30178066 +) +] +(1,36:9100992,29972554:717620,498346,0 +x1,36:9818612,29972554 +) +) +g1,36:9978080,29972554 +x1,36:10536230,29972554 +g1,36:10695698,29972554 +h1,36:10695698,29972554:0,0,0 +(1,36:10695698,29972554:3134271,490372,205512 +x1,36:11213979,29972554 +[1,36:11213979,30178066:311300,507307,0 +(1,36:11213979,29670759:32768,0,54616 +h1,36:11213979,29670759:0,0,0 +h1,36:11213979,29670759:0,0,54616 +h1,36:11213979,29670759:0,0,0 +) +(1,36:11213979,30178066:311300,337875,0 +h1,36:11213979,30178066:0,0,0 +x1,36:11492511,30178066 +) +] +x1,36:12063494,29972554 +[1,36:12063494,30178066:311300,507307,0 +(1,36:12063494,29670759:32768,0,54616 +h1,36:12063494,29670759:0,0,0 +h1,36:12063494,29670759:0,0,54616 +h1,36:12063494,29670759:0,0,0 +) +(1,36:12063494,30178066:311300,337875,0 +h1,36:12063494,30178066:0,0,0 +x1,36:12342026,30178066 +) +] +(1,36:12374794,29972554:1455175,490372,0 +x1,36:13829969,29972554 +) +) +) +) +$1,36:13829969,29972554 +) +) +g1,36:13829969,29972554 +(1,36:13829969,29972554:16666753,623900,267389 +(1,36:13829969,29972554:16666753,538214,205512 +$1,36:13829969,29972554 +(1,36:13829969,29972554:16666753,538214,205512 +h1,36:13829969,29972554:0,0,0 +(1,36:13829969,29972554:7957636,498346,205512 +(1,36:13829969,29972554:1549563,478561,0 +h1,36:13829969,29972554:0,0,0 +g1,36:14029304,29972554 +(1,36:14029304,29972554:1150893,478561,0 +[1,36:14029304,29972554:1150893,478561,0 +(1,36:14029304,29565755:1150893,0,0 +k1,36:14199518,29565755:170214 +g1,36:14917139,29565755 +k1,36:15180197,29565755:170214 +) +(1,36:14029304,29972554:1150893,263276,0 +$1,36:14029304,29972554 +(1,36:14029304,29972554:558150,0,0 +(1,36:14029304,29972554:558150,0,0 +$1,36:14029304,29972554 +(1,36:14029304,29972554:558150,418611,59802 +x1,36:14587454,29972554 +) +$1,36:14587454,29972554 +) +) +(1,36:14325679,29972554:398682,0,0 +$1,36:14325679,29972554 +(1,36:14245945,29972554:558150,0,0 +(1,36:14245945,29972554:558150,0,0 +$1,36:14245945,29972554 +(1,36:14245945,29972554:558150,418611,59802 +x1,36:14804095,29972554 +) +$1,36:14804095,29972554 +) +) +$1,36:14724361,29972554 +) +x1,36:15180197,29972554 +$1,36:15180197,29972554 +) +] +) +g1,36:15379532,29972554 +h1,36:15379532,29972554:0,0,0 +) +(1,36:15379532,29972554:3916342,490372,205512 +x1,36:15897813,29972554 +[1,36:15897813,30178066:311300,507307,0 +(1,36:15897813,29670759:32768,0,54616 +h1,36:15897813,29670759:0,0,0 +h1,36:15897813,29670759:0,0,54616 +h1,36:15897813,29670759:0,0,0 +) +(1,36:15897813,30178066:311300,337875,0 +h1,36:15897813,30178066:0,0,0 +x1,36:16176345,30178066 +) +] +x1,36:16747328,29972554 +[1,36:16747328,30178066:311300,507307,0 +(1,36:16747328,29670759:32768,0,54616 +h1,36:16747328,29670759:0,0,0 +h1,36:16747328,29670759:0,0,54616 +h1,36:16747328,29670759:0,0,0 +) +(1,36:16747328,30178066:311300,337875,0 +h1,36:16747328,30178066:0,0,0 +x1,36:17025860,30178066 +) +] +(1,36:17058628,29972554:1076431,490372,0 +x1,36:18135059,29972554 +) +[1,36:18135059,30178066:311300,507307,0 +(1,36:18135059,29670759:32768,0,54616 +h1,36:18135059,29670759:0,0,0 +h1,36:18135059,29670759:0,0,54616 +h1,36:18135059,29670759:0,0,0 +) +(1,36:18135059,30178066:311300,337875,0 +h1,36:18135059,30178066:0,0,0 +x1,36:18413591,30178066 +) +] +x1,36:18984574,29972554 +[1,36:18984574,30178066:311300,507307,0 +(1,36:18984574,29670759:32768,0,54616 +h1,36:18984574,29670759:0,0,0 +h1,36:18984574,29670759:0,0,54616 +h1,36:18984574,29670759:0,0,0 +) +(1,36:18984574,30178066:311300,337875,0 +h1,36:18984574,30178066:0,0,0 +x1,36:19263106,30178066 +) +] +) +g1,36:19455342,29972554 +x1,36:20013492,29972554 +g1,36:20172960,29972554 +h1,36:20172960,29972554:0,0,0 +(1,36:20172960,29972554:1614645,498346,0 +x1,36:21787605,29972554 +) +) +g1,36:22505226,29972554 +(1,36:22505226,29972554:7991496,538214,179404 +(1,36:22505226,29972554:7991496,538214,179404 +x1,36:23665379,29972554 +x1,36:25008922,29972554 +g1,36:25248128,29972554 +x1,36:26446155,29972554 +g1,36:26685361,29972554 +x1,36:30496722,29972554 +) +) +) +$1,36:30496722,29972554 +) +g1,36:30496722,29972554 +) +g1,36:31152082,29972554 +(1,36:31152082,29972554:-655360,623900,267389 +) +g1,36:30496722,29972554 +) +(1,36:6636830,31060452:23859892,623900,267389 +g1,36:6636830,31060452 +(1,36:6636830,31060452:7193139,623900,267389 +g1,36:6636830,31060452 +(1,36:6636830,31060452:0,623900,267389 +[1,36:6636830,31060452:0,623900,267389 +(1,21:6636830,31060452:0,623900,267389 +r1,36:6636830,31060452:0,891289,267389 +) +] +) +(1,36:6636830,31060452:7193139,490372,205512 +$1,36:6636830,31060452 +(1,36:6636830,31060452:7193139,490372,205512 +h1,36:6636830,31060452:0,0,0 +(1,36:6636830,31060452:7193139,490372,205512 +(1,36:6636830,31060452:3540592,490372,205512 +(1,36:6636830,31060452:1056496,490372,0 +x1,36:7693326,31060452 +) +[1,36:7693326,31265964:311300,507307,0 +(1,36:7693326,30758657:32768,0,54616 +h1,36:7693326,30758657:0,0,0 +h1,36:7693326,30758657:0,0,54616 +h1,36:7693326,30758657:0,0,0 +) +(1,36:7693326,31265964:311300,337875,0 +h1,36:7693326,31265964:0,0,0 +x1,36:7971858,31265964 +) +] +(1,36:8004626,31060452:2172796,490372,0 +x1,36:10177422,31060452 +) +) +g1,36:10336890,31060452 +x1,36:10895040,31060452 +g1,36:11054508,31060452 +h1,36:11054508,31060452:0,0,0 +(1,36:11054508,31060452:2775461,490372,205512 +x1,36:11572789,31060452 +[1,36:11572789,31265964:311300,507307,0 +(1,36:11572789,30758657:32768,0,54616 +h1,36:11572789,30758657:0,0,0 +h1,36:11572789,30758657:0,0,54616 +h1,36:11572789,30758657:0,0,0 +) +(1,36:11572789,31265964:311300,337875,0 +h1,36:11572789,31265964:0,0,0 +x1,36:11851321,31265964 +) +] +x1,36:12422304,31060452 +[1,36:12422304,31265964:311300,507307,0 +(1,36:12422304,30758657:32768,0,54616 +h1,36:12422304,30758657:0,0,0 +h1,36:12422304,30758657:0,0,54616 +h1,36:12422304,30758657:0,0,0 +) +(1,36:12422304,31265964:311300,337875,0 +h1,36:12422304,31265964:0,0,0 +x1,36:12700836,31265964 +) +] +(1,36:12733604,31060452:1096365,490372,0 +x1,36:13829969,31060452 +) +) +) +) +$1,36:13829969,31060452 +) +) +g1,36:13829969,31060452 +(1,36:13829969,31060452:16666753,623900,267389 +(1,36:13829969,31060452:13050750,538214,205512 +$1,36:13829969,31060452 +(1,36:13829969,31060452:13050750,538214,205512 +h1,36:13829969,31060452:0,0,0 +(1,36:13829969,31060452:8515787,490372,205512 +(1,36:13829969,31060452:1549563,478561,0 +h1,36:13829969,31060452:0,0,0 +g1,36:14029304,31060452 +(1,36:14029304,31060452:1150893,478561,0 +[1,36:14029304,31060452:1150893,478561,0 +(1,36:14029304,30653653:1150893,0,0 +k1,36:14199518,30653653:170214 +g1,36:14917139,30653653 +k1,36:15180197,30653653:170214 +) +(1,36:14029304,31060452:1150893,263276,0 +$1,36:14029304,31060452 +(1,36:14029304,31060452:558150,0,0 +(1,36:14029304,31060452:558150,0,0 +$1,36:14029304,31060452 +(1,36:14029304,31060452:558150,418611,59802 +x1,36:14587454,31060452 +) +$1,36:14587454,31060452 +) +) +(1,36:14325679,31060452:398682,0,0 +$1,36:14325679,31060452 +(1,36:14245945,31060452:558150,0,0 +(1,36:14245945,31060452:558150,0,0 +$1,36:14245945,31060452 +(1,36:14245945,31060452:558150,418611,59802 +x1,36:14804095,31060452 +) +$1,36:14804095,31060452 +) +) +$1,36:14724361,31060452 +) +x1,36:15180197,31060452 +$1,36:15180197,31060452 +) +] +) +g1,36:15379532,31060452 +h1,36:15379532,31060452:0,0,0 +) +(1,36:15379532,31060452:4681473,490372,205512 +(1,36:15379532,31060452:1056496,490372,0 +x1,36:16436028,31060452 +) +[1,36:16436028,31265964:311300,507307,0 +(1,36:16436028,30758657:32768,0,54616 +h1,36:16436028,30758657:0,0,0 +h1,36:16436028,30758657:0,0,54616 +h1,36:16436028,30758657:0,0,0 +) +(1,36:16436028,31265964:311300,337875,0 +h1,36:16436028,31265964:0,0,0 +x1,36:16714560,31265964 +) +] +(1,36:16747328,31060452:2152862,490372,0 +x1,36:18900190,31060452 +) +[1,36:18900190,31265964:311300,507307,0 +(1,36:18900190,30758657:32768,0,54616 +h1,36:18900190,30758657:0,0,0 +h1,36:18900190,30758657:0,0,54616 +h1,36:18900190,30758657:0,0,0 +) +(1,36:18900190,31265964:311300,337875,0 +h1,36:18900190,31265964:0,0,0 +x1,36:19178722,31265964 +) +] +x1,36:19749705,31060452 +[1,36:19749705,31265964:311300,507307,0 +(1,36:19749705,30758657:32768,0,54616 +h1,36:19749705,30758657:0,0,0 +h1,36:19749705,30758657:0,0,54616 +h1,36:19749705,30758657:0,0,0 +) +(1,36:19749705,31265964:311300,337875,0 +h1,36:19749705,31265964:0,0,0 +x1,36:20028237,31265964 +) +] +) +g1,36:20220473,31060452 +x1,36:20778623,31060452 +g1,36:20938091,31060452 +h1,36:20938091,31060452:0,0,0 +(1,36:20938091,31060452:1407665,490372,205512 +x1,36:21476306,31060452 +[1,36:21476306,31265964:311300,507307,0 +(1,36:21476306,30758657:32768,0,54616 +h1,36:21476306,30758657:0,0,0 +h1,36:21476306,30758657:0,0,54616 +h1,36:21476306,30758657:0,0,0 +) +(1,36:21476306,31265964:311300,337875,0 +h1,36:21476306,31265964:0,0,0 +x1,36:21754838,31265964 +) +] +x1,36:22345756,31060452 +) +) +g1,36:23063377,31060452 +(1,36:23063377,31060452:3817342,538214,179404 +(1,36:23063377,31060452:3817342,538214,179404 +x1,36:25022879,31060452 +x1,36:25800302,31060452 +x1,36:26880719,31060452 +) +) +) +$1,36:26880719,31060452 +) +k1,36:30496722,31060452:3616003 +) +g1,36:31152082,31060452 +(1,36:31152082,31060452:-655360,623900,267389 +) +g1,36:30496722,31060452 +) +[1,36:6636830,31060452:23592960,623900,267389 +(1,36:6636830,31060452:23592960,623900,267389 +(1,36:6636830,31060452:23859892,623900,267389 +(1,36:6636830,31060452:0,623900,267389 +[1,36:6636830,31060452:0,623900,267389 +(1,21:6636830,31060452:0,623900,267389 +r1,36:6636830,31060452:0,891289,267389 +) +] +) +k1,36:30496722,31060452:23859892 +) +g1,36:30496722,31060452 +g1,36:30496722,31060452 +) +] +(1,39:6636830,33001376:23592960,538214,179404 +h1,38:6636830,33001376:1114112,0,0 +x1,38:10918439,33001376 +x1,38:11636059,33001376 +k1,38:11856849,33001376:220790 +x1,38:13152553,33001376 +x1,38:15269532,33001376 +k1,38:15490321,33001376:220789 +x1,38:17708964,33001376 +x1,38:18067774,33001376 +x1,38:18605988,33001376 +k1,38:18830461,33001376:224473 +x1,38:19807223,33001376 +x1,38:21063057,33001376 +k1,38:21283847,33001376:220790 +x1,38:23103812,33001376 +k1,38:23324601,33001376:220789 +x1,38:24620304,33001376 +k1,38:24841094,33001376:220790 +x1,38:26477667,33001376 +k1,38:26698457,33001376:220790 +x1,38:27336342,33001376 +k1,38:27557131,33001376:220789 +x1,38:28713297,33001376 +k1,38:28934087,33001376:220790 +x1,38:30229790,33001376 +k1,38:30229790,33001376:0 +) +(1,39:6636830,33892666:23592960,538214,179404 +x1,39:8273403,33892666 +g1,38:8512609,33892666 +x1,38:9349833,33892666 +k1,39:30229790,33892666:20879957 +g1,39:30229790,33892666 +) +(1,40:6636830,36283983:23592960,642250,275254 +g1,40:9340190,36283983 +r1,40:9340190,36283983:0,917504,275254 +(1,40:9340190,36283983:0,642250,275254 +k1,40:6636830,36283983:-2703360 +(1,40:6636830,36283983:2703360,642250,275254 +x1,40:8455454,36283983 +g1,40:9340190,36283983 +r1,40:9340190,36283983:0,917504,275254 +g1,40:9340190,36283983 +) +) +x1,40:13183878,36283983 +g1,40:13478790,36283983 +x1,40:16323690,36283983 +x1,40:17773674,36283983 +r1,40:17773674,36283983:0,917504,275254 +k1,40:30229790,36283983:12456116 +g1,40:30229790,36283983 +) +(1,41:6636830,37871809:23592960,623900,267389 +r1,41:6636830,37871809:0,891289,267389 +x1,41:10530985,37871809 +r1,41:10530985,37871809:0,891289,267389 +k1,41:30229790,37871809:19698805 +g1,41:30229790,37871809 +) +(1,44:6636830,39773921:23592960,946051,205512 +$1,42:6636830,39773921 +(1,42:6636830,39773921:1679096,490372,205512 +(1,42:6636830,39773921:518281,490372,0 +(1,42:6636830,39773921:518281,490372,0 +x1,42:7155111,39773921 +) +) +[1,42:7155111,39979433:311300,507307,0 +(1,42:7155111,39472126:32768,0,54616 +h1,42:7155111,39472126:0,0,0 +h1,42:7155111,39472126:0,0,54616 +(1,42:7155111,39472126:0,0,0 +h1,42:7155111,39472126:0,0,0 +) +) +(1,42:7155111,39979433:311300,337875,0 +h1,42:7155111,39979433:0,0,0 +(1,42:7155111,39979433:278532,337875,0 +(1,42:7155111,39979433:278532,337875,0 +x1,42:7433643,39979433 +) +) +) +] +(1,42:7466411,39773921:538215,490372,0 +(1,42:7466411,39773921:538215,490372,0 +x1,42:8004626,39773921 +) +) +[1,42:8004626,39979433:311300,507307,0 +(1,42:8004626,39472126:32768,0,54616 +h1,42:8004626,39472126:0,0,0 +h1,42:8004626,39472126:0,0,54616 +(1,42:8004626,39472126:0,0,0 +h1,42:8004626,39472126:0,0,0 +) +) +(1,42:8004626,39979433:311300,337875,0 +h1,42:8004626,39979433:0,0,0 +(1,42:8004626,39979433:278532,337875,0 +(1,42:8004626,39979433:278532,337875,0 +x1,42:8283158,39979433 +) +) +) +] +) +g1,42:8475394,39773921 +x1,42:9033544,39773921 +g1,42:9193012,39773921 +h1,42:9193012,39773921:0,0,0 +(1,42:9193012,39773921:1028920,498346,205512 +(1,42:9193012,39773921:717620,498346,0 +(1,42:9193012,39773921:717620,498346,0 +x1,42:9910632,39773921 +) +) +[1,42:9910632,39979433:311300,507307,0 +(1,42:9910632,39472126:32768,0,54616 +h1,42:9910632,39472126:0,0,0 +h1,42:9910632,39472126:0,0,54616 +(1,42:9910632,39472126:0,0,0 +h1,42:9910632,39472126:0,0,0 +) +) +(1,42:9910632,39979433:311300,337875,0 +h1,42:9910632,39979433:0,0,0 +(1,42:9910632,39979433:278532,337875,0 +(1,42:9910632,39979433:278532,337875,0 +x1,42:10189164,39979433 +) +) +) +] +) +(1,42:10221932,39773921:2234061,946051,0 +h1,42:10221932,39773921:0,0,0 +g1,42:10421267,39773921 +(1,42:10421267,39773921:1835391,946051,0 +[1,42:10421267,39773921:1835391,946051,0 +(1,42:10421267,39263721:1835391,364089,167189 +k1,42:10591481,39263721:170214 +(1,42:10591481,39263721:1402119,364089,167189 +(1,42:10591481,39263721:1129056,364089,0 +(1,42:10591481,39263721:1129056,364089,0 +x1,42:11720537,39263721 +) +) +[1,42:11720537,39430910:273063,402389,0 +(1,42:11720537,39028521:32768,0,54612 +h1,42:11720537,39028521:0,0,0 +h1,42:11720537,39028521:0,0,54612 +(1,42:11720537,39028521:0,0,0 +h1,42:11720537,39028521:0,0,0 +) +) +(1,42:11720537,39430910:273063,253405,0 +h1,42:11720537,39430910:0,0,0 +(1,42:11720537,39430910:240295,253405,0 +(1,42:11720537,39430910:240295,253405,0 +x1,42:11960832,39430910 +) +) +) +] +) +k1,42:12256658,39263721:170214 +) +(1,42:10421267,39773921:1835391,263276,0 +$1,42:10421267,39773921 +(1,42:10421267,39773921:558150,0,0 +(1,42:10421267,39773921:558150,0,0 +$1,42:10421267,39773921 +(1,42:10421267,39773921:558150,418611,59802 +x1,42:10979417,39773921 +) +$1,42:10979417,39773921 +) +) +(1,42:10860550,39773921:398682,0,0 +$1,42:10860550,39773921 +(1,42:10780816,39773921:558150,0,0 +(1,42:10780816,39773921:558150,0,0 +$1,42:10780816,39773921 +(1,42:10780816,39773921:558150,418611,59802 +x1,42:11338966,39773921 +) +$1,42:11338966,39773921 +) +) +$1,42:11259232,39773921 +) +(1,42:11259232,39773921:398682,0,0 +(1,42:11179498,39773921:558150,0,0 +(1,42:11179498,39773921:558150,0,0 +(1,42:11179498,39773921:558150,418611,59802 +x1,42:11737648,39773921 +) +) +) +) +x1,42:12256658,39773921 +$1,42:12256658,39773921 +) +] +) +g1,42:12455993,39773921 +h1,42:12455993,39773921:0,0,0 +h1,42:12455993,39773921:0,0,0 +) +(1,42:12455993,39773921:2396716,498346,205512 +(1,42:12455993,39773921:518281,490372,0 +(1,42:12455993,39773921:518281,490372,0 +x1,42:12974274,39773921 +) +) +[1,42:12974274,39979433:311300,507307,0 +(1,42:12974274,39472126:32768,0,54616 +h1,42:12974274,39472126:0,0,0 +h1,42:12974274,39472126:0,0,54616 +(1,42:12974274,39472126:0,0,0 +h1,42:12974274,39472126:0,0,0 +) +) +(1,42:12974274,39979433:311300,337875,0 +h1,42:12974274,39979433:0,0,0 +(1,42:12974274,39979433:278532,337875,0 +(1,42:12974274,39979433:278532,337875,0 +x1,42:13252806,39979433 +) +) +) +] +(1,42:13285574,39773921:538215,490372,0 +(1,42:13285574,39773921:538215,490372,0 +x1,42:13823789,39773921 +) +) +[1,42:13823789,39979433:311300,507307,0 +(1,42:13823789,39472126:32768,0,54616 +h1,42:13823789,39472126:0,0,0 +h1,42:13823789,39472126:0,0,54616 +(1,42:13823789,39472126:0,0,0 +h1,42:13823789,39472126:0,0,0 +) +) +(1,42:13823789,39979433:311300,337875,0 +h1,42:13823789,39979433:0,0,0 +(1,42:13823789,39979433:278532,337875,0 +(1,42:13823789,39979433:278532,337875,0 +x1,42:14102321,39979433 +) +) +) +] +(1,42:14135089,39773921:717620,498346,0 +(1,42:14135089,39773921:717620,498346,0 +x1,42:14852709,39773921 +) +) +) +g1,42:15012177,39773921 +x1,42:15570327,39773921 +g1,42:15729795,39773921 +h1,42:15729795,39773921:0,0,0 +(1,42:15729795,39773921:1255835,498346,0 +(1,42:15729795,39773921:1255835,498346,0 +x1,42:16985630,39773921 +) +) +$1,42:16985630,39773921 +k1,43:30229790,39773921:13244160 +g1,44:30229790,39773921 +) +(1,44:6636830,40665211:23592960,498346,139537 +x1,44:7992336,40665211 +x1,43:10109315,40665211 +g1,43:10348521,40665211 +x1,43:12567164,40665211 +x1,43:12925974,40665211 +x1,43:13464188,40665211 +k1,44:30229790,40665211:16765602 +g1,44:30229790,40665211 +) +(1,47:6636830,42523950:16580211,623900,267389 +g1,47:13649579,42523950 +(1,47:13649579,42523950:3739842,623900,267389 +k1,47:13716941,42523950:67362 +(1,47:13716941,42523950:0,623900,267389 +[1,47:13716941,42523950:0,623900,267389 +(1,21:13716941,42523950:0,623900,267389 +r1,47:13716941,42523950:0,891289,267389 +) +] +) +(1,47:13716941,42523950:3672480,498346,205512 +$1,47:13716941,42523950 +(1,47:13716941,42523950:3672480,498346,205512 +h1,47:13716941,42523950:0,0,0 +(1,47:13716941,42523950:3672480,498346,205512 +(1,47:13716941,42523950:1028920,498346,205512 +(1,47:13716941,42523950:717620,498346,0 +x1,47:14434561,42523950 +) +[1,47:14434561,42729462:311300,507307,0 +(1,47:14434561,42222155:32768,0,54616 +h1,47:14434561,42222155:0,0,0 +h1,47:14434561,42222155:0,0,54616 +h1,47:14434561,42222155:0,0,0 +) +(1,47:14434561,42729462:311300,337875,0 +h1,47:14434561,42729462:0,0,0 +x1,47:14713093,42729462 +) +] +) +g1,47:14905329,42523950 +x1,47:15463479,42523950 +g1,47:15622947,42523950 +h1,47:15622947,42523950:0,0,0 +(1,47:15622947,42523950:1766474,498346,205512 +(1,47:15622947,42523950:1455174,498346,0 +x1,47:17078121,42523950 +) +[1,47:17078121,42729462:311300,507307,0 +(1,47:17078121,42222155:32768,0,54616 +h1,47:17078121,42222155:0,0,0 +h1,47:17078121,42222155:0,0,54616 +h1,47:17078121,42222155:0,0,0 +) +(1,47:17078121,42729462:311300,337875,0 +h1,47:17078121,42729462:0,0,0 +x1,47:17356653,42729462 +) +] +) +) +) +$1,47:17389421,42523950 +) +) +g1,47:17389421,42523950 +(1,47:17389421,42523950:5827620,623900,267389 +(1,47:17389421,42523950:5531523,618555,205512 +$1,47:17389421,42523950 +(1,47:17389421,42523950:5531523,618555,205512 +h1,47:17389421,42523950:0,0,0 +(1,47:17389421,42523950:5531523,618555,205512 +(1,47:17389421,42523950:1549563,478561,0 +h1,47:17389421,42523950:0,0,0 +g1,47:17588756,42523950 +(1,47:17588756,42523950:1150893,478561,0 +[1,47:17588756,42523950:1150893,478561,0 +(1,47:17588756,42117151:1150893,0,0 +k1,47:17758970,42117151:170214 +g1,47:18476591,42117151 +k1,47:18739649,42117151:170214 +) +(1,47:17588756,42523950:1150893,263276,0 +$1,47:17588756,42523950 +(1,47:17588756,42523950:558150,0,0 +(1,47:17588756,42523950:558150,0,0 +$1,47:17588756,42523950 +(1,47:17588756,42523950:558150,418611,59802 +x1,47:18146906,42523950 +) +$1,47:18146906,42523950 +) +) +(1,47:17885131,42523950:398682,0,0 +$1,47:17885131,42523950 +(1,47:17805397,42523950:558150,0,0 +(1,47:17805397,42523950:558150,0,0 +$1,47:17805397,42523950 +(1,47:17805397,42523950:558150,418611,59802 +x1,47:18363547,42523950 +) +$1,47:18363547,42523950 +) +) +$1,47:18283813,42523950 +) +x1,47:18739649,42523950 +$1,47:18739649,42523950 +) +] +) +g1,47:18938984,42523950 +h1,47:18938984,42523950:0,0,0 +) +(1,47:18938984,42523950:1921214,618555,205512 +(1,47:18938984,42523950:1455174,498346,0 +x1,47:20394158,42523950 +) +[1,47:20394158,42729462:466040,824067,0 +(1,47:20394158,42222155:466040,316760,54616 +h1,47:20394158,42222155:0,0,0 +h1,47:20394158,42222155:0,0,54616 +(1,47:20394158,42222155:433272,316760,54616 +x1,47:20827430,42222155 +) +) +(1,47:20394158,42729462:311300,337875,0 +h1,47:20394158,42729462:0,0,0 +x1,47:20672690,42729462 +) +] +) +g1,47:21019666,42523950 +x1,47:21577816,42523950 +g1,47:21737284,42523950 +h1,47:21737284,42523950:0,0,0 +(1,47:21737284,42523950:1183660,613059,177407 +(1,47:21737284,42523950:717620,498346,0 +x1,47:22454904,42523950 +) +[1,47:22454904,42701357:466040,790466,0 +(1,47:22454904,42227651:466040,316760,54616 +h1,47:22454904,42227651:0,0,0 +h1,47:22454904,42227651:0,0,54616 +(1,47:22454904,42227651:433272,316760,54616 +x1,47:22888176,42227651 +) +) +(1,47:22454904,42701357:32768,0,0 +h1,47:22454904,42701357:0,0,0 +h1,47:22454904,42701357:0,0,0 +) +] +) +) +) +$1,47:22920944,42523950 +) +k1,47:23217041,42523950:296097 +) +g1,47:30229790,42523950 +(1,47:30229790,42523950:-7012749,623900,267389 +) +g1,47:23217041,42523950 +) +(1,47:6636830,43611848:16580211,623900,267389 +g1,47:13649579,43611848 +(1,47:13649579,43611848:3739842,623900,267389 +g1,47:13649579,43611848 +(1,47:13649579,43611848:0,623900,267389 +[1,47:13649579,43611848:0,623900,267389 +(1,21:13649579,43611848:0,623900,267389 +r1,47:13649579,43611848:0,891289,267389 +) +] +) +(1,47:13649579,43611848:3739842,613059,205512 +$1,47:13649579,43611848 +(1,47:13649579,43611848:3739842,613059,205512 +h1,47:13649579,43611848:0,0,0 +(1,47:13649579,43611848:3739842,613059,205512 +(1,47:13649579,43611848:1183660,613059,177407 +(1,47:13649579,43611848:717620,498346,0 +x1,47:14367199,43611848 +) +[1,47:14367199,43789255:466040,790466,0 +(1,47:14367199,43315549:466040,316760,54616 +h1,47:14367199,43315549:0,0,0 +h1,47:14367199,43315549:0,0,54616 +(1,47:14367199,43315549:433272,316760,54616 +x1,47:14800471,43315549 +) +) +(1,47:14367199,43789255:32768,0,0 +h1,47:14367199,43789255:0,0,0 +h1,47:14367199,43789255:0,0,0 +) +] +) +g1,47:14992707,43611848 +x1,47:15550857,43611848 +g1,47:15710325,43611848 +h1,47:15710325,43611848:0,0,0 +(1,47:15710325,43611848:1679096,490372,205512 +x1,47:16228606,43611848 +[1,47:16228606,43817360:311300,507307,0 +(1,47:16228606,43310053:32768,0,54616 +h1,47:16228606,43310053:0,0,0 +h1,47:16228606,43310053:0,0,54616 +h1,47:16228606,43310053:0,0,0 +) +(1,47:16228606,43817360:311300,337875,0 +h1,47:16228606,43817360:0,0,0 +x1,47:16507138,43817360 +) +] +x1,47:17078121,43611848 +[1,47:17078121,43817360:311300,507307,0 +(1,47:17078121,43310053:32768,0,54616 +h1,47:17078121,43310053:0,0,0 +h1,47:17078121,43310053:0,0,54616 +h1,47:17078121,43310053:0,0,0 +) +(1,47:17078121,43817360:311300,337875,0 +h1,47:17078121,43817360:0,0,0 +x1,47:17356653,43817360 +) +] +) +) +) +$1,47:17389421,43611848 +) +) +g1,47:17389421,43611848 +(1,47:17389421,43611848:5827620,623900,267389 +(1,47:17389421,43611848:5827620,613059,205512 +$1,47:17389421,43611848 +(1,47:17389421,43611848:5827620,613059,205512 +h1,47:17389421,43611848:0,0,0 +(1,47:17389421,43611848:5827620,613059,205512 +(1,47:17389421,43611848:1549563,478561,0 +h1,47:17389421,43611848:0,0,0 +g1,47:17588756,43611848 +(1,47:17588756,43611848:1150893,478561,0 +[1,47:17588756,43611848:1150893,478561,0 +(1,47:17588756,43205049:1150893,0,0 +k1,47:17758970,43205049:170214 +g1,47:18476591,43205049 +k1,47:18739649,43205049:170214 +) +(1,47:17588756,43611848:1150893,263276,0 +$1,47:17588756,43611848 +(1,47:17588756,43611848:558150,0,0 +(1,47:17588756,43611848:558150,0,0 +$1,47:17588756,43611848 +(1,47:17588756,43611848:558150,418611,59802 +x1,47:18146906,43611848 +) +$1,47:18146906,43611848 +) +) +(1,47:17885131,43611848:398682,0,0 +$1,47:17885131,43611848 +(1,47:17805397,43611848:558150,0,0 +(1,47:17805397,43611848:558150,0,0 +$1,47:17805397,43611848 +(1,47:17805397,43611848:558150,418611,59802 +x1,47:18363547,43611848 +) +$1,47:18363547,43611848 +) +) +$1,47:18283813,43611848 +) +x1,47:18739649,43611848 +$1,47:18739649,43611848 +) +] +) +g1,47:18938984,43611848 +h1,47:18938984,43611848:0,0,0 +) +(1,47:18938984,43611848:2396716,498346,205512 +x1,47:19457265,43611848 +[1,47:19457265,43817360:311300,507307,0 +(1,47:19457265,43310053:32768,0,54616 +h1,47:19457265,43310053:0,0,0 +h1,47:19457265,43310053:0,0,54616 +h1,47:19457265,43310053:0,0,0 +) +(1,47:19457265,43817360:311300,337875,0 +h1,47:19457265,43817360:0,0,0 +x1,47:19735797,43817360 +) +] +x1,47:20306780,43611848 +[1,47:20306780,43817360:311300,507307,0 +(1,47:20306780,43310053:32768,0,54616 +h1,47:20306780,43310053:0,0,0 +h1,47:20306780,43310053:0,0,54616 +h1,47:20306780,43310053:0,0,0 +) +(1,47:20306780,43817360:311300,337875,0 +h1,47:20306780,43817360:0,0,0 +x1,47:20585312,43817360 +) +] +(1,47:20618080,43611848:717620,498346,0 +x1,47:21335700,43611848 +) +) +g1,47:21495168,43611848 +x1,47:22053318,43611848 +g1,47:22212786,43611848 +h1,47:22212786,43611848:0,0,0 +(1,47:22212786,43611848:1004255,613059,177407 +x1,47:22751001,43611848 +[1,47:22751001,43789255:466040,790466,0 +(1,47:22751001,43315549:466040,316760,54616 +h1,47:22751001,43315549:0,0,0 +h1,47:22751001,43315549:0,0,54616 +(1,47:22751001,43315549:433272,316760,54616 +x1,47:23184273,43315549 +) +) +(1,47:22751001,43789255:32768,0,0 +h1,47:22751001,43789255:0,0,0 +h1,47:22751001,43789255:0,0,0 +) +] +) +) +) +$1,47:23217041,43611848 +) +g1,47:23217041,43611848 +) +g1,47:30229790,43611848 +(1,47:30229790,43611848:-7012749,623900,267389 +) +g1,47:23217041,43611848 +) +] +(1,53:6636830,45679049:23592960,462465,0 +(1,53:6636830,45679049:23592960,462465,0 +k1,53:18253905,45679049:11617075 +x1,53:18612715,45679049 +k1,53:30229790,45679049:11617075 +) +) +] +] +!33453 +}5 +!10 +{6 +[1,88:4736286,45679049:30050495,40942763,0 +[1,88:9979166,45679049:24807615,39369899,0 +[1,88:9979166,7095582:23592960,786432,0 +(1,88:9979166,7095582:23592960,490372,0 +(1,88:9979166,7095582:23592960,490372,0 +x1,88:10337976,7095582 +k1,88:20625066,7095582:10287090 +x1,88:22179911,7095582 +g1,88:22419117,7095582 +x1,88:22977266,7095582 +g1,88:23296207,7095582 +g1,88:23535413,7095582 +x1,88:26306224,7095582 +g1,88:26545430,7095582 +x1,88:28508918,7095582 +x1,88:28987330,7095582 +x1,88:29645148,7095582 +x1,88:30103627,7095582 +g1,88:30342833,7095582 +x1,88:33572126,7095582 +) +) +] +[1,88:9979166,43879237:24807615,35481206,0 +(1,49:9979166,9118927:23592960,623900,267389 +r1,49:9979166,9118927:0,891289,267389 +x1,49:12911518,9118927 +g1,49:13186603,9118927 +x1,49:15575263,9118927 +g1,49:15850348,9118927 +x1,49:16369622,9118927 +x1,49:18589244,9118927 +x1,49:20824913,9118927 +r1,49:20824913,9118927:0,891289,267389 +k1,49:33572126,9118927:12747213 +g1,49:33572126,9118927 +) +(1,52:9979166,10861364:23592960,946051,205512 +$1,50:9979166,10861364 +(1,50:9979166,10861364:1679096,490372,205512 +(1,50:9979166,10861364:518281,490372,0 +(1,50:9979166,10861364:518281,490372,0 +x1,50:10497447,10861364 +) +) +[1,50:10497447,11066876:311300,507307,0 +(1,50:10497447,10559569:32768,0,54616 +h1,50:10497447,10559569:0,0,0 +h1,50:10497447,10559569:0,0,54616 +(1,50:10497447,10559569:0,0,0 +h1,50:10497447,10559569:0,0,0 +) +) +(1,50:10497447,11066876:311300,337875,0 +h1,50:10497447,11066876:0,0,0 +(1,50:10497447,11066876:278532,337875,0 +(1,50:10497447,11066876:278532,337875,0 +x1,50:10775979,11066876 +) +) +) +] +(1,50:10808747,10861364:538215,490372,0 +(1,50:10808747,10861364:538215,490372,0 +x1,50:11346962,10861364 +) +) +[1,50:11346962,11066876:311300,507307,0 +(1,50:11346962,10559569:32768,0,54616 +h1,50:11346962,10559569:0,0,0 +h1,50:11346962,10559569:0,0,54616 +(1,50:11346962,10559569:0,0,0 +h1,50:11346962,10559569:0,0,0 +) +) +(1,50:11346962,11066876:311300,337875,0 +h1,50:11346962,11066876:0,0,0 +(1,50:11346962,11066876:278532,337875,0 +(1,50:11346962,11066876:278532,337875,0 +x1,50:11625494,11066876 +) +) +) +] +) +g1,50:11817730,10861364 +x1,50:12375880,10861364 +g1,50:12535348,10861364 +h1,50:12535348,10861364:0,0,0 +(1,50:12535348,10861364:2085416,498346,205512 +(1,50:12535348,10861364:1056496,490372,0 +(1,50:12535348,10861364:1056496,490372,0 +x1,50:13591844,10861364 +) +) +[1,50:13591844,11066876:311300,507307,0 +(1,50:13591844,10559569:32768,0,54616 +h1,50:13591844,10559569:0,0,0 +h1,50:13591844,10559569:0,0,54616 +(1,50:13591844,10559569:0,0,0 +h1,50:13591844,10559569:0,0,0 +) +) +(1,50:13591844,11066876:311300,337875,0 +h1,50:13591844,11066876:0,0,0 +(1,50:13591844,11066876:278532,337875,0 +(1,50:13591844,11066876:278532,337875,0 +x1,50:13870376,11066876 +) +) +) +] +(1,50:13903144,10861364:717620,498346,0 +(1,50:13903144,10861364:717620,498346,0 +x1,50:14620764,10861364 +) +) +) +(1,50:14620764,10861364:2234061,946051,0 +h1,50:14620764,10861364:0,0,0 +g1,50:14820099,10861364 +(1,50:14820099,10861364:1835391,946051,0 +[1,50:14820099,10861364:1835391,946051,0 +(1,50:14820099,10351164:1835391,364089,167189 +k1,50:14990313,10351164:170214 +(1,50:14990313,10351164:1402119,364089,167189 +(1,50:14990313,10351164:1129056,364089,0 +(1,50:14990313,10351164:1129056,364089,0 +x1,50:16119369,10351164 +) +) +[1,50:16119369,10518353:273063,402389,0 +(1,50:16119369,10115964:32768,0,54612 +h1,50:16119369,10115964:0,0,0 +h1,50:16119369,10115964:0,0,54612 +(1,50:16119369,10115964:0,0,0 +h1,50:16119369,10115964:0,0,0 +) +) +(1,50:16119369,10518353:273063,253405,0 +h1,50:16119369,10518353:0,0,0 +(1,50:16119369,10518353:240295,253405,0 +(1,50:16119369,10518353:240295,253405,0 +x1,50:16359664,10518353 +) +) +) +] +) +k1,50:16655490,10351164:170214 +) +(1,50:14820099,10861364:1835391,263276,0 +$1,50:14820099,10861364 +(1,50:14820099,10861364:558150,0,0 +(1,50:14820099,10861364:558150,0,0 +$1,50:14820099,10861364 +(1,50:14820099,10861364:558150,418611,59802 +x1,50:15378249,10861364 +) +$1,50:15378249,10861364 +) +) +(1,50:15259382,10861364:398682,0,0 +$1,50:15259382,10861364 +(1,50:15179648,10861364:558150,0,0 +(1,50:15179648,10861364:558150,0,0 +$1,50:15179648,10861364 +(1,50:15179648,10861364:558150,418611,59802 +x1,50:15737798,10861364 +) +$1,50:15737798,10861364 +) +) +$1,50:15658064,10861364 +) +(1,50:15658064,10861364:398682,0,0 +(1,50:15578330,10861364:558150,0,0 +(1,50:15578330,10861364:558150,0,0 +(1,50:15578330,10861364:558150,418611,59802 +x1,50:16136480,10861364 +) +) +) +) +x1,50:16655490,10861364 +$1,50:16655490,10861364 +) +] +) +g1,50:16854825,10861364 +h1,50:16854825,10861364:0,0,0 +h1,50:16854825,10861364:0,0,0 +) +(1,50:16854825,10861364:3046892,490372,205512 +(1,50:16854825,10861364:518281,490372,0 +(1,50:16854825,10861364:518281,490372,0 +x1,50:17373106,10861364 +) +) +[1,50:17373106,11066876:311300,507307,0 +(1,50:17373106,10559569:32768,0,54616 +h1,50:17373106,10559569:0,0,0 +h1,50:17373106,10559569:0,0,54616 +(1,50:17373106,10559569:0,0,0 +h1,50:17373106,10559569:0,0,0 +) +) +(1,50:17373106,11066876:311300,337875,0 +h1,50:17373106,11066876:0,0,0 +(1,50:17373106,11066876:278532,337875,0 +(1,50:17373106,11066876:278532,337875,0 +x1,50:17651638,11066876 +) +) +) +] +(1,50:17684406,10861364:538215,490372,0 +(1,50:17684406,10861364:538215,490372,0 +x1,50:18222621,10861364 +) +) +[1,50:18222621,11066876:311300,507307,0 +(1,50:18222621,10559569:32768,0,54616 +h1,50:18222621,10559569:0,0,0 +h1,50:18222621,10559569:0,0,54616 +(1,50:18222621,10559569:0,0,0 +h1,50:18222621,10559569:0,0,0 +) +) +(1,50:18222621,11066876:311300,337875,0 +h1,50:18222621,11066876:0,0,0 +(1,50:18222621,11066876:278532,337875,0 +(1,50:18222621,11066876:278532,337875,0 +x1,50:18501153,11066876 +) +) +) +] +(1,50:18533921,10861364:1056496,490372,0 +(1,50:18533921,10861364:1056496,490372,0 +x1,50:19590417,10861364 +) +) +[1,50:19590417,11066876:311300,507307,0 +(1,50:19590417,10559569:32768,0,54616 +h1,50:19590417,10559569:0,0,0 +h1,50:19590417,10559569:0,0,54616 +(1,50:19590417,10559569:0,0,0 +h1,50:19590417,10559569:0,0,0 +) +) +(1,50:19590417,11066876:311300,337875,0 +h1,50:19590417,11066876:0,0,0 +(1,50:19590417,11066876:278532,337875,0 +(1,50:19590417,11066876:278532,337875,0 +x1,50:19868949,11066876 +) +) +) +] +) +g1,50:20061185,10861364 +x1,50:20619335,10861364 +g1,50:20778803,10861364 +h1,50:20778803,10861364:0,0,0 +(1,50:20778803,10861364:1255835,498346,0 +(1,50:20778803,10861364:1255835,498346,0 +x1,50:22034638,10861364 +) +) +$1,50:22034638,10861364 +k1,51:33572126,10861364:11537488 +g1,52:33572126,10861364 +) +(1,52:9979166,11752654:23592960,498346,139537 +x1,52:11334672,11752654 +x1,51:13451651,11752654 +g1,51:13690857,11752654 +x1,51:15909500,11752654 +x1,51:16268310,11752654 +x1,51:16607185,11752654 +g1,51:16846391,11752654 +x1,51:18522832,11752654 +g1,51:18762038,11752654 +x1,51:20994634,11752654 +g1,51:21233840,11752654 +x1,51:23053805,11752654 +g1,51:23293011,11752654 +x1,51:26526288,11752654 +g1,51:26765494,11752654 +x1,51:27363511,11752654 +g1,51:27602717,11752654 +x1,51:29081812,11752654 +k1,52:33572126,11752654:4490314 +g1,52:33572126,11752654 +) +(1,53:9979166,13618226:23592960,623900,267389 +r1,53:9979166,13618226:0,891289,267389 +x1,53:12343008,13618226 +g1,53:12618093,13618226 +x1,53:13137367,13618226 +x1,53:15356989,13618226 +x1,53:17592658,13618226 +r1,53:17592658,13618226:0,891289,267389 +k1,53:33572126,13618226:15979468 +g1,53:33572126,13618226 +) +(1,55:9979166,15360663:23592960,946051,205512 +$1,54:9979166,15360663 +(1,54:9979166,15360663:1679096,490372,205512 +(1,54:9979166,15360663:518281,490372,0 +(1,54:9979166,15360663:518281,490372,0 +x1,54:10497447,15360663 +) +) +[1,54:10497447,15566175:311300,507307,0 +(1,54:10497447,15058868:32768,0,54616 +h1,54:10497447,15058868:0,0,0 +h1,54:10497447,15058868:0,0,54616 +(1,54:10497447,15058868:0,0,0 +h1,54:10497447,15058868:0,0,0 +) +) +(1,54:10497447,15566175:311300,337875,0 +h1,54:10497447,15566175:0,0,0 +(1,54:10497447,15566175:278532,337875,0 +(1,54:10497447,15566175:278532,337875,0 +x1,54:10775979,15566175 +) +) +) +] +(1,54:10808747,15360663:538215,490372,0 +(1,54:10808747,15360663:538215,490372,0 +x1,54:11346962,15360663 +) +) +[1,54:11346962,15566175:311300,507307,0 +(1,54:11346962,15058868:32768,0,54616 +h1,54:11346962,15058868:0,0,0 +h1,54:11346962,15058868:0,0,54616 +(1,54:11346962,15058868:0,0,0 +h1,54:11346962,15058868:0,0,0 +) +) +(1,54:11346962,15566175:311300,337875,0 +h1,54:11346962,15566175:0,0,0 +(1,54:11346962,15566175:278532,337875,0 +(1,54:11346962,15566175:278532,337875,0 +x1,54:11625494,15566175 +) +) +) +] +) +g1,54:11817730,15360663 +x1,54:12375880,15360663 +g1,54:12535348,15360663 +h1,54:12535348,15360663:0,0,0 +(1,54:12535348,15360663:3161847,498346,205512 +(1,54:12535348,15360663:1056496,490372,0 +(1,54:12535348,15360663:1056496,490372,0 +x1,54:13591844,15360663 +) +) +[1,54:13591844,15566175:311300,507307,0 +(1,54:13591844,15058868:32768,0,54616 +h1,54:13591844,15058868:0,0,0 +h1,54:13591844,15058868:0,0,54616 +(1,54:13591844,15058868:0,0,0 +h1,54:13591844,15058868:0,0,0 +) +) +(1,54:13591844,15566175:311300,337875,0 +h1,54:13591844,15566175:0,0,0 +(1,54:13591844,15566175:278532,337875,0 +(1,54:13591844,15566175:278532,337875,0 +x1,54:13870376,15566175 +) +) +) +] +(1,54:13903144,15360663:1794051,498346,0 +(1,54:13903144,15360663:1794051,498346,0 +x1,54:15697195,15360663 +) +) +) +(1,54:15697195,15360663:2234061,946051,0 +h1,54:15697195,15360663:0,0,0 +g1,54:15896530,15360663 +(1,54:15896530,15360663:1835391,946051,0 +[1,54:15896530,15360663:1835391,946051,0 +(1,54:15896530,14850463:1835391,364089,167189 +k1,54:16066744,14850463:170214 +(1,54:16066744,14850463:1402119,364089,167189 +(1,54:16066744,14850463:1129056,364089,0 +(1,54:16066744,14850463:1129056,364089,0 +x1,54:17195800,14850463 +) +) +[1,54:17195800,15017652:273063,402389,0 +(1,54:17195800,14615263:32768,0,54612 +h1,54:17195800,14615263:0,0,0 +h1,54:17195800,14615263:0,0,54612 +(1,54:17195800,14615263:0,0,0 +h1,54:17195800,14615263:0,0,0 +) +) +(1,54:17195800,15017652:273063,253405,0 +h1,54:17195800,15017652:0,0,0 +(1,54:17195800,15017652:240295,253405,0 +(1,54:17195800,15017652:240295,253405,0 +x1,54:17436095,15017652 +) +) +) +] +) +k1,54:17731921,14850463:170214 +) +(1,54:15896530,15360663:1835391,263276,0 +$1,54:15896530,15360663 +(1,54:15896530,15360663:558150,0,0 +(1,54:15896530,15360663:558150,0,0 +$1,54:15896530,15360663 +(1,54:15896530,15360663:558150,418611,59802 +x1,54:16454680,15360663 +) +$1,54:16454680,15360663 +) +) +(1,54:16335813,15360663:398682,0,0 +$1,54:16335813,15360663 +(1,54:16256079,15360663:558150,0,0 +(1,54:16256079,15360663:558150,0,0 +$1,54:16256079,15360663 +(1,54:16256079,15360663:558150,418611,59802 +x1,54:16814229,15360663 +) +$1,54:16814229,15360663 +) +) +$1,54:16734495,15360663 +) +(1,54:16734495,15360663:398682,0,0 +(1,54:16654761,15360663:558150,0,0 +(1,54:16654761,15360663:558150,0,0 +(1,54:16654761,15360663:558150,418611,59802 +x1,54:17212911,15360663 +) +) +) +) +x1,54:17731921,15360663 +$1,54:17731921,15360663 +) +] +) +g1,54:17931256,15360663 +h1,54:17931256,15360663:0,0,0 +h1,54:17931256,15360663:0,0,0 +) +g1,54:18090724,15360663 +x1,54:18648874,15360663 +g1,54:18808342,15360663 +h1,54:18808342,15360663:0,0,0 +(1,54:18808342,15360663:4123323,490372,205512 +(1,54:18808342,15360663:518281,490372,0 +(1,54:18808342,15360663:518281,490372,0 +x1,54:19326623,15360663 +) +) +[1,54:19326623,15566175:311300,507307,0 +(1,54:19326623,15058868:32768,0,54616 +h1,54:19326623,15058868:0,0,0 +h1,54:19326623,15058868:0,0,54616 +(1,54:19326623,15058868:0,0,0 +h1,54:19326623,15058868:0,0,0 +) +) +(1,54:19326623,15566175:311300,337875,0 +h1,54:19326623,15566175:0,0,0 +(1,54:19326623,15566175:278532,337875,0 +(1,54:19326623,15566175:278532,337875,0 +x1,54:19605155,15566175 +) +) +) +] +(1,54:19637923,15360663:538215,490372,0 +(1,54:19637923,15360663:538215,490372,0 +x1,54:20176138,15360663 +) +) +[1,54:20176138,15566175:311300,507307,0 +(1,54:20176138,15058868:32768,0,54616 +h1,54:20176138,15058868:0,0,0 +h1,54:20176138,15058868:0,0,54616 +(1,54:20176138,15058868:0,0,0 +h1,54:20176138,15058868:0,0,0 +) +) +(1,54:20176138,15566175:311300,337875,0 +h1,54:20176138,15566175:0,0,0 +(1,54:20176138,15566175:278532,337875,0 +(1,54:20176138,15566175:278532,337875,0 +x1,54:20454670,15566175 +) +) +) +] +(1,54:20487438,15360663:2132927,490372,0 +(1,54:20487438,15360663:2132927,490372,0 +x1,54:22620365,15360663 +) +) +[1,54:22620365,15566175:311300,507307,0 +(1,54:22620365,15058868:32768,0,54616 +h1,54:22620365,15058868:0,0,0 +h1,54:22620365,15058868:0,0,54616 +(1,54:22620365,15058868:0,0,0 +h1,54:22620365,15058868:0,0,0 +) +) +(1,54:22620365,15566175:311300,337875,0 +h1,54:22620365,15566175:0,0,0 +(1,54:22620365,15566175:278532,337875,0 +(1,54:22620365,15566175:278532,337875,0 +x1,54:22898897,15566175 +) +) +) +] +) +g1,54:23091133,15360663 +x1,54:23649283,15360663 +g1,54:23808751,15360663 +h1,54:23808751,15360663:0,0,0 +(1,54:23808751,15360663:1255835,498346,0 +(1,54:23808751,15360663:1255835,498346,0 +x1,54:25064586,15360663 +) +) +$1,54:25064586,15360663 +k1,55:33572126,15360663:8507540 +g1,55:33572126,15360663 +) +(1,56:9979166,17226236:23592960,623900,267389 +r1,56:9979166,17226236:0,891289,267389 +x1,56:12470984,17226236 +r1,56:12470984,17226236:0,891289,267389 +k1,56:33572126,17226236:21101142 +g1,56:33572126,17226236 +) +(1,58:9979166,18962847:23592960,940225,205512 +$1,57:9979166,18962847 +(1,57:9979166,18962847:1679096,490372,205512 +(1,57:9979166,18962847:518281,490372,0 +(1,57:9979166,18962847:518281,490372,0 +x1,57:10497447,18962847 +) +) +[1,57:10497447,19168359:311300,507307,0 +(1,57:10497447,18661052:32768,0,54616 +h1,57:10497447,18661052:0,0,0 +h1,57:10497447,18661052:0,0,54616 +(1,57:10497447,18661052:0,0,0 +h1,57:10497447,18661052:0,0,0 +) +) +(1,57:10497447,19168359:311300,337875,0 +h1,57:10497447,19168359:0,0,0 +(1,57:10497447,19168359:278532,337875,0 +(1,57:10497447,19168359:278532,337875,0 +x1,57:10775979,19168359 +) +) +) +] +(1,57:10808747,18962847:538215,490372,0 +(1,57:10808747,18962847:538215,490372,0 +x1,57:11346962,18962847 +) +) +[1,57:11346962,19168359:311300,507307,0 +(1,57:11346962,18661052:32768,0,54616 +h1,57:11346962,18661052:0,0,0 +h1,57:11346962,18661052:0,0,54616 +(1,57:11346962,18661052:0,0,0 +h1,57:11346962,18661052:0,0,0 +) +) +(1,57:11346962,19168359:311300,337875,0 +h1,57:11346962,19168359:0,0,0 +(1,57:11346962,19168359:278532,337875,0 +(1,57:11346962,19168359:278532,337875,0 +x1,57:11625494,19168359 +) +) +) +] +) +g1,57:11817730,18962847 +x1,57:12375880,18962847 +g1,57:12535348,18962847 +h1,57:12535348,18962847:0,0,0 +(1,57:12535348,18962847:1945880,490372,205512 +(1,57:12535348,18962847:1634580,490372,0 +(1,57:12535348,18962847:1634580,490372,0 +x1,57:14169928,18962847 +) +) +[1,57:14169928,19168359:311300,507307,0 +(1,57:14169928,18661052:32768,0,54616 +h1,57:14169928,18661052:0,0,0 +h1,57:14169928,18661052:0,0,54616 +(1,57:14169928,18661052:0,0,0 +h1,57:14169928,18661052:0,0,0 +) +) +(1,57:14169928,19168359:311300,337875,0 +h1,57:14169928,19168359:0,0,0 +(1,57:14169928,19168359:278532,337875,0 +(1,57:14169928,19168359:278532,337875,0 +x1,57:14448460,19168359 +) +) +) +] +) +(1,57:14481228,18962847:2538072,940225,0 +h1,57:14481228,18962847:0,0,0 +g1,57:14680563,18962847 +(1,57:14680563,18962847:2139402,940225,0 +[1,57:14680563,18962847:2139402,940225,0 +(1,57:14680563,18452647:2139402,358263,167189 +k1,57:14850777,18452647:170214 +(1,57:14850777,18452647:1706130,358263,167189 +(1,57:14850777,18452647:417252,358263,0 +(1,57:14850777,18452647:417252,358263,0 +x1,57:15268029,18452647 +) +) +[1,57:15268029,18619836:273063,402389,0 +(1,57:15268029,18217447:32768,0,54612 +h1,57:15268029,18217447:0,0,0 +h1,57:15268029,18217447:0,0,54612 +(1,57:15268029,18217447:0,0,0 +h1,57:15268029,18217447:0,0,0 +) +) +(1,57:15268029,18619836:273063,253405,0 +h1,57:15268029,18619836:0,0,0 +(1,57:15268029,18619836:240295,253405,0 +(1,57:15268029,18619836:240295,253405,0 +x1,57:15508324,18619836 +) +) +) +] +(1,57:15541092,18452647:742752,358263,0 +(1,57:15541092,18452647:742752,358263,0 +x1,57:16283844,18452647 +) +) +[1,57:16283844,18619836:273063,402389,0 +(1,57:16283844,18217447:32768,0,54612 +h1,57:16283844,18217447:0,0,0 +h1,57:16283844,18217447:0,0,54612 +(1,57:16283844,18217447:0,0,0 +h1,57:16283844,18217447:0,0,0 +) +) +(1,57:16283844,18619836:273063,253405,0 +h1,57:16283844,18619836:0,0,0 +(1,57:16283844,18619836:240295,253405,0 +(1,57:16283844,18619836:240295,253405,0 +x1,57:16524139,18619836 +) +) +) +] +) +k1,57:16819965,18452647:170214 +) +(1,57:14680563,18962847:2139402,263276,0 +$1,57:14680563,18962847 +(1,57:14680563,18962847:558150,0,0 +(1,57:14680563,18962847:558150,0,0 +$1,57:14680563,18962847 +(1,57:14680563,18962847:558150,418611,59802 +x1,57:15238713,18962847 +) +$1,57:15238713,18962847 +) +) +(1,57:15072510,18962847:398682,0,0 +$1,57:15072510,18962847 +(1,57:14992776,18962847:558150,0,0 +(1,57:14992776,18962847:558150,0,0 +$1,57:14992776,18962847 +(1,57:14992776,18962847:558150,418611,59802 +x1,57:15550926,18962847 +) +$1,57:15550926,18962847 +) +) +$1,57:15471192,18962847 +) +(1,57:15471192,18962847:398682,0,0 +(1,57:15391458,18962847:558150,0,0 +(1,57:15391458,18962847:558150,0,0 +(1,57:15391458,18962847:558150,418611,59802 +x1,57:15949608,18962847 +) +) +) +) +(1,57:15869874,18962847:398682,0,0 +(1,57:15790140,18962847:558150,0,0 +(1,57:15790140,18962847:558150,0,0 +(1,57:15790140,18962847:558150,418611,59802 +x1,57:16348290,18962847 +) +) +) +) +x1,57:16819965,18962847 +$1,57:16819965,18962847 +) +] +) +g1,57:17019300,18962847 +h1,57:17019300,18962847:0,0,0 +h1,57:17019300,18962847:0,0,0 +) +(1,57:17019300,18962847:3086761,490372,205512 +(1,57:17019300,18962847:518281,490372,0 +(1,57:17019300,18962847:518281,490372,0 +x1,57:17537581,18962847 +) +) +[1,57:17537581,19168359:311300,507307,0 +(1,57:17537581,18661052:32768,0,54616 +h1,57:17537581,18661052:0,0,0 +h1,57:17537581,18661052:0,0,54616 +(1,57:17537581,18661052:0,0,0 +h1,57:17537581,18661052:0,0,0 +) +) +(1,57:17537581,19168359:311300,337875,0 +h1,57:17537581,19168359:0,0,0 +(1,57:17537581,19168359:278532,337875,0 +(1,57:17537581,19168359:278532,337875,0 +x1,57:17816113,19168359 +) +) +) +] +(1,57:17848881,18962847:538215,490372,0 +(1,57:17848881,18962847:538215,490372,0 +x1,57:18387096,18962847 +) +) +[1,57:18387096,19168359:311300,507307,0 +(1,57:18387096,18661052:32768,0,54616 +h1,57:18387096,18661052:0,0,0 +h1,57:18387096,18661052:0,0,54616 +(1,57:18387096,18661052:0,0,0 +h1,57:18387096,18661052:0,0,0 +) +) +(1,57:18387096,19168359:311300,337875,0 +h1,57:18387096,19168359:0,0,0 +(1,57:18387096,19168359:278532,337875,0 +(1,57:18387096,19168359:278532,337875,0 +x1,57:18665628,19168359 +) +) +) +] +(1,57:18698396,18962847:1096365,490372,0 +(1,57:18698396,18962847:1096365,490372,0 +x1,57:19794761,18962847 +) +) +[1,57:19794761,19168359:311300,507307,0 +(1,57:19794761,18661052:32768,0,54616 +h1,57:19794761,18661052:0,0,0 +h1,57:19794761,18661052:0,0,54616 +(1,57:19794761,18661052:0,0,0 +h1,57:19794761,18661052:0,0,0 +) +) +(1,57:19794761,19168359:311300,337875,0 +h1,57:19794761,19168359:0,0,0 +(1,57:19794761,19168359:278532,337875,0 +(1,57:19794761,19168359:278532,337875,0 +x1,57:20073293,19168359 +) +) +) +] +) +g1,57:20265529,18962847 +x1,57:20823679,18962847 +g1,57:20983147,18962847 +h1,57:20983147,18962847:0,0,0 +(1,57:20983147,18962847:1407665,490372,205512 +(1,57:20983147,18962847:538215,490372,0 +(1,57:20983147,18962847:538215,490372,0 +x1,57:21521362,18962847 +) +) +[1,57:21521362,19168359:311300,507307,0 +(1,57:21521362,18661052:32768,0,54616 +h1,57:21521362,18661052:0,0,0 +h1,57:21521362,18661052:0,0,54616 +(1,57:21521362,18661052:0,0,0 +h1,57:21521362,18661052:0,0,0 +) +) +(1,57:21521362,19168359:311300,337875,0 +h1,57:21521362,19168359:0,0,0 +(1,57:21521362,19168359:278532,337875,0 +(1,57:21521362,19168359:278532,337875,0 +x1,57:21799894,19168359 +) +) +) +] +(1,57:21832662,18962847:558150,490372,0 +(1,57:21832662,18962847:558150,490372,0 +x1,57:22390812,18962847 +) +) +) +$1,57:22390812,18962847 +k1,58:33572126,18962847:11181314 +g1,58:33572126,18962847 +) +(1,59:9979166,20828419:23592960,623900,267389 +r1,59:9979166,20828419:0,891289,267389 +x1,59:13204544,20828419 +r1,59:13204544,20828419:0,891289,267389 +k1,59:33572126,20828419:20367582 +g1,59:33572126,20828419 +) +(1,61:9979166,22565030:23592960,940225,205512 +$1,60:9979166,22565030 +(1,60:9979166,22565030:1679096,490372,205512 +(1,60:9979166,22565030:518281,490372,0 +(1,60:9979166,22565030:518281,490372,0 +x1,60:10497447,22565030 +) +) +[1,60:10497447,22770542:311300,507307,0 +(1,60:10497447,22263235:32768,0,54616 +h1,60:10497447,22263235:0,0,0 +h1,60:10497447,22263235:0,0,54616 +(1,60:10497447,22263235:0,0,0 +h1,60:10497447,22263235:0,0,0 +) +) +(1,60:10497447,22770542:311300,337875,0 +h1,60:10497447,22770542:0,0,0 +(1,60:10497447,22770542:278532,337875,0 +(1,60:10497447,22770542:278532,337875,0 +x1,60:10775979,22770542 +) +) +) +] +(1,60:10808747,22565030:538215,490372,0 +(1,60:10808747,22565030:538215,490372,0 +x1,60:11346962,22565030 +) +) +[1,60:11346962,22770542:311300,507307,0 +(1,60:11346962,22263235:32768,0,54616 +h1,60:11346962,22263235:0,0,0 +h1,60:11346962,22263235:0,0,54616 +(1,60:11346962,22263235:0,0,0 +h1,60:11346962,22263235:0,0,0 +) +) +(1,60:11346962,22770542:311300,337875,0 +h1,60:11346962,22770542:0,0,0 +(1,60:11346962,22770542:278532,337875,0 +(1,60:11346962,22770542:278532,337875,0 +x1,60:11625494,22770542 +) +) +) +] +) +g1,60:11817730,22565030 +x1,60:12375880,22565030 +g1,60:12535348,22565030 +h1,60:12535348,22565030:0,0,0 +(1,60:12535348,22565030:2117643,490372,205512 +(1,60:12535348,22565030:538215,490372,0 +(1,60:12535348,22565030:538215,490372,0 +x1,60:13073563,22565030 +) +) +[1,60:13073563,22770542:311300,507307,0 +(1,60:13073563,22263235:32768,0,54616 +h1,60:13073563,22263235:0,0,0 +h1,60:13073563,22263235:0,0,54616 +(1,60:13073563,22263235:0,0,0 +h1,60:13073563,22263235:0,0,0 +) +) +(1,60:13073563,22770542:311300,337875,0 +h1,60:13073563,22770542:0,0,0 +(1,60:13073563,22770542:278532,337875,0 +(1,60:13073563,22770542:278532,337875,0 +x1,60:13352095,22770542 +) +) +) +] +(1,60:13384863,22565030:956828,490372,0 +(1,60:13384863,22565030:956828,490372,0 +x1,60:14341691,22565030 +) +) +[1,60:14341691,22770542:311300,507307,0 +(1,60:14341691,22263235:32768,0,54616 +h1,60:14341691,22263235:0,0,0 +h1,60:14341691,22263235:0,0,54616 +(1,60:14341691,22263235:0,0,0 +h1,60:14341691,22263235:0,0,0 +) +) +(1,60:14341691,22770542:311300,337875,0 +h1,60:14341691,22770542:0,0,0 +(1,60:14341691,22770542:278532,337875,0 +(1,60:14341691,22770542:278532,337875,0 +x1,60:14620223,22770542 +) +) +) +] +) +(1,60:14652991,22565030:2538072,940225,0 +h1,60:14652991,22565030:0,0,0 +g1,60:14852326,22565030 +(1,60:14852326,22565030:2139402,940225,0 +[1,60:14852326,22565030:2139402,940225,0 +(1,60:14852326,22054830:2139402,358263,167189 +k1,60:15022540,22054830:170214 +(1,60:15022540,22054830:1706130,358263,167189 +(1,60:15022540,22054830:417252,358263,0 +(1,60:15022540,22054830:417252,358263,0 +x1,60:15439792,22054830 +) +) +[1,60:15439792,22222019:273063,402389,0 +(1,60:15439792,21819630:32768,0,54612 +h1,60:15439792,21819630:0,0,0 +h1,60:15439792,21819630:0,0,54612 +(1,60:15439792,21819630:0,0,0 +h1,60:15439792,21819630:0,0,0 +) +) +(1,60:15439792,22222019:273063,253405,0 +h1,60:15439792,22222019:0,0,0 +(1,60:15439792,22222019:240295,253405,0 +(1,60:15439792,22222019:240295,253405,0 +x1,60:15680087,22222019 +) +) +) +] +(1,60:15712855,22054830:742752,358263,0 +(1,60:15712855,22054830:742752,358263,0 +x1,60:16455607,22054830 +) +) +[1,60:16455607,22222019:273063,402389,0 +(1,60:16455607,21819630:32768,0,54612 +h1,60:16455607,21819630:0,0,0 +h1,60:16455607,21819630:0,0,54612 +(1,60:16455607,21819630:0,0,0 +h1,60:16455607,21819630:0,0,0 +) +) +(1,60:16455607,22222019:273063,253405,0 +h1,60:16455607,22222019:0,0,0 +(1,60:16455607,22222019:240295,253405,0 +(1,60:16455607,22222019:240295,253405,0 +x1,60:16695902,22222019 +) +) +) +] +) +k1,60:16991728,22054830:170214 +) +(1,60:14852326,22565030:2139402,263276,0 +$1,60:14852326,22565030 +(1,60:14852326,22565030:558150,0,0 +(1,60:14852326,22565030:558150,0,0 +$1,60:14852326,22565030 +(1,60:14852326,22565030:558150,418611,59802 +x1,60:15410476,22565030 +) +$1,60:15410476,22565030 +) +) +(1,60:15244273,22565030:398682,0,0 +$1,60:15244273,22565030 +(1,60:15164539,22565030:558150,0,0 +(1,60:15164539,22565030:558150,0,0 +$1,60:15164539,22565030 +(1,60:15164539,22565030:558150,418611,59802 +x1,60:15722689,22565030 +) +$1,60:15722689,22565030 +) +) +$1,60:15642955,22565030 +) +(1,60:15642955,22565030:398682,0,0 +(1,60:15563221,22565030:558150,0,0 +(1,60:15563221,22565030:558150,0,0 +(1,60:15563221,22565030:558150,418611,59802 +x1,60:16121371,22565030 +) +) +) +) +(1,60:16041637,22565030:398682,0,0 +(1,60:15961903,22565030:558150,0,0 +(1,60:15961903,22565030:558150,0,0 +(1,60:15961903,22565030:558150,418611,59802 +x1,60:16520053,22565030 +) +) +) +) +x1,60:16991728,22565030 +$1,60:16991728,22565030 +) +] +) +g1,60:17191063,22565030 +h1,60:17191063,22565030:0,0,0 +h1,60:17191063,22565030:0,0,0 +) +(1,60:17191063,22565030:3485439,490372,205512 +(1,60:17191063,22565030:518281,490372,0 +(1,60:17191063,22565030:518281,490372,0 +x1,60:17709344,22565030 +) +) +[1,60:17709344,22770542:311300,507307,0 +(1,60:17709344,22263235:32768,0,54616 +h1,60:17709344,22263235:0,0,0 +h1,60:17709344,22263235:0,0,54616 +(1,60:17709344,22263235:0,0,0 +h1,60:17709344,22263235:0,0,0 +) +) +(1,60:17709344,22770542:311300,337875,0 +h1,60:17709344,22770542:0,0,0 +(1,60:17709344,22770542:278532,337875,0 +(1,60:17709344,22770542:278532,337875,0 +x1,60:17987876,22770542 +) +) +) +] +(1,60:18020644,22565030:538215,490372,0 +(1,60:18020644,22565030:538215,490372,0 +x1,60:18558859,22565030 +) +) +[1,60:18558859,22770542:311300,507307,0 +(1,60:18558859,22263235:32768,0,54616 +h1,60:18558859,22263235:0,0,0 +h1,60:18558859,22263235:0,0,54616 +(1,60:18558859,22263235:0,0,0 +h1,60:18558859,22263235:0,0,0 +) +) +(1,60:18558859,22770542:311300,337875,0 +h1,60:18558859,22770542:0,0,0 +(1,60:18558859,22770542:278532,337875,0 +(1,60:18558859,22770542:278532,337875,0 +x1,60:18837391,22770542 +) +) +) +] +(1,60:18870159,22565030:956828,490372,0 +(1,60:18870159,22565030:956828,490372,0 +x1,60:19826987,22565030 +) +) +[1,60:19826987,22770542:311300,507307,0 +(1,60:19826987,22263235:32768,0,54616 +h1,60:19826987,22263235:0,0,0 +h1,60:19826987,22263235:0,0,54616 +(1,60:19826987,22263235:0,0,0 +h1,60:19826987,22263235:0,0,0 +) +) +(1,60:19826987,22770542:311300,337875,0 +h1,60:19826987,22770542:0,0,0 +(1,60:19826987,22770542:278532,337875,0 +(1,60:19826987,22770542:278532,337875,0 +x1,60:20105519,22770542 +) +) +) +] +(1,60:20138287,22565030:538215,490372,0 +(1,60:20138287,22565030:538215,490372,0 +x1,60:20676502,22565030 +) +) +) +g1,60:20835970,22565030 +x1,60:21394120,22565030 +g1,60:21553588,22565030 +h1,60:21553588,22565030:0,0,0 +(1,60:21553588,22565030:1407665,490372,205512 +(1,60:21553588,22565030:538215,490372,0 +(1,60:21553588,22565030:538215,490372,0 +x1,60:22091803,22565030 +) +) +[1,60:22091803,22770542:311300,507307,0 +(1,60:22091803,22263235:32768,0,54616 +h1,60:22091803,22263235:0,0,0 +h1,60:22091803,22263235:0,0,54616 +(1,60:22091803,22263235:0,0,0 +h1,60:22091803,22263235:0,0,0 +) +) +(1,60:22091803,22770542:311300,337875,0 +h1,60:22091803,22770542:0,0,0 +(1,60:22091803,22770542:278532,337875,0 +(1,60:22091803,22770542:278532,337875,0 +x1,60:22370335,22770542 +) +) +) +] +(1,60:22403103,22565030:558150,490372,0 +(1,60:22403103,22565030:558150,490372,0 +x1,60:22961253,22565030 +) +) +) +$1,60:22961253,22565030 +k1,61:33572126,22565030:10610873 +g1,61:33572126,22565030 +) +(1,62:9979166,24456817:23592960,642250,275254 +g1,62:12682526,24456817 +r1,62:12682526,24456817:0,917504,275254 +(1,62:12682526,24456817:0,642250,275254 +k1,62:9979166,24456817:-2703360 +(1,62:9979166,24456817:2703360,642250,275254 +x1,62:11797790,24456817 +g1,62:12682526,24456817 +r1,62:12682526,24456817:0,917504,275254 +g1,62:12682526,24456817 +) +) +x1,62:16526214,24456817 +g1,62:16821126,24456817 +x1,62:19115342,24456817 +x1,62:19742030,24456817 +g1,62:20036942,24456817 +x1,62:22340169,24456817 +r1,62:22340169,24456817:0,917504,275254 +k1,62:33572126,24456817:11231957 +g1,62:33572126,24456817 +) +(1,64:9979166,25811568:23592960,498346,0 +x1,64:11254935,25811568 +x1,63:12470902,25811568 +k1,64:33572126,25811568:21101224 +g1,64:33572126,25811568 +) +(1,64:9979166,26702858:23592960,0,0 +g1,64:9979166,26702858 +) +(1,66:16202423,27594148:11146447,836824,205512 +h1,66:16202423,27594148:0,0,0 +(1,66:16202423,27594148:11146447,836824,205512 +(1,66:16202423,27594148:1679096,490372,205512 +x1,66:16720704,27594148 +[1,66:16720704,27799660:311300,507307,0 +(1,66:16720704,27292353:32768,0,54616 +h1,65:16720704,27292353:0,0,0 +h1,65:16720704,27292353:0,0,54616 +h1,66:16720704,27292353:0,0,0 +) +(1,66:16720704,27799660:311300,337875,0 +h1,65:16720704,27799660:0,0,0 +x1,65:16999236,27799660 +) +] +x1,66:17570219,27594148 +[1,66:17570219,27799660:311300,507307,0 +(1,66:17570219,27292353:32768,0,54616 +h1,65:17570219,27292353:0,0,0 +h1,65:17570219,27292353:0,0,54616 +h1,66:17570219,27292353:0,0,0 +) +(1,66:17570219,27799660:311300,337875,0 +h1,65:17570219,27799660:0,0,0 +x1,65:17848751,27799660 +) +] +) +g1,66:18040987,27594148 +x1,66:18599137,27594148 +g1,66:18758605,27594148 +h1,66:18758605,27594148:0,0,0 +(1,66:18758605,27594148:1028920,498346,205512 +(1,66:18758605,27594148:717620,498346,0 +x1,66:19476225,27594148 +) +[1,66:19476225,27799660:311300,507307,0 +(1,66:19476225,27292353:32768,0,54616 +h1,65:19476225,27292353:0,0,0 +h1,65:19476225,27292353:0,0,54616 +h1,66:19476225,27292353:0,0,0 +) +(1,66:19476225,27799660:311300,337875,0 +h1,65:19476225,27799660:0,0,0 +x1,65:19754757,27799660 +) +] +) +(1,66:19787525,27594148:3031708,836824,0 +h1,66:19787525,27594148:0,0,0 +g1,66:19986860,27594148 +(1,66:19986860,27594148:2633038,836824,0 +[1,66:19986860,27594148:2633038,836824,0 +(1,66:19986860,27187349:2633038,358263,0 +k1,66:20157074,27187349:170214 +(1,66:20157074,27187349:2199766,358263,0 +(1,65:20157074,27187349:2199766,358263,0 +x1,65:21336648,27187349 +g1,65:21522336,27187349 +x1,65:22356840,27187349 +) +) +k1,65:22356840,27187349:92844 +k1,66:22619898,27187349:170214 +) +(1,65:19986860,27594148:2633038,263276,0 +$1,65:19986860,27594148 +(1,65:19986860,27594148:558150,0,0 +(1,65:19986860,27594148:558150,0,0 +$1,65:19986860,27594148 +(1,65:19986860,27594148:558150,418611,59802 +x1,65:20545010,27594148 +) +$1,65:20545010,27594148 +) +) +(1,65:20426284,27594148:398682,0,0 +$1,65:20426284,27594148 +(1,65:20346550,27594148:558150,0,0 +(1,65:20346550,27594148:558150,0,0 +$1,65:20346550,27594148 +(1,65:20346550,27594148:558150,418611,59802 +x1,65:20904700,27594148 +) +$1,65:20904700,27594148 +) +) +$1,65:20824966,27594148 +) +(1,65:20824966,27594148:398682,0,0 +(1,65:20745232,27594148:558150,0,0 +(1,65:20745232,27594148:558150,0,0 +(1,65:20745232,27594148:558150,418611,59802 +x1,65:21303382,27594148 +) +) +) +) +(1,65:21223648,27594148:398682,0,0 +(1,65:21143914,27594148:558150,0,0 +(1,65:21143914,27594148:558150,0,0 +(1,65:21143914,27594148:558150,418611,59802 +x1,65:21702064,27594148 +) +) +) +) +(1,65:21622330,27594148:398682,0,0 +(1,65:21542596,27594148:558150,0,0 +(1,65:21542596,27594148:558150,0,0 +(1,65:21542596,27594148:558150,418611,59802 +x1,65:22100746,27594148 +) +) +) +) +x1,65:22619898,27594148 +$1,65:22619898,27594148 +) +] +) +g1,66:22819233,27594148 +h1,66:22819233,27594148:0,0,0 +h1,66:22819233,27594148:0,0,0 +) +(1,66:22819233,27594148:2396716,498346,205512 +x1,66:23337514,27594148 +[1,66:23337514,27799660:311300,507307,0 +(1,66:23337514,27292353:32768,0,54616 +h1,65:23337514,27292353:0,0,0 +h1,65:23337514,27292353:0,0,54616 +h1,66:23337514,27292353:0,0,0 +) +(1,66:23337514,27799660:311300,337875,0 +h1,65:23337514,27799660:0,0,0 +x1,65:23616046,27799660 +) +] +x1,66:24187029,27594148 +[1,66:24187029,27799660:311300,507307,0 +(1,66:24187029,27292353:32768,0,54616 +h1,65:24187029,27292353:0,0,0 +h1,65:24187029,27292353:0,0,54616 +h1,66:24187029,27292353:0,0,0 +) +(1,66:24187029,27799660:311300,337875,0 +h1,65:24187029,27799660:0,0,0 +x1,65:24465561,27799660 +) +] +(1,66:24498329,27594148:717620,498346,0 +x1,66:25215949,27594148 +) +) +g1,66:25375417,27594148 +x1,66:25933567,27594148 +g1,66:26093035,27594148 +h1,66:26093035,27594148:0,0,0 +(1,66:26093035,27594148:1255835,498346,0 +x1,66:27348870,27594148 +) +) +) +(1,68:9979166,28816343:23592960,498346,139537 +x1,68:12211762,28816343 +g1,67:12450968,28816343 +x1,67:13746672,28816343 +x1,67:15863651,28816343 +g1,67:16102857,28816343 +x1,67:18122161,28816343 +k1,68:33572126,28816343:15449965 +g1,68:33572126,28816343 +) +(1,75:9979166,30388980:24807615,836824,267389 +g1,75:9979166,30388980 +(1,75:9979166,30388980:3784441,836824,267389 +k1,75:12734687,30388980:2755521 +(1,75:12734687,30388980:0,623900,267389 +[1,75:12734687,30388980:0,623900,267389 +(1,21:12734687,30388980:0,623900,267389 +r1,75:12734687,30388980:0,891289,267389 +) +] +) +(1,75:12734687,30388980:1028920,498346,205512 +$1,75:12734687,30388980 +(1,75:12734687,30388980:1028920,498346,205512 +h1,75:12734687,30388980:0,0,0 +(1,75:12734687,30388980:1028920,498346,205512 +(1,75:12734687,30388980:717620,498346,0 +x1,75:13452307,30388980 +) +[1,75:13452307,30594492:311300,507307,0 +(1,75:13452307,30087185:32768,0,54616 +h1,75:13452307,30087185:0,0,0 +h1,75:13452307,30087185:0,0,54616 +h1,75:13452307,30087185:0,0,0 +) +(1,75:13452307,30594492:311300,337875,0 +h1,75:13452307,30594492:0,0,0 +x1,75:13730839,30594492 +) +] +) +) +$1,75:13763607,30388980 +) +) +g1,75:13763607,30388980 +(1,75:13763607,30388980:7175566,836824,267389 +(1,75:13763607,30388980:5862320,836824,0 +$1,75:13763607,30388980 +(1,75:13763607,30388980:5862320,836824,0 +h1,75:13763607,30388980:0,0,0 +(1,75:13763607,30388980:4427078,836824,0 +(1,75:13763607,30388980:3031708,836824,0 +h1,75:13763607,30388980:0,0,0 +g1,75:13962942,30388980 +(1,75:13962942,30388980:2633038,836824,0 +[1,75:13962942,30388980:2633038,836824,0 +(1,75:13962942,29982181:2633038,358263,0 +k1,75:14133156,29982181:170214 +(1,75:14133156,29982181:2199766,358263,0 +(1,75:14133156,29982181:2199766,358263,0 +x1,75:15312730,29982181 +g1,75:15498418,29982181 +x1,75:16332922,29982181 +) +) +k1,75:16595980,29982181:170214 +) +(1,75:13962942,30388980:2633038,263276,0 +$1,75:13962942,30388980 +(1,75:13962942,30388980:558150,0,0 +(1,75:13962942,30388980:558150,0,0 +$1,75:13962942,30388980 +(1,75:13962942,30388980:558150,418611,59802 +x1,75:14521092,30388980 +) +$1,75:14521092,30388980 +) +) +(1,75:14402366,30388980:398682,0,0 +$1,75:14402366,30388980 +(1,75:14322632,30388980:558150,0,0 +(1,75:14322632,30388980:558150,0,0 +$1,75:14322632,30388980 +(1,75:14322632,30388980:558150,418611,59802 +x1,75:14880782,30388980 +) +$1,75:14880782,30388980 +) +) +$1,75:14801048,30388980 +) +(1,75:14801048,30388980:398682,0,0 +(1,75:14721314,30388980:558150,0,0 +(1,75:14721314,30388980:558150,0,0 +(1,75:14721314,30388980:558150,418611,59802 +x1,75:15279464,30388980 +) +) +) +) +(1,75:15199730,30388980:398682,0,0 +(1,75:15119996,30388980:558150,0,0 +(1,75:15119996,30388980:558150,0,0 +(1,75:15119996,30388980:558150,418611,59802 +x1,75:15678146,30388980 +) +) +) +) +(1,75:15598412,30388980:398682,0,0 +(1,75:15518678,30388980:558150,0,0 +(1,75:15518678,30388980:558150,0,0 +(1,75:15518678,30388980:558150,418611,59802 +x1,75:16076828,30388980 +) +) +) +) +x1,75:16595980,30388980 +$1,75:16595980,30388980 +) +] +) +g1,75:16795315,30388980 +h1,75:16795315,30388980:0,0,0 +h1,75:16795315,30388980:0,0,0 +) +(1,75:16795315,30388980:478411,462465,0 +x1,75:17154125,30388980 +g1,75:17273726,30388980 +) +(1,75:17273726,30388980:916959,498346,0 +(1,75:17273726,30388980:199339,318942,0 +(1,75:17273726,30388980:199339,318942,0 +$1,75:17273726,30388980 +x1,75:17473065,30388980 +$1,75:17473065,30388980 +) +) +h1,75:17473065,30388980:0,0,0 +(1,75:17473065,30388980:717620,498346,0 +x1,75:18190685,30388980 +) +) +) +g1,75:19625927,30388980 +) +$1,75:19625927,30388980 +) +k1,75:20939173,30388980:1313246 +) +g1,75:21594533,30388980 +(1,75:21594533,30388980:13192248,836824,267389 +k1,75:30632558,30388980:9038025 +(1,75:30632558,30388980:0,623900,267389 +[1,75:30632558,30388980:0,623900,267389 +(1,21:30632558,30388980:0,623900,267389 +r1,75:30632558,30388980:0,891289,267389 +) +] +) +(1,75:30632558,30388980:4154223,498346,139537 +$1,75:30632558,30388980 +(1,75:30632558,30388980:4154223,498346,139537 +(1,75:30632558,30388980:4154223,498346,139537 +x1,75:32426609,30388980 +g1,75:32665815,30388980 +x1,75:34786781,30388980 +) +) +$1,75:34786781,30388980 +) +) +g1,75:34786781,30388980 +(1,75:34786781,30388980:0,836824,267389 +(1,75:34786781,30388980:0,0,0 +$1,75:34786781,30388980 +h1,75:34786781,30388980:0,0,0 +$1,75:34786781,30388980 +) +g1,75:34786781,30388980 +) +g1,75:35442141,30388980 +(1,75:35442141,30388980:-655360,836824,267389 +) +g1,75:34786781,30388980 +) +(1,75:9979166,31476878:24807615,623900,267389 +g1,75:9979166,31476878 +(1,75:9979166,31476878:3784441,623900,267389 +k1,75:10290466,31476878:311300 +(1,75:10290466,31476878:0,623900,267389 +[1,75:10290466,31476878:0,623900,267389 +(1,21:10290466,31476878:0,623900,267389 +r1,75:10290466,31476878:0,891289,267389 +) +] +) +(1,75:10290466,31476878:3473141,498346,205512 +$1,75:10290466,31476878 +(1,75:10290466,31476878:3473141,498346,205512 +h1,75:10290466,31476878:0,0,0 +(1,75:10290466,31476878:3473141,498346,205512 +(1,75:10290466,31476878:916959,498346,0 +(1,75:10290466,31476878:199339,318942,0 +(1,75:10290466,31476878:199339,318942,0 +$1,75:10290466,31476878 +x1,75:10489805,31476878 +$1,75:10489805,31476878 +) +) +h1,75:10489805,31476878:0,0,0 +(1,75:10489805,31476878:717620,498346,0 +x1,75:11207425,31476878 +) +) +g1,75:11366893,31476878 +x1,75:11925043,31476878 +g1,75:12084511,31476878 +h1,75:12084511,31476878:0,0,0 +(1,75:12084511,31476878:1679096,490372,205512 +x1,75:12602792,31476878 +[1,75:12602792,31682390:311300,507307,0 +(1,75:12602792,31175083:32768,0,54616 +h1,75:12602792,31175083:0,0,0 +h1,75:12602792,31175083:0,0,54616 +h1,75:12602792,31175083:0,0,0 +) +(1,75:12602792,31682390:311300,337875,0 +h1,75:12602792,31682390:0,0,0 +x1,75:12881324,31682390 +) +] +x1,75:13452307,31476878 +[1,75:13452307,31682390:311300,507307,0 +(1,75:13452307,31175083:32768,0,54616 +h1,75:13452307,31175083:0,0,0 +h1,75:13452307,31175083:0,0,54616 +h1,75:13452307,31175083:0,0,0 +) +(1,75:13452307,31682390:311300,337875,0 +h1,75:13452307,31682390:0,0,0 +x1,75:13730839,31682390 +) +] +) +) +) +$1,75:13763607,31476878 +) +) +g1,75:13763607,31476878 +(1,75:13763607,31476878:7175566,623900,267389 +(1,75:13763607,31476878:6996161,498346,205512 +$1,75:13763607,31476878 +(1,75:13763607,31476878:6996161,498346,205512 +h1,75:13763607,31476878:0,0,0 +(1,75:13763607,31476878:5560919,498346,205512 +(1,75:13763607,31476878:1549563,478561,0 +h1,75:13763607,31476878:0,0,0 +g1,75:13962942,31476878 +(1,75:13962942,31476878:1150893,478561,0 +[1,75:13962942,31476878:1150893,478561,0 +(1,75:13962942,31070079:1150893,0,0 +k1,75:14133156,31070079:170214 +g1,75:14850777,31070079 +k1,75:15113835,31070079:170214 +) +(1,75:13962942,31476878:1150893,263276,0 +$1,75:13962942,31476878 +(1,75:13962942,31476878:558150,0,0 +(1,75:13962942,31476878:558150,0,0 +$1,75:13962942,31476878 +(1,75:13962942,31476878:558150,418611,59802 +x1,75:14521092,31476878 +) +$1,75:14521092,31476878 +) +) +(1,75:14259317,31476878:398682,0,0 +$1,75:14259317,31476878 +(1,75:14179583,31476878:558150,0,0 +(1,75:14179583,31476878:558150,0,0 +$1,75:14179583,31476878 +(1,75:14179583,31476878:558150,418611,59802 +x1,75:14737733,31476878 +) +$1,75:14737733,31476878 +) +) +$1,75:14657999,31476878 +) +x1,75:15113835,31476878 +$1,75:15113835,31476878 +) +] +) +g1,75:15313170,31476878 +h1,75:15313170,31476878:0,0,0 +) +(1,75:15313170,31476878:1255835,498346,0 +x1,75:16569005,31476878 +) +g1,75:16728473,31476878 +x1,75:17286623,31476878 +g1,75:17446091,31476878 +h1,75:17446091,31476878:0,0,0 +(1,75:17446091,31476878:199339,318942,0 +(1,75:17446091,31476878:199339,318942,0 +(1,75:17446091,31476878:199339,318942,0 +$1,75:17446091,31476878 +x1,75:17645430,31476878 +$1,75:17645430,31476878 +) +) +h1,75:17645430,31476878:0,0,0 +) +(1,75:17645430,31476878:1679096,490372,205512 +x1,75:18163711,31476878 +[1,75:18163711,31682390:311300,507307,0 +(1,75:18163711,31175083:32768,0,54616 +h1,75:18163711,31175083:0,0,0 +h1,75:18163711,31175083:0,0,54616 +h1,75:18163711,31175083:0,0,0 +) +(1,75:18163711,31682390:311300,337875,0 +h1,75:18163711,31682390:0,0,0 +x1,75:18442243,31682390 +) +] +x1,75:19013226,31476878 +[1,75:19013226,31682390:311300,507307,0 +(1,75:19013226,31175083:32768,0,54616 +h1,75:19013226,31175083:0,0,0 +h1,75:19013226,31175083:0,0,54616 +h1,75:19013226,31175083:0,0,0 +) +(1,75:19013226,31682390:311300,337875,0 +h1,75:19013226,31682390:0,0,0 +x1,75:19291758,31682390 +) +] +) +) +g1,75:20759768,31476878 +) +$1,75:20759768,31476878 +) +k1,75:20939173,31476878:179405 +) +g1,75:21594533,31476878 +(1,75:21594533,31476878:13192248,623900,267389 +k1,75:29757460,31476878:8162927 +(1,75:29757460,31476878:0,623900,267389 +[1,75:29757460,31476878:0,623900,267389 +(1,21:29757460,31476878:0,623900,267389 +r1,75:29757460,31476878:0,891289,267389 +) +] +) +(1,75:29757460,31476878:5029321,498346,139537 +$1,75:29757460,31476878 +(1,75:29757460,31476878:5029321,498346,139537 +(1,75:29757460,31476878:5029321,498346,139537 +x1,75:31551511,31476878 +g1,75:31790717,31476878 +x1,75:34786781,31476878 +) +) +$1,75:34786781,31476878 +) +) +g1,75:34786781,31476878 +(1,75:34786781,31476878:0,623900,267389 +(1,75:34786781,31476878:0,0,0 +$1,75:34786781,31476878 +h1,75:34786781,31476878:0,0,0 +$1,75:34786781,31476878 +) +g1,75:34786781,31476878 +) +g1,75:35442141,31476878 +(1,75:35442141,31476878:-655360,623900,267389 +) +g1,75:34786781,31476878 +) +(1,75:9979166,32564776:24807615,623900,267389 +g1,75:9979166,32564776 +(1,75:9979166,32564776:3784441,623900,267389 +g1,75:9979166,32564776 +(1,75:9979166,32564776:0,623900,267389 +[1,75:9979166,32564776:0,623900,267389 +(1,21:9979166,32564776:0,623900,267389 +r1,75:9979166,32564776:0,891289,267389 +) +] +) +(1,75:9979166,32564776:3784441,498346,205512 +$1,75:9979166,32564776 +(1,75:9979166,32564776:3784441,498346,205512 +h1,75:9979166,32564776:0,0,0 +(1,75:9979166,32564776:3784441,498346,205512 +(1,75:9979166,32564776:1878435,490372,205512 +(1,75:9979166,32564776:199339,318942,0 +(1,75:9979166,32564776:199339,318942,0 +$1,75:9979166,32564776 +x1,75:10178505,32564776 +$1,75:10178505,32564776 +) +) +h1,75:10178505,32564776:0,0,0 +x1,75:10696786,32564776 +[1,75:10696786,32770288:311300,507307,0 +(1,75:10696786,32262981:32768,0,54616 +h1,75:10696786,32262981:0,0,0 +h1,75:10696786,32262981:0,0,54616 +h1,75:10696786,32262981:0,0,0 +) +(1,75:10696786,32770288:311300,337875,0 +h1,75:10696786,32770288:0,0,0 +x1,75:10975318,32770288 +) +] +x1,75:11546301,32564776 +[1,75:11546301,32770288:311300,507307,0 +(1,75:11546301,32262981:32768,0,54616 +h1,75:11546301,32262981:0,0,0 +h1,75:11546301,32262981:0,0,54616 +h1,75:11546301,32262981:0,0,0 +) +(1,75:11546301,32770288:311300,337875,0 +h1,75:11546301,32770288:0,0,0 +x1,75:11824833,32770288 +) +] +) +g1,75:12017069,32564776 +x1,75:12575219,32564776 +g1,75:12734687,32564776 +h1,75:12734687,32564776:0,0,0 +(1,75:12734687,32564776:1028920,498346,205512 +(1,75:12734687,32564776:717620,498346,0 +x1,75:13452307,32564776 +) +[1,75:13452307,32770288:311300,507307,0 +(1,75:13452307,32262981:32768,0,54616 +h1,75:13452307,32262981:0,0,0 +h1,75:13452307,32262981:0,0,54616 +h1,75:13452307,32262981:0,0,0 +) +(1,75:13452307,32770288:311300,337875,0 +h1,75:13452307,32770288:0,0,0 +x1,75:13730839,32770288 +) +] +) +) +) +$1,75:13763607,32564776 +) +) +g1,75:13763607,32564776 +(1,75:13763607,32564776:7175566,623900,267389 +(1,75:13763607,32564776:7175566,498346,205512 +$1,75:13763607,32564776 +(1,75:13763607,32564776:7175566,498346,205512 +h1,75:13763607,32564776:0,0,0 +(1,75:13763607,32564776:5740324,498346,205512 +(1,75:13763607,32564776:1549563,478561,0 +h1,75:13763607,32564776:0,0,0 +g1,75:13962942,32564776 +(1,75:13962942,32564776:1150893,478561,0 +[1,75:13962942,32564776:1150893,478561,0 +(1,75:13962942,32157977:1150893,0,0 +k1,75:14133156,32157977:170214 +g1,75:14850777,32157977 +k1,75:15113835,32157977:170214 +) +(1,75:13962942,32564776:1150893,263276,0 +$1,75:13962942,32564776 +(1,75:13962942,32564776:558150,0,0 +(1,75:13962942,32564776:558150,0,0 +$1,75:13962942,32564776 +(1,75:13962942,32564776:558150,418611,59802 +x1,75:14521092,32564776 +) +$1,75:14521092,32564776 +) +) +(1,75:14259317,32564776:398682,0,0 +$1,75:14259317,32564776 +(1,75:14179583,32564776:558150,0,0 +(1,75:14179583,32564776:558150,0,0 +$1,75:14179583,32564776 +(1,75:14179583,32564776:558150,418611,59802 +x1,75:14737733,32564776 +) +$1,75:14737733,32564776 +) +) +$1,75:14657999,32564776 +) +x1,75:15113835,32564776 +$1,75:15113835,32564776 +) +] +) +g1,75:15313170,32564776 +h1,75:15313170,32564776:0,0,0 +) +(1,75:15313170,32564776:2396716,498346,205512 +x1,75:15831451,32564776 +[1,75:15831451,32770288:311300,507307,0 +(1,75:15831451,32262981:32768,0,54616 +h1,75:15831451,32262981:0,0,0 +h1,75:15831451,32262981:0,0,54616 +h1,75:15831451,32262981:0,0,0 +) +(1,75:15831451,32770288:311300,337875,0 +h1,75:15831451,32770288:0,0,0 +x1,75:16109983,32770288 +) +] +x1,75:16680966,32564776 +[1,75:16680966,32770288:311300,507307,0 +(1,75:16680966,32262981:32768,0,54616 +h1,75:16680966,32262981:0,0,0 +h1,75:16680966,32262981:0,0,54616 +h1,75:16680966,32262981:0,0,0 +) +(1,75:16680966,32770288:311300,337875,0 +h1,75:16680966,32770288:0,0,0 +x1,75:16959498,32770288 +) +] +(1,75:16992266,32564776:717620,498346,0 +x1,75:17709886,32564776 +) +) +g1,75:17869354,32564776 +x1,75:18427504,32564776 +g1,75:18586972,32564776 +h1,75:18586972,32564776:0,0,0 +(1,75:18586972,32564776:916959,498346,0 +(1,75:18586972,32564776:199339,318942,0 +(1,75:18586972,32564776:199339,318942,0 +$1,75:18586972,32564776 +x1,75:18786311,32564776 +$1,75:18786311,32564776 +) +) +h1,75:18786311,32564776:0,0,0 +(1,75:18786311,32564776:717620,498346,0 +x1,75:19503931,32564776 +) +) +) +g1,75:20939173,32564776 +) +$1,75:20939173,32564776 +) +g1,75:20939173,32564776 +) +g1,75:21594533,32564776 +(1,75:21594533,32564776:13192248,623900,267389 +k1,75:29757460,32564776:8162927 +(1,75:29757460,32564776:0,623900,267389 +[1,75:29757460,32564776:0,623900,267389 +(1,21:29757460,32564776:0,623900,267389 +r1,75:29757460,32564776:0,891289,267389 +) +] +) +(1,75:29757460,32564776:5029321,498346,139537 +$1,75:29757460,32564776 +(1,75:29757460,32564776:5029321,498346,139537 +(1,75:29757460,32564776:5029321,498346,139537 +x1,75:31551511,32564776 +g1,75:31790717,32564776 +x1,75:34786781,32564776 +) +) +$1,75:34786781,32564776 +) +) +g1,75:34786781,32564776 +(1,75:34786781,32564776:0,623900,267389 +(1,75:34786781,32564776:0,0,0 +$1,75:34786781,32564776 +h1,75:34786781,32564776:0,0,0 +$1,75:34786781,32564776 +) +g1,75:34786781,32564776 +) +g1,75:35442141,32564776 +(1,75:35442141,32564776:-655360,623900,267389 +) +g1,75:34786781,32564776 +) +(1,75:9979166,33652674:24807615,623900,267389 +g1,75:9979166,33652674 +(1,75:9979166,33652674:3784441,623900,267389 +k1,75:10091127,33652674:111961 +(1,75:10091127,33652674:0,623900,267389 +[1,75:10091127,33652674:0,623900,267389 +(1,21:10091127,33652674:0,623900,267389 +r1,75:10091127,33652674:0,891289,267389 +) +] +) +(1,75:10091127,33652674:3672480,498346,205512 +$1,75:10091127,33652674 +(1,75:10091127,33652674:3672480,498346,205512 +h1,75:10091127,33652674:0,0,0 +(1,75:10091127,33652674:3672480,498346,205512 +(1,75:10091127,33652674:1878435,490372,205512 +(1,75:10091127,33652674:199339,318942,0 +(1,75:10091127,33652674:199339,318942,0 +$1,75:10091127,33652674 +x1,75:10290466,33652674 +$1,75:10290466,33652674 +) +) +h1,75:10290466,33652674:0,0,0 +x1,75:10808747,33652674 +[1,75:10808747,33858186:311300,507307,0 +(1,75:10808747,33350879:32768,0,54616 +h1,75:10808747,33350879:0,0,0 +h1,75:10808747,33350879:0,0,54616 +h1,75:10808747,33350879:0,0,0 +) +(1,75:10808747,33858186:311300,337875,0 +h1,75:10808747,33858186:0,0,0 +x1,75:11087279,33858186 +) +] +x1,75:11658262,33652674 +[1,75:11658262,33858186:311300,507307,0 +(1,75:11658262,33350879:32768,0,54616 +h1,75:11658262,33350879:0,0,0 +h1,75:11658262,33350879:0,0,54616 +h1,75:11658262,33350879:0,0,0 +) +(1,75:11658262,33858186:311300,337875,0 +h1,75:11658262,33858186:0,0,0 +x1,75:11936794,33858186 +) +] +) +g1,75:12129030,33652674 +x1,75:12687180,33652674 +g1,75:12846648,33652674 +h1,75:12846648,33652674:0,0,0 +(1,75:12846648,33652674:916959,498346,0 +(1,75:12846648,33652674:199339,318942,0 +(1,75:12846648,33652674:199339,318942,0 +$1,75:12846648,33652674 +x1,75:13045987,33652674 +$1,75:13045987,33652674 +) +) +h1,75:13045987,33652674:0,0,0 +(1,75:13045987,33652674:717620,498346,0 +x1,75:13763607,33652674 +) +) +) +) +$1,75:13763607,33652674 +) +) +g1,75:13763607,33652674 +(1,75:13763607,33652674:7175566,623900,267389 +(1,75:13763607,33652674:5381521,498346,205512 +$1,75:13763607,33652674 +(1,75:13763607,33652674:5381521,498346,205512 +h1,75:13763607,33652674:0,0,0 +(1,75:13763607,33652674:3946279,498346,205512 +(1,75:13763607,33652674:1549563,478561,0 +h1,75:13763607,33652674:0,0,0 +g1,75:13962942,33652674 +(1,75:13962942,33652674:1150893,478561,0 +[1,75:13962942,33652674:1150893,478561,0 +(1,75:13962942,33245875:1150893,0,0 +k1,75:14133156,33245875:170214 +g1,75:14850777,33245875 +k1,75:15113835,33245875:170214 +) +(1,75:13962942,33652674:1150893,263276,0 +$1,75:13962942,33652674 +(1,75:13962942,33652674:558150,0,0 +(1,75:13962942,33652674:558150,0,0 +$1,75:13962942,33652674 +(1,75:13962942,33652674:558150,418611,59802 +x1,75:14521092,33652674 +) +$1,75:14521092,33652674 +) +) +(1,75:14259317,33652674:398682,0,0 +$1,75:14259317,33652674 +(1,75:14179583,33652674:558150,0,0 +(1,75:14179583,33652674:558150,0,0 +$1,75:14179583,33652674 +(1,75:14179583,33652674:558150,418611,59802 +x1,75:14737733,33652674 +) +$1,75:14737733,33652674 +) +) +$1,75:14657999,33652674 +) +x1,75:15113835,33652674 +$1,75:15113835,33652674 +) +] +) +g1,75:15313170,33652674 +h1,75:15313170,33652674:0,0,0 +) +(1,75:15313170,33652674:2396716,498346,205512 +x1,75:15831451,33652674 +[1,75:15831451,33858186:311300,507307,0 +(1,75:15831451,33350879:32768,0,54616 +h1,75:15831451,33350879:0,0,0 +h1,75:15831451,33350879:0,0,54616 +h1,75:15831451,33350879:0,0,0 +) +(1,75:15831451,33858186:311300,337875,0 +h1,75:15831451,33858186:0,0,0 +x1,75:16109983,33858186 +) +] +x1,75:16680966,33652674 +[1,75:16680966,33858186:311300,507307,0 +(1,75:16680966,33350879:32768,0,54616 +h1,75:16680966,33350879:0,0,0 +h1,75:16680966,33350879:0,0,54616 +h1,75:16680966,33350879:0,0,0 +) +(1,75:16680966,33858186:311300,337875,0 +h1,75:16680966,33858186:0,0,0 +x1,75:16959498,33858186 +) +] +(1,75:16992266,33652674:717620,498346,0 +x1,75:17709886,33652674 +) +) +) +g1,75:19145128,33652674 +) +$1,75:19145128,33652674 +) +k1,75:20939173,33652674:1794045 +) +g1,75:21594533,33652674 +(1,75:21594533,33652674:13192248,623900,267389 +k1,75:29837195,33652674:8242662 +(1,75:29837195,33652674:0,623900,267389 +[1,75:29837195,33652674:0,623900,267389 +(1,21:29837195,33652674:0,623900,267389 +r1,75:29837195,33652674:0,891289,267389 +) +] +) +(1,75:29837195,33652674:4949586,498346,139537 +$1,75:29837195,33652674 +(1,75:29837195,33652674:4949586,498346,139537 +(1,75:29837195,33652674:4949586,498346,139537 +x1,75:31631246,33652674 +g1,75:31870452,33652674 +x1,75:34786781,33652674 +) +) +$1,75:34786781,33652674 +) +) +g1,75:34786781,33652674 +(1,75:34786781,33652674:0,623900,267389 +(1,75:34786781,33652674:0,0,0 +$1,75:34786781,33652674 +h1,75:34786781,33652674:0,0,0 +$1,75:34786781,33652674 +) +g1,75:34786781,33652674 +) +g1,75:35442141,33652674 +(1,75:35442141,33652674:-655360,623900,267389 +) +g1,75:34786781,33652674 +) +(1,75:9979166,34740572:24807615,623900,267389 +g1,75:9979166,34740572 +(1,75:9979166,34740572:3784441,623900,267389 +k1,75:12368237,34740572:2389071 +(1,75:12368237,34740572:0,623900,267389 +[1,75:12368237,34740572:0,623900,267389 +(1,21:12368237,34740572:0,623900,267389 +r1,75:12368237,34740572:0,891289,267389 +) +] +) +(1,75:12368237,34740572:1395370,498346,0 +$1,75:12368237,34740572 +(1,75:12368237,34740572:1395370,498346,0 +h1,75:12368237,34740572:0,0,0 +(1,75:12368237,34740572:1395370,498346,0 +(1,75:12368237,34740572:478411,462465,0 +x1,75:12727047,34740572 +g1,75:12846648,34740572 +) +(1,75:12846648,34740572:199339,318942,0 +(1,75:12846648,34740572:199339,318942,0 +$1,75:12846648,34740572 +x1,75:13045987,34740572 +$1,75:13045987,34740572 +) +) +h1,75:13045987,34740572:0,0,0 +(1,75:13045987,34740572:717620,498346,0 +x1,75:13763607,34740572 +) +) +) +$1,75:13763607,34740572 +) +) +g1,75:13763607,34740572 +(1,75:13763607,34740572:7175566,623900,267389 +(1,75:13763607,34740572:2578483,498346,205512 +$1,75:13763607,34740572 +(1,75:13763607,34740572:2578483,498346,205512 +h1,75:13763607,34740572:0,0,0 +(1,75:13763607,34740572:2578483,498346,205512 +(1,75:13763607,34740572:1549563,478561,0 +h1,75:13763607,34740572:0,0,0 +g1,75:13962942,34740572 +(1,75:13962942,34740572:1150893,478561,0 +[1,75:13962942,34740572:1150893,478561,0 +(1,75:13962942,34333773:1150893,0,0 +k1,75:14133156,34333773:170214 +g1,75:14850777,34333773 +k1,75:15113835,34333773:170214 +) +(1,75:13962942,34740572:1150893,263276,0 +$1,75:13962942,34740572 +(1,75:13962942,34740572:558150,0,0 +(1,75:13962942,34740572:558150,0,0 +$1,75:13962942,34740572 +(1,75:13962942,34740572:558150,418611,59802 +x1,75:14521092,34740572 +) +$1,75:14521092,34740572 +) +) +(1,75:14259317,34740572:398682,0,0 +$1,75:14259317,34740572 +(1,75:14179583,34740572:558150,0,0 +(1,75:14179583,34740572:558150,0,0 +$1,75:14179583,34740572 +(1,75:14179583,34740572:558150,418611,59802 +x1,75:14737733,34740572 +) +$1,75:14737733,34740572 +) +) +$1,75:14657999,34740572 +) +x1,75:15113835,34740572 +$1,75:15113835,34740572 +) +] +) +g1,75:15313170,34740572 +h1,75:15313170,34740572:0,0,0 +) +(1,75:15313170,34740572:1028920,498346,205512 +(1,75:15313170,34740572:717620,498346,0 +x1,75:16030790,34740572 +) +[1,75:16030790,34946084:311300,507307,0 +(1,75:16030790,34438777:32768,0,54616 +h1,75:16030790,34438777:0,0,0 +h1,75:16030790,34438777:0,0,54616 +h1,75:16030790,34438777:0,0,0 +) +(1,75:16030790,34946084:311300,337875,0 +h1,75:16030790,34946084:0,0,0 +x1,75:16309322,34946084 +) +] +) +) +) +$1,75:16342090,34740572 +) +k1,75:20939173,34740572:4597083 +) +g1,75:21594533,34740572 +(1,75:21594533,34740572:13192248,623900,267389 +k1,75:34786781,34740572:13192248 +(1,75:34786781,34740572:0,623900,267389 +[1,75:34786781,34740572:0,623900,267389 +(1,21:34786781,34740572:0,623900,267389 +r1,75:34786781,34740572:0,891289,267389 +) +] +) +(1,75:34786781,34740572:0,0,0 +$1,75:34786781,34740572 +h1,75:34786781,34740572:0,0,0 +$1,75:34786781,34740572 +) +) +g1,75:34786781,34740572 +(1,75:34786781,34740572:0,623900,267389 +(1,75:34786781,34740572:0,0,0 +$1,75:34786781,34740572 +h1,75:34786781,34740572:0,0,0 +$1,75:34786781,34740572 +) +g1,75:34786781,34740572 +) +g1,75:35442141,34740572 +(1,75:35442141,34740572:-655360,623900,267389 +) +g1,75:34786781,34740572 +) +(1,75:9979166,35828470:24807615,623900,267389 +g1,75:9979166,35828470 +(1,75:9979166,35828470:3784441,623900,267389 +k1,75:11406761,35828470:1427595 +(1,75:11406761,35828470:0,623900,267389 +[1,75:11406761,35828470:0,623900,267389 +(1,21:11406761,35828470:0,623900,267389 +r1,75:11406761,35828470:0,891289,267389 +) +] +) +(1,75:11406761,35828470:2356846,490372,205512 +$1,75:11406761,35828470 +(1,75:11406761,35828470:2356846,490372,205512 +h1,75:11406761,35828470:0,0,0 +(1,75:11406761,35828470:2356846,490372,205512 +(1,75:11406761,35828470:478411,462465,0 +x1,75:11765571,35828470 +g1,75:11885172,35828470 +) +(1,75:11885172,35828470:199339,318942,0 +(1,75:11885172,35828470:199339,318942,0 +$1,75:11885172,35828470 +x1,75:12084511,35828470 +$1,75:12084511,35828470 +) +) +h1,75:12084511,35828470:0,0,0 +x1,75:12602792,35828470 +[1,75:12602792,36033982:311300,507307,0 +(1,75:12602792,35526675:32768,0,54616 +h1,75:12602792,35526675:0,0,0 +h1,75:12602792,35526675:0,0,54616 +h1,75:12602792,35526675:0,0,0 +) +(1,75:12602792,36033982:311300,337875,0 +h1,75:12602792,36033982:0,0,0 +x1,75:12881324,36033982 +) +] +x1,75:13452307,35828470 +[1,75:13452307,36033982:311300,507307,0 +(1,75:13452307,35526675:32768,0,54616 +h1,75:13452307,35526675:0,0,0 +h1,75:13452307,35526675:0,0,54616 +h1,75:13452307,35526675:0,0,0 +) +(1,75:13452307,36033982:311300,337875,0 +h1,75:13452307,36033982:0,0,0 +x1,75:13730839,36033982 +) +] +) +) +$1,75:13763607,35828470 +) +) +g1,75:13763607,35828470 +(1,75:13763607,35828470:7175566,623900,267389 +(1,75:13763607,35828470:3507191,490372,205512 +$1,75:13763607,35828470 +(1,75:13763607,35828470:3507191,490372,205512 +h1,75:13763607,35828470:0,0,0 +(1,75:13763607,35828470:3507191,490372,205512 +(1,75:13763607,35828470:1549563,478561,0 +h1,75:13763607,35828470:0,0,0 +g1,75:13962942,35828470 +(1,75:13962942,35828470:1150893,478561,0 +[1,75:13962942,35828470:1150893,478561,0 +(1,75:13962942,35421671:1150893,0,0 +k1,75:14133156,35421671:170214 +g1,75:14850777,35421671 +k1,75:15113835,35421671:170214 +) +(1,75:13962942,35828470:1150893,263276,0 +$1,75:13962942,35828470 +(1,75:13962942,35828470:558150,0,0 +(1,75:13962942,35828470:558150,0,0 +$1,75:13962942,35828470 +(1,75:13962942,35828470:558150,418611,59802 +x1,75:14521092,35828470 +) +$1,75:14521092,35828470 +) +) +(1,75:14259317,35828470:398682,0,0 +$1,75:14259317,35828470 +(1,75:14179583,35828470:558150,0,0 +(1,75:14179583,35828470:558150,0,0 +$1,75:14179583,35828470 +(1,75:14179583,35828470:558150,418611,59802 +x1,75:14737733,35828470 +) +$1,75:14737733,35828470 +) +) +$1,75:14657999,35828470 +) +x1,75:15113835,35828470 +$1,75:15113835,35828470 +) +] +) +g1,75:15313170,35828470 +h1,75:15313170,35828470:0,0,0 +) +(1,75:15313170,35828470:1957628,490372,205512 +x1,75:15831451,35828470 +[1,75:15831451,36033982:311300,507307,0 +(1,75:15831451,35526675:32768,0,54616 +h1,75:15831451,35526675:0,0,0 +h1,75:15831451,35526675:0,0,54616 +h1,75:15831451,35526675:0,0,0 +) +(1,75:15831451,36033982:311300,337875,0 +h1,75:15831451,36033982:0,0,0 +x1,75:16109983,36033982 +) +] +x1,75:16680966,35828470 +[1,75:16680966,36033982:589832,507307,0 +(1,75:16680966,35526675:32768,0,54616 +h1,75:16680966,35526675:0,0,0 +h1,75:16680966,35526675:0,0,54616 +h1,75:16680966,35526675:0,0,0 +) +(1,75:16680966,36033982:589832,337875,0 +h1,75:16680966,36033982:0,0,0 +(1,75:16680966,36033982:557064,337875,0 +x1,75:17238030,36033982 +) +) +] +) +) +) +$1,75:17270798,35828470 +) +k1,75:20939173,35828470:3668375 +) +g1,75:21594533,35828470 +(1,75:21594533,35828470:13192248,623900,267389 +g1,75:21594533,35828470 +(1,75:21594533,35828470:0,623900,267389 +[1,75:21594533,35828470:0,623900,267389 +(1,21:21594533,35828470:0,623900,267389 +r1,75:21594533,35828470:0,891289,267389 +) +] +) +(1,75:21594533,35828470:13192248,498346,139537 +$1,75:21594533,35828470 +(1,75:21594533,35828470:13192248,498346,139537 +(1,75:21594533,35828470:13192248,498346,139537 +x1,75:24510862,35828470 +g1,75:24750068,35828470 +x1,75:25128813,35828470 +x1,75:26225176,35828470 +g1,75:26464382,35828470 +x1,75:27979358,35828470 +x1,75:28358101,35828470 +x1,75:29556129,35828470 +x1,75:30273749,35828470 +g1,75:30512955,35828470 +x1,75:31952182,35828470 +g1,75:32191388,35828470 +x1,75:34786781,35828470 +) +) +$1,75:34786781,35828470 +) +) +g1,75:34786781,35828470 +(1,75:34786781,35828470:0,623900,267389 +(1,75:34786781,35828470:0,0,0 +$1,75:34786781,35828470 +h1,75:34786781,35828470:0,0,0 +$1,75:34786781,35828470 +) +g1,75:34786781,35828470 +) +g1,75:35442141,35828470 +(1,75:35442141,35828470:-655360,623900,267389 +) +g1,75:34786781,35828470 +) +[1,75:9979166,35828470:23592960,623900,267389 +(1,75:9979166,35828470:23592960,623900,267389 +(1,75:9979166,35828470:24807615,623900,267389 +(1,75:9979166,35828470:0,623900,267389 +[1,75:9979166,35828470:0,623900,267389 +(1,21:9979166,35828470:0,623900,267389 +r1,75:9979166,35828470:0,891289,267389 +) +] +) +k1,75:34786781,35828470:24807615 +) +g1,75:34786781,35828470 +g1,75:34786781,35828470 +) +] +(1,78:9979166,38059645:23592960,825750,353898 +g1,78:12397441,38059645 +r1,78:12397441,38059645:0,1179648,353898 +(1,78:12397441,38059645:0,825750,353898 +k1,78:9979166,38059645:-2418275 +(1,78:9979166,38059645:2418275,825750,353898 +x1,78:11335759,38059645 +g1,78:12397441,38059645 +r1,78:12397441,38059645:0,1179648,353898 +g1,78:12397441,38059645 +) +) +x1,78:15463869,38059645 +g1,78:15817763,38059645 +x1,78:18217908,38059645 +r1,78:18217908,38059645:0,1179648,353898 +k1,78:33572126,38059645:15354218 +g1,78:33572126,38059645 +) +(1,80:9979166,39741410:23592960,551690,179404 +$1,79:9979166,39741410 +(1,79:9979166,39741410:5072155,551690,121595 +(1,79:9979166,39741410:550424,490372,0 +(1,79:9979166,39741410:550424,490372,0 +$1,79:9979166,39741410 +x1,79:10524046,39741410 +$1,79:10529590,39741410 +) +) +(1,79:10529590,39741410:0,0,0 +h1,79:10529590,39741410:0,0,0 +) +(1,79:10529590,39741410:558150,418611,59802 +x1,79:11087740,39741410 +) +(1,79:11087740,39741410:0,0,0 +h1,79:11087740,39741410:0,0,0 +) +(1,79:11087740,39741410:1056496,490372,0 +(1,79:11087740,39741410:1056496,490372,0 +x1,79:12144236,39741410 +) +) +(1,79:12144236,39741410:0,480404,0 +(1,79:12144236,39741410:558150,480404,0 +(1,79:12144236,39679617:558150,418611,59802 +$1,79:12144236,39679617 +x1,79:12702386,39679617 +$1,79:12702386,39679617 +) +) +k1,79:12144236,39741410:-558150 +) +(1,79:12144236,39741410:558150,356818,121595 +(1,79:12144236,39803203:558150,418611,59802 +$1,79:12144236,39803203 +x1,79:12702386,39803203 +$1,79:12702386,39803203 +) +) +(1,79:12702386,39741410:1056496,490372,0 +(1,79:12702386,39741410:1056496,490372,0 +x1,79:13758882,39741410 +) +) +(1,79:13758882,39741410:558150,418611,59802 +x1,79:14317032,39741410 +) +(1,79:14317032,39741410:0,0,0 +h1,79:14317032,39741410:0,0,0 +) +(1,79:14317032,39741410:734289,551690,0 +(1,79:14317032,39741410:734289,551690,0 +$1,79:14317032,39741410 +x1,79:14861912,39741410 +(1,79:14867456,39480992:183865,291272,0 +x1,79:15018553,39480992 +) +$1,79:15051321,39741410 +) +) +(1,79:15051321,39741410:0,0,0 +h1,79:15051321,39741410:0,0,0 +) +) +g1,79:15210789,39741410 +x1,79:15768939,39741410 +g1,79:15928407,39741410 +h1,79:15928407,39741410:0,0,0 +(1,79:15928407,39741410:1046530,490372,0 +(1,79:15928407,39741410:1046530,490372,0 +x1,79:16974937,39741410 +) +) +(1,79:16974937,39741410:1549563,478561,0 +h1,79:16974937,39741410:0,0,0 +g1,79:17174272,39741410 +(1,79:17174272,39741410:1150893,478561,0 +[1,79:17174272,39741410:1150893,478561,0 +(1,79:17174272,39334611:1150893,0,0 +k1,79:17344486,39334611:170214 +g1,79:18062107,39334611 +k1,79:18325165,39334611:170214 +) +(1,79:17174272,39741410:1150893,263276,0 +$1,79:17174272,39741410 +(1,79:17174272,39741410:558150,0,0 +(1,79:17174272,39741410:558150,0,0 +$1,79:17174272,39741410 +(1,79:17174272,39741410:558150,418611,59802 +x1,79:17732422,39741410 +) +$1,79:17732422,39741410 +) +) +(1,79:17470647,39741410:398682,0,0 +$1,79:17470647,39741410 +(1,79:17390913,39741410:558150,0,0 +(1,79:17390913,39741410:558150,0,0 +$1,79:17390913,39741410 +(1,79:17390913,39741410:558150,418611,59802 +x1,79:17949063,39741410 +) +$1,79:17949063,39741410 +) +) +$1,79:17869329,39741410 +) +x1,79:18325165,39741410 +$1,79:18325165,39741410 +) +] +) +g1,79:18524500,39741410 +h1,79:18524500,39741410:0,0,0 +) +(1,79:18524500,39741410:6676835,551690,179404 +(1,79:18524500,39741410:550424,490372,0 +(1,79:18524500,39741410:550424,490372,0 +$1,79:18524500,39741410 +x1,79:19069380,39741410 +$1,79:19074924,39741410 +) +) +(1,79:19074924,39741410:0,0,0 +h1,79:19074924,39741410:0,0,0 +) +(1,79:19074924,39741410:1056496,490372,0 +(1,79:19074924,39741410:1056496,490372,0 +x1,79:20131420,39741410 +) +) +(1,79:20131420,39741410:279075,538214,179404 +(1,79:20131420,39741410:279075,538214,179404 +x1,79:20410495,39741410 +) +) +(1,79:20410495,39741410:538215,490372,0 +(1,79:20410495,39741410:538215,490372,0 +x1,79:20948710,39741410 +) +) +(1,79:20948710,39741410:279075,538214,179404 +(1,79:20948710,39741410:279075,538214,179404 +x1,79:21227785,39741410 +) +) +(1,79:21227785,39741410:0,0,0 +h1,79:21227785,39741410:0,0,0 +) +(1,79:21227785,39741410:558150,418611,59802 +x1,79:21785935,39741410 +) +(1,79:21785935,39741410:1056496,490372,0 +(1,79:21785935,39741410:1056496,490372,0 +x1,79:22842431,39741410 +) +) +(1,79:22842431,39741410:279075,538214,179404 +(1,79:22842431,39741410:279075,538214,179404 +x1,79:23121506,39741410 +) +) +(1,79:23121506,39741410:508315,490372,0 +(1,79:23121506,39741410:508315,490372,0 +x1,79:23629821,39741410 +) +) +(1,79:23629821,39741410:279075,538214,179404 +(1,79:23629821,39741410:279075,538214,179404 +x1,79:23908896,39741410 +) +) +(1,79:23908896,39741410:0,0,0 +h1,79:23908896,39741410:0,0,0 +) +(1,79:23908896,39741410:558150,418611,59802 +x1,79:24467046,39741410 +) +(1,79:24467046,39741410:0,0,0 +h1,79:24467046,39741410:0,0,0 +) +(1,79:24467046,39741410:734289,551690,0 +(1,79:24467046,39741410:734289,551690,0 +$1,79:24467046,39741410 +x1,79:25011926,39741410 +(1,79:25017470,39480992:183865,291272,0 +x1,79:25168567,39480992 +) +$1,79:25201335,39741410 +) +) +(1,79:25201335,39741410:0,0,0 +h1,79:25201335,39741410:0,0,0 +) +) +$1,79:25201335,39741410 +k1,80:33572126,39741410:8370791 +g1,80:33572126,39741410 +) +(1,81:9979166,41633196:23592960,642250,275254 +g1,81:12682526,41633196 +r1,81:12682526,41633196:0,917504,275254 +(1,81:12682526,41633196:0,642250,275254 +k1,81:9979166,41633196:-2703360 +(1,81:9979166,41633196:2703360,642250,275254 +x1,81:11797790,41633196 +g1,81:12682526,41633196 +r1,81:12682526,41633196:0,917504,275254 +g1,81:12682526,41633196 +) +) +x1,81:14682649,41633196 +g1,81:14977561,41633196 +x1,81:17822461,41633196 +x1,81:19272445,41633196 +r1,81:19272445,41633196:0,917504,275254 +k1,81:33572126,41633196:14299681 +g1,81:33572126,41633196 +) +(1,84:9979166,42987947:23592960,551690,205512 +$1,82:9979166,42987947 +(1,82:9979166,42987947:3955855,551690,121595 +(1,82:9979166,42987947:550424,490372,0 +(1,82:9979166,42987947:550424,490372,0 +$1,82:9979166,42987947 +x1,82:10524046,42987947 +$1,82:10529590,42987947 +) +) +(1,82:10529590,42987947:0,0,0 +h1,82:10529590,42987947:0,0,0 +) +(1,82:10529590,42987947:1056496,490372,0 +(1,82:10529590,42987947:1056496,490372,0 +x1,82:11586086,42987947 +) +) +(1,82:11586086,42987947:0,480404,0 +(1,82:11586086,42987947:558150,480404,0 +(1,82:11586086,42926154:558150,418611,59802 +$1,82:11586086,42926154 +x1,82:12144236,42926154 +$1,82:12144236,42926154 +) +) +k1,82:11586086,42987947:-558150 +) +(1,82:11586086,42987947:558150,356818,121595 +(1,82:11586086,43049740:558150,418611,59802 +$1,82:11586086,43049740 +x1,82:12144236,43049740 +$1,82:12144236,43049740 +) +) +(1,82:12144236,42987947:1056496,490372,0 +(1,82:12144236,42987947:1056496,490372,0 +x1,82:13200732,42987947 +) +) +(1,82:13200732,42987947:734289,551690,0 +(1,82:13200732,42987947:734289,551690,0 +$1,82:13200732,42987947 +x1,82:13745612,42987947 +(1,82:13751156,42727529:183865,291272,0 +x1,82:13902253,42727529 +) +$1,82:13935021,42987947 +) +) +(1,82:13935021,42987947:0,0,0 +h1,82:13935021,42987947:0,0,0 +) +) +k1,82:13969824,42987947:34803 +x1,82:14527974,42987947 +k1,82:14562777,42987947:34803 +h1,82:14562777,42987947:0,0,0 +(1,82:14562777,42987947:1255835,498346,0 +(1,82:14562777,42987947:1255835,498346,0 +x1,82:15818612,42987947 +) +) +(1,82:15818612,42987947:1549563,478561,0 +h1,82:15818612,42987947:0,0,0 +g1,82:16017947,42987947 +(1,82:16017947,42987947:1150893,478561,0 +[1,82:16017947,42987947:1150893,478561,0 +(1,82:16017947,42581148:1150893,0,0 +k1,82:16188161,42581148:170214 +g1,82:16905782,42581148 +k1,82:17168840,42581148:170214 +) +(1,82:16017947,42987947:1150893,263276,0 +$1,82:16017947,42987947 +(1,82:16017947,42987947:558150,0,0 +(1,82:16017947,42987947:558150,0,0 +$1,82:16017947,42987947 +(1,82:16017947,42987947:558150,418611,59802 +x1,82:16576097,42987947 +) +$1,82:16576097,42987947 +) +) +(1,82:16314322,42987947:398682,0,0 +$1,82:16314322,42987947 +(1,82:16234588,42987947:558150,0,0 +(1,82:16234588,42987947:558150,0,0 +$1,82:16234588,42987947 +(1,82:16234588,42987947:558150,418611,59802 +x1,82:16792738,42987947 +) +$1,82:16792738,42987947 +) +) +$1,82:16713004,42987947 +) +x1,82:17168840,42987947 +$1,82:17168840,42987947 +) +] +) +g1,82:17368175,42987947 +h1,82:17368175,42987947:0,0,0 +) +(1,82:17368175,42987947:4984775,551690,205512 +(1,82:17368175,42987947:550424,490372,0 +(1,82:17368175,42987947:550424,490372,0 +$1,82:17368175,42987947 +x1,82:17913055,42987947 +$1,82:17918599,42987947 +) +) +(1,82:17918599,42987947:0,0,0 +h1,82:17918599,42987947:0,0,0 +) +(1,82:17918599,42987947:1056496,490372,0 +(1,82:17918599,42987947:1056496,490372,0 +x1,82:18975095,42987947 +) +) +[1,82:18975095,43193459:311300,507307,0 +(1,82:18975095,42686152:32768,0,54616 +h1,82:18975095,42686152:0,0,0 +h1,82:18975095,42686152:0,0,54616 +(1,82:18975095,42686152:0,0,0 +h1,82:18975095,42686152:0,0,0 +) +) +(1,82:18975095,43193459:311300,337875,0 +h1,82:18975095,43193459:0,0,0 +(1,82:18975095,43193459:278532,337875,0 +(1,82:18975095,43193459:278532,337875,0 +x1,82:19253627,43193459 +) +) +) +] +(1,82:19286395,42987947:558150,418611,59802 +x1,82:19844545,42987947 +) +(1,82:19844545,42987947:0,0,0 +h1,82:19844545,42987947:0,0,0 +) +(1,82:19844545,42987947:1774116,498346,0 +(1,82:19844545,42987947:1774116,498346,0 +x1,82:21618661,42987947 +) +) +(1,82:21618661,42987947:734289,551690,0 +(1,82:21618661,42987947:734289,551690,0 +$1,82:21618661,42987947 +x1,82:22163541,42987947 +(1,82:22169085,42727529:183865,291272,0 +x1,82:22320182,42727529 +) +$1,82:22352950,42987947 +) +) +(1,82:22352950,42987947:0,0,0 +h1,82:22352950,42987947:0,0,0 +) +) +$1,82:22352950,42987947 +k1,82:22529823,42987947:176873 +k1,82:23965065,42987947:1435242 +x1,82:27094688,42987947 +k1,82:27271560,42987947:176872 +x1,82:29346679,42987947 +k1,82:29523552,42987947:176873 +x1,82:31199994,42987947 +x1,82:31538869,42987947 +x1,82:32874441,42987947 +x1,82:33213316,42987947 +x1,82:33572126,42987947 +k1,83:33572126,42987947:0 +k1,84:33572126,42987947:0 +) +(1,84:9979166,43879237:23592960,498346,205512 +x1,84:11254935,43879237 +x1,83:12470902,43879237 +g1,83:12789843,43879237 +$1,83:12789843,43879237 +(1,83:12789843,43879237:4908388,490372,205512 +(1,83:12789843,43879237:1056496,490372,0 +(1,83:12789843,43879237:1056496,490372,0 +x1,83:13846339,43879237 +) +) +[1,83:13846339,44084749:311300,507307,0 +(1,83:13846339,43577442:32768,0,54616 +h1,83:13846339,43577442:0,0,0 +h1,83:13846339,43577442:0,0,54616 +(1,83:13846339,43577442:0,0,0 +h1,83:13846339,43577442:0,0,0 +) +) +(1,83:13846339,44084749:311300,337875,0 +h1,83:13846339,44084749:0,0,0 +(1,83:13846339,44084749:278532,337875,0 +(1,83:13846339,44084749:278532,337875,0 +x1,83:14124871,44084749 +) +) +) +] +(1,83:14157639,43879237:558150,418611,59802 +x1,83:14715789,43879237 +) +(1,83:14715789,43879237:0,0,0 +h1,83:14715789,43879237:0,0,0 +) +(1,83:14715789,43879237:1056496,490372,0 +(1,83:14715789,43879237:1056496,490372,0 +x1,83:15772285,43879237 +) +) +(1,83:15772285,43879237:0,480404,0 +(1,83:15772285,43879237:558150,480404,0 +(1,83:15772285,43817444:558150,418611,59802 +$1,83:15772285,43817444 +x1,83:16330435,43817444 +$1,83:16330435,43817444 +) +) +k1,83:15772285,43879237:-558150 +) +(1,83:15772285,43879237:558150,356818,121595 +(1,83:15772285,43941030:558150,418611,59802 +$1,83:15772285,43941030 +x1,83:16330435,43941030 +$1,83:16330435,43941030 +) +) +(1,83:16330435,43879237:1056496,490372,0 +(1,83:16330435,43879237:1056496,490372,0 +x1,83:17386931,43879237 +) +) +[1,83:17386931,44084749:311300,507307,0 +(1,83:17386931,43577442:32768,0,54616 +h1,83:17386931,43577442:0,0,0 +h1,83:17386931,43577442:0,0,54616 +(1,83:17386931,43577442:0,0,0 +h1,83:17386931,43577442:0,0,0 +) +) +(1,83:17386931,44084749:311300,337875,0 +h1,83:17386931,44084749:0,0,0 +(1,83:17386931,44084749:278532,337875,0 +(1,83:17386931,44084749:278532,337875,0 +x1,83:17665463,44084749 +) +) +) +] +) +g1,83:17857699,43879237 +x1,83:18415849,43879237 +g1,83:18575317,43879237 +h1,83:18575317,43879237:0,0,0 +(1,83:18575317,43879237:1255835,498346,0 +(1,83:18575317,43879237:1255835,498346,0 +x1,83:19831152,43879237 +) +) +(1,83:19831152,43879237:1549563,478561,0 +h1,83:19831152,43879237:0,0,0 +g1,83:20030487,43879237 +(1,83:20030487,43879237:1150893,478561,0 +[1,83:20030487,43879237:1150893,478561,0 +(1,83:20030487,43472438:1150893,0,0 +k1,83:20200701,43472438:170214 +g1,83:20918322,43472438 +k1,83:21181380,43472438:170214 +) +(1,83:20030487,43879237:1150893,263276,0 +$1,83:20030487,43879237 +(1,83:20030487,43879237:558150,0,0 +(1,83:20030487,43879237:558150,0,0 +$1,83:20030487,43879237 +(1,83:20030487,43879237:558150,418611,59802 +x1,83:20588637,43879237 +) +$1,83:20588637,43879237 +) +) +(1,83:20326862,43879237:398682,0,0 +$1,83:20326862,43879237 +(1,83:20247128,43879237:558150,0,0 +(1,83:20247128,43879237:558150,0,0 +$1,83:20247128,43879237 +(1,83:20247128,43879237:558150,418611,59802 +x1,83:20805278,43879237 +) +$1,83:20805278,43879237 +) +) +$1,83:20725544,43879237 +) +x1,83:21181380,43879237 +$1,83:21181380,43879237 +) +] +) +g1,83:21380715,43879237 +h1,83:21380715,43879237:0,0,0 +) +(1,83:21380715,43879237:5626008,498346,205512 +(1,83:21380715,43879237:1056496,490372,0 +(1,83:21380715,43879237:1056496,490372,0 +x1,83:22437211,43879237 +) +) +[1,83:22437211,44084749:311300,507307,0 +(1,83:22437211,43577442:32768,0,54616 +h1,83:22437211,43577442:0,0,0 +h1,83:22437211,43577442:0,0,54616 +(1,83:22437211,43577442:0,0,0 +h1,83:22437211,43577442:0,0,0 +) +) +(1,83:22437211,44084749:311300,337875,0 +h1,83:22437211,44084749:0,0,0 +(1,83:22437211,44084749:278532,337875,0 +(1,83:22437211,44084749:278532,337875,0 +x1,83:22715743,44084749 +) +) +) +] +(1,83:22748511,43879237:558150,418611,59802 +x1,83:23306661,43879237 +) +(1,83:23306661,43879237:0,0,0 +h1,83:23306661,43879237:0,0,0 +) +(1,83:23306661,43879237:1774116,498346,0 +(1,83:23306661,43879237:1774116,498346,0 +x1,83:25080777,43879237 +) +) +(1,83:25080777,43879237:558150,418611,59802 +x1,83:25638927,43879237 +) +(1,83:25638927,43879237:1056496,490372,0 +(1,83:25638927,43879237:1056496,490372,0 +x1,83:26695423,43879237 +) +) +[1,83:26695423,44084749:311300,507307,0 +(1,83:26695423,43577442:32768,0,54616 +h1,83:26695423,43577442:0,0,0 +h1,83:26695423,43577442:0,0,54616 +(1,83:26695423,43577442:0,0,0 +h1,83:26695423,43577442:0,0,0 +) +) +(1,83:26695423,44084749:311300,337875,0 +h1,83:26695423,44084749:0,0,0 +(1,83:26695423,44084749:278532,337875,0 +(1,83:26695423,44084749:278532,337875,0 +x1,83:26973955,44084749 +) +) +) +] +) +$1,83:27006723,43879237 +k1,84:33572126,43879237:6565403 +g1,84:33572126,43879237 +) +] +(1,88:9979166,45679049:23592960,0,0 +h1,88:9979166,45679049:23592960,0,0 +) +] +] +!72125 +}6 +!10 +{7 +[1,115:4736286,45679049:25493504,40942763,0 +[1,115:6636830,45679049:23592960,39369899,0 +[1,115:6636830,7095582:23592960,786432,0 +(1,115:6636830,7095582:23592960,490372,0 +(1,115:6636830,7095582:23592960,490372,0 +x1,115:7753128,7095582 +g1,115:8072069,7095582 +g1,115:8311275,7095582 +x1,115:11082086,7095582 +g1,115:11321292,7095582 +x1,115:15168532,7095582 +k1,115:29870980,7095582:14702448 +x1,115:30229790,7095582 +) +) +] +[1,115:6636830,43879237:23592960,35481206,0 +(1,85:6636830,9118927:23592960,642250,275254 +g1,85:9340190,9118927 +r1,85:9340190,9118927:0,917504,275254 +(1,85:9340190,9118927:0,642250,275254 +k1,85:6636830,9118927:-2703360 +(1,85:6636830,9118927:2703360,642250,275254 +x1,85:8455454,9118927 +g1,85:9340190,9118927 +r1,85:9340190,9118927:0,917504,275254 +g1,85:9340190,9118927 +) +) +x1,85:11340313,9118927 +g1,85:11635225,9118927 +x1,85:14377270,9118927 +x1,85:15827254,9118927 +r1,85:15827254,9118927:0,917504,275254 +k1,85:30229790,9118927:14402536 +g1,85:30229790,9118927 +) +(1,87:6636830,10863403:23592960,940225,231726 +$1,86:6636830,10863403 +(1,86:6636830,10863403:2681109,490372,121595 +(1,86:6636830,10863403:1564809,490372,0 +(1,86:6636830,10863403:1564809,490372,0 +x1,86:7165078,10863403 +x1,86:8201639,10863403 +) +) +(1,86:8201639,10863403:0,480404,0 +(1,86:8201639,10863403:558150,480404,0 +(1,86:8201639,10801610:558150,418611,59802 +$1,86:8201639,10801610 +x1,86:8759789,10801610 +$1,86:8759789,10801610 +) +) +k1,86:8201639,10863403:-558150 +) +(1,86:8201639,10863403:558150,356818,121595 +(1,86:8201639,10925196:558150,418611,59802 +$1,86:8201639,10925196 +x1,86:8759789,10925196 +$1,86:8759789,10925196 +) +) +(1,86:8759789,10863403:558150,490372,0 +(1,86:8759789,10863403:558150,490372,0 +x1,86:9317939,10863403 +) +) +) +g1,86:9477407,10863403 +x1,86:10035557,10863403 +g1,86:10195025,10863403 +h1,86:10195025,10863403:0,0,0 +(1,86:10195025,10863403:2468538,551690,139537 +(1,86:10195025,10863403:734289,551690,0 +(1,86:10195025,10863403:734289,551690,0 +$1,86:10195025,10863403 +x1,86:10739905,10863403 +(1,86:10745449,10602985:183865,291272,0 +x1,86:10896546,10602985 +) +$1,86:10929314,10863403 +) +) +(1,86:10929314,10863403:0,0,0 +h1,86:10929314,10863403:0,0,0 +) +(1,86:10929314,10863403:1734249,498346,139537 +(1,86:10929314,10863403:1734249,498346,139537 +x1,86:12663563,10863403 +) +) +) +(1,86:12663563,10863403:1549563,478561,0 +h1,86:12663563,10863403:0,0,0 +g1,86:12862898,10863403 +(1,86:12862898,10863403:1150893,478561,0 +[1,86:12862898,10863403:1150893,478561,0 +(1,86:12862898,10456604:1150893,0,0 +k1,86:13033112,10456604:170214 +g1,86:13750733,10456604 +k1,86:14013791,10456604:170214 +) +(1,86:12862898,10863403:1150893,263276,0 +$1,86:12862898,10863403 +(1,86:12862898,10863403:558150,0,0 +(1,86:12862898,10863403:558150,0,0 +$1,86:12862898,10863403 +(1,86:12862898,10863403:558150,418611,59802 +x1,86:13421048,10863403 +) +$1,86:13421048,10863403 +) +) +(1,86:13159273,10863403:398682,0,0 +$1,86:13159273,10863403 +(1,86:13079539,10863403:558150,0,0 +(1,86:13079539,10863403:558150,0,0 +$1,86:13079539,10863403 +(1,86:13079539,10863403:558150,418611,59802 +x1,86:13637689,10863403 +) +$1,86:13637689,10863403 +) +) +$1,86:13557955,10863403 +) +x1,86:14013791,10863403 +$1,86:14013791,10863403 +) +] +) +g1,86:14213126,10863403 +h1,86:14213126,10863403:0,0,0 +) +(1,86:14213126,10863403:5149647,551690,179404 +(1,86:14213126,10863403:1564809,490372,0 +(1,86:14213126,10863403:1564809,490372,0 +x1,86:14741374,10863403 +x1,86:15777935,10863403 +) +) +(1,86:15777935,10863403:279075,538214,179404 +(1,86:15777935,10863403:279075,538214,179404 +x1,86:16057010,10863403 +) +) +(1,86:16057010,10863403:2292399,498346,139537 +(1,86:16057010,10863403:2292399,498346,139537 +x1,86:18349409,10863403 +) +) +(1,86:18349409,10863403:279075,538214,179404 +(1,86:18349409,10863403:279075,538214,179404 +x1,86:18628484,10863403 +) +) +(1,86:18628484,10863403:0,0,0 +h1,86:18628484,10863403:0,0,0 +) +(1,86:18628484,10863403:734289,551690,0 +(1,86:18628484,10863403:734289,551690,0 +$1,86:18628484,10863403 +x1,86:19173364,10863403 +(1,86:19178908,10602985:183865,291272,0 +x1,86:19330005,10602985 +) +$1,86:19362773,10863403 +) +) +(1,86:19362773,10863403:0,0,0 +h1,86:19362773,10863403:0,0,0 +) +) +(1,86:19362773,10863403:1955529,940225,0 +h1,86:19362773,10863403:0,0,0 +g1,86:19562108,10863403 +(1,86:19562108,10863403:1556859,940225,0 +[1,86:19562108,10863403:1556859,940225,0 +(1,86:19562108,10353203:1556859,358263,167189 +k1,86:19732322,10353203:170214 +(1,86:19732322,10353203:1123587,358263,167189 +(1,86:19732322,10353203:417252,358263,0 +(1,86:19732322,10353203:417252,358263,0 +x1,86:20149574,10353203 +) +) +[1,86:20149574,10520392:273063,402389,0 +(1,86:20149574,10118003:32768,0,54612 +h1,86:20149574,10118003:0,0,0 +h1,86:20149574,10118003:0,0,54612 +(1,86:20149574,10118003:0,0,0 +h1,86:20149574,10118003:0,0,0 +) +) +(1,86:20149574,10520392:273063,253405,0 +h1,86:20149574,10520392:0,0,0 +(1,86:20149574,10520392:240295,253405,0 +(1,86:20149574,10520392:240295,253405,0 +x1,86:20389869,10520392 +) +) +) +] +(1,86:20422637,10353203:433272,358263,0 +(1,86:20422637,10353203:433272,358263,0 +x1,86:20855909,10353203 +) +) +) +k1,86:21118967,10353203:170214 +) +(1,86:19562108,10863403:1556859,263276,0 +$1,86:19562108,10863403 +(1,86:19562108,10863403:558150,0,0 +(1,86:19562108,10863403:558150,0,0 +$1,86:19562108,10863403 +(1,86:19562108,10863403:558150,418611,59802 +x1,86:20120258,10863403 +) +$1,86:20120258,10863403 +) +) +(1,86:19862125,10863403:398682,0,0 +$1,86:19862125,10863403 +(1,86:19782391,10863403:558150,0,0 +(1,86:19782391,10863403:558150,0,0 +$1,86:19782391,10863403 +(1,86:19782391,10863403:558150,418611,59802 +x1,86:20340541,10863403 +) +$1,86:20340541,10863403 +) +) +$1,86:20260807,10863403 +) +(1,86:20260807,10863403:398682,0,0 +(1,86:20181073,10863403:558150,0,0 +(1,86:20181073,10863403:558150,0,0 +(1,86:20181073,10863403:558150,418611,59802 +x1,86:20739223,10863403 +) +) +) +) +x1,86:21118967,10863403 +$1,86:21118967,10863403 +) +] +) +g1,86:21318302,10863403 +h1,86:21318302,10863403:0,0,0 +h1,86:21318302,10863403:0,0,0 +) +(1,86:21318302,10863403:3935080,538214,231726 +(1,86:21318302,10863403:1564809,490372,0 +(1,86:21318302,10863403:1564809,490372,0 +x1,86:21846550,10863403 +x1,86:22883111,10863403 +) +) +(1,86:22883111,10863403:279075,538214,179404 +(1,86:22883111,10863403:279075,538214,179404 +x1,86:23162186,10863403 +) +) +(1,86:23162186,10863403:1096365,490372,0 +(1,86:23162186,10863403:1096365,490372,0 +x1,86:24258551,10863403 +) +) +(1,86:24258551,10863403:279075,538214,179404 +(1,86:24258551,10863403:279075,538214,179404 +x1,86:24537626,10863403 +) +) +(1,86:24537626,10863403:528248,490372,0 +(1,86:24537626,10863403:528248,490372,0 +x1,86:25065874,10863403 +) +) +[1,86:25065874,11095129:187508,533521,0 +(1,86:25065874,10561608:32768,0,54616 +h1,86:25065874,10561608:0,0,0 +h1,86:25065874,10561608:0,0,54616 +(1,86:25065874,10561608:0,0,0 +h1,86:25065874,10561608:0,0,0 +) +) +(1,86:25065874,11095129:187508,364089,0 +h1,86:25065874,11095129:0,0,0 +(1,86:25065874,11095129:154740,364089,0 +(1,86:25065874,11095129:154740,364089,0 +x1,86:25220614,11095129 +) +) +) +] +) +g1,86:25412850,10863403 +x1,86:25971000,10863403 +g1,86:26130468,10863403 +h1,86:26130468,10863403:0,0,0 +(1,86:26130468,10863403:2830614,498346,139537 +(1,86:26130468,10863403:2830614,498346,139537 +x1,86:28961082,10863403 +) +) +$1,86:28961082,10863403 +k1,87:30229790,10863403:1268708 +g1,87:30229790,10863403 +) +(1,88:6636830,12740590:23592960,642250,275254 +g1,88:9340190,12740590 +r1,88:9340190,12740590:0,917504,275254 +(1,88:9340190,12740590:0,642250,275254 +k1,88:6636830,12740590:-2703360 +(1,88:6636830,12740590:2703360,642250,275254 +x1,88:8455454,12740590 +g1,88:9340190,12740590 +r1,88:9340190,12740590:0,917504,275254 +g1,88:9340190,12740590 +) +) +x1,88:11340313,12740590 +g1,88:11635225,12740590 +x1,88:13929441,12740590 +x1,88:14556129,12740590 +g1,88:14851041,12740590 +x1,88:17154268,12740590 +r1,88:17154268,12740590:0,917504,275254 +k1,88:30229790,12740590:13075522 +g1,88:30229790,12740590 +) +(1,90:6636830,14095341:23592960,498346,139537 +x1,90:9826255,14095341 +g1,89:10065461,14095341 +x1,89:12140580,14095341 +g1,89:12379786,14095341 +x1,89:13137274,14095341 +x1,89:13834959,14095341 +x1,89:15511401,14095341 +x1,89:15850276,14095341 +x1,89:17185848,14095341 +x1,89:17524723,14095341 +x1,89:17883533,14095341 +k1,90:30229790,14095341:12346257 +g1,90:30229790,14095341 +) +(1,91:6636830,16311916:23592960,825750,353898 +g1,91:9055105,16311916 +r1,91:9055105,16311916:0,1179648,353898 +(1,91:9055105,16311916:0,825750,353898 +k1,91:6636830,16311916:-2418275 +(1,91:6636830,16311916:2418275,825750,353898 +x1,91:7993423,16311916 +g1,91:9055105,16311916 +r1,91:9055105,16311916:0,1179648,353898 +g1,91:9055105,16311916 +) +) +x1,91:12121533,16311916 +g1,91:12475427,16311916 +x1,91:16761366,16311916 +r1,91:16761366,16311916:0,1179648,353898 +k1,91:30229790,16311916:13468424 +g1,91:30229790,16311916 +) +(1,93:6636830,17913847:23592960,498346,139537 +x1,93:9048833,17913847 +x1,92:9766453,17913847 +k1,92:10009392,17913847:242939 +x1,92:11247287,17913847 +k1,92:11490227,17913847:242940 +x1,92:13310192,17913847 +k1,92:13553131,17913847:242939 +x1,92:15191697,17913847 +k1,92:15521839,17913847:330142 +x1,92:17588984,17913847 +k1,92:17831923,17913847:242939 +x1,92:20586787,17913847 +k1,92:20829727,17913847:242940 +x1,92:21208472,17913847 +x1,92:22304835,17913847 +k1,92:22547774,17913847:242939 +x1,92:24062750,17913847 +x1,92:24441493,17913847 +x1,92:25179047,17913847 +x1,92:26215610,17913847 +k1,92:26458550,17913847:242940 +x1,92:27036634,17913847 +x1,92:28392139,17913847 +k1,92:28635078,17913847:242939 +$1,92:28635078,17913847 +(1,92:28635078,17913847:1594712,490372,121595 +(1,92:28635078,17913847:518281,490372,0 +(1,92:28635078,17913847:518281,490372,0 +x1,92:29153359,17913847 +) +) +(1,92:29153359,17913847:0,480404,0 +(1,92:29153359,17913847:558150,480404,0 +(1,92:29153359,17852054:558150,418611,59802 +$1,92:29153359,17852054 +x1,92:29711509,17852054 +$1,92:29711509,17852054 +) +) +k1,92:29153359,17913847:-558150 +) +(1,92:29153359,17913847:558150,356818,121595 +(1,92:29153359,17975640:558150,418611,59802 +$1,92:29153359,17975640 +x1,92:29711509,17975640 +$1,92:29711509,17975640 +) +) +(1,92:29711509,17913847:518281,490372,0 +(1,92:29711509,17913847:518281,490372,0 +x1,92:30229790,17913847 +) +) +) +$1,92:30229790,17913847 +k1,93:30229790,17913847:0 +) +(1,93:6636830,18805137:23592960,542198,183389 +x1,93:8032203,18805137 +g1,92:8271409,18805137 +$1,92:8271409,18805137 +(1,92:8271409,18805137:1594712,542198,183389 +(1,92:8271409,18805137:518281,490372,0 +(1,92:8271409,18805137:518281,490372,0 +x1,92:8789690,18805137 +) +) +(1,92:8789690,18805137:558150,542198,183389 +(1,92:8789690,18805137:0,542198,0 +(1,92:8789690,18805137:558150,542198,0 +(1,92:8789690,18681550:558150,418611,59802 +$1,92:8789690,18681550 +x1,92:9347840,18681550 +$1,92:9347840,18681550 +) +) +k1,92:8789690,18805137:-558150 +) +(1,92:8789690,18805137:0,418611,59802 +$1,92:8789690,18805137 +x1,92:9347840,18805137 +$1,92:9347840,18805137 +k1,92:8789690,18805137:-558150 +) +(1,92:8789690,18805137:558150,295024,183389 +(1,92:8789690,18928724:558150,418611,59802 +$1,92:8789690,18928724 +x1,92:9347840,18928724 +$1,92:9347840,18928724 +) +) +) +(1,92:9347840,18805137:518281,490372,0 +(1,92:9347840,18805137:518281,490372,0 +x1,92:9866121,18805137 +) +) +) +$1,92:9866121,18805137 +g1,92:10105327,18805137 +x1,92:11704025,18805137 +g1,92:11943231,18805137 +x1,92:12341909,18805137 +x1,92:13340598,18805137 +x1,92:14676168,18805137 +x1,92:15975858,18805137 +g1,92:16215064,18805137 +x1,92:18447660,18805137 +g1,92:18686866,18805137 +x1,92:20506831,18805137 +g1,92:20746037,18805137 +x1,92:23748082,18805137 +g1,92:23987288,18805137 +x1,92:24385966,18805137 +x1,92:26020545,18805137 +x1,92:27395985,18805137 +k1,93:30229790,18805137:2833805 +g1,93:30229790,18805137 +) +(1,94:6636830,21021711:23592960,825750,353898 +g1,94:9055105,21021711 +r1,94:9055105,21021711:0,1179648,353898 +(1,94:9055105,21021711:0,825750,353898 +k1,94:6636830,21021711:-2418275 +(1,94:6636830,21021711:2418275,825750,353898 +x1,94:7993423,21021711 +g1,94:9055105,21021711 +r1,94:9055105,21021711:0,1179648,353898 +g1,94:9055105,21021711 +) +) +x1,94:12121533,21021711 +g1,94:12475427,21021711 +x1,94:15851513,21021711 +r1,94:15851513,21021711:0,1179648,353898 +k1,94:30229790,21021711:14378277 +g1,94:30229790,21021711 +) +(1,96:6636830,22623642:23592960,498346,205512 +x1,96:7753128,22623642 +x1,95:8111938,22623642 +x1,95:8450813,22623642 +x1,95:8949159,22623642 +x1,95:9288034,22623642 +k1,95:9447505,22623642:159471 +x1,95:9826250,22623642 +x1,95:10426260,22623642 +x1,95:10824938,22623642 +x1,95:11602360,22623642 +k1,95:11761831,22623642:159471 +x1,95:12359848,22623642 +x1,95:12959858,22623642 +x1,95:13697413,22623642 +x1,95:14179813,22623642 +x1,95:14558558,22623642 +x1,95:15276178,22623642 +k1,95:15435649,22623642:159471 +x1,95:16153269,22623642 +x1,95:17668245,22623642 +k1,95:17827716,22623642:159471 +x1,95:18565271,22623642 +x1,95:19047671,22623642 +x1,95:19805159,22623642 +x1,95:20724112,22623642 +k1,95:20883583,22623642:159471 +x1,95:22278956,22623642 +k1,95:22438427,22623642:159471 +x1,95:23038437,22623642 +x1,95:24214538,22623642 +x1,95:25332830,22623642 +k1,95:25508248,22623642:175418 +x1,95:26110251,22623642 +x1,95:26508929,22623642 +x1,95:27128873,22623642 +x1,95:27607287,22623642 +k1,95:27766758,22623642:159471 +$1,95:27766758,22623642 +(1,95:27766758,22623642:2484097,490372,205512 +(1,95:27766758,22623642:2172797,490372,0 +(1,95:27766758,22623642:2172797,490372,0 +x1,95:29939555,22623642 +) +) +[1,95:29939555,22829154:311300,507307,0 +(1,95:29939555,22321847:32768,0,54616 +h1,95:29939555,22321847:0,0,0 +h1,95:29939555,22321847:0,0,54616 +(1,95:29939555,22321847:0,0,0 +h1,95:29939555,22321847:0,0,0 +) +) +(1,95:29939555,22829154:311300,337875,0 +h1,95:29939555,22829154:0,0,0 +(1,95:29939555,22829154:278532,337875,0 +(1,95:29939555,22829154:278532,337875,0 +x1,95:30218087,22829154 +) +) +) +] +) +$1,95:30250855,22623642 +x1,95:30450194,22623642 +k1,95:30450194,22623642:0 +) +(1,96:6636830,23514932:23592960,498346,205512 +(1,95:6636830,23514932:2849549,490372,205512 +(1,95:6636830,23514932:558150,490372,0 +(1,95:6636830,23514932:558150,490372,0 +x1,95:7194980,23514932 +) +) +[1,95:7194980,23720444:311300,507307,0 +(1,95:7194980,23213137:32768,0,54616 +h1,95:7194980,23213137:0,0,0 +h1,95:7194980,23213137:0,0,54616 +(1,95:7194980,23213137:0,0,0 +h1,95:7194980,23213137:0,0,0 +) +) +(1,95:7194980,23720444:311300,337875,0 +h1,95:7194980,23720444:0,0,0 +(1,95:7194980,23720444:278532,337875,0 +(1,95:7194980,23720444:278532,337875,0 +x1,95:7473512,23720444 +) +) +) +] +(1,95:7506280,23514932:799349,490372,0 +(1,95:7506280,23514932:799349,490372,0 +x1,95:8305629,23514932 +) +) +[1,95:8305629,23720444:311300,507307,0 +(1,95:8305629,23213137:32768,0,54616 +h1,95:8305629,23213137:0,0,0 +h1,95:8305629,23213137:0,0,54616 +(1,95:8305629,23213137:0,0,0 +h1,95:8305629,23213137:0,0,0 +) +) +(1,95:8305629,23720444:311300,337875,0 +h1,95:8305629,23720444:0,0,0 +(1,95:8305629,23720444:278532,337875,0 +(1,95:8305629,23720444:278532,337875,0 +x1,95:8584161,23720444 +) +) +) +] +(1,95:8616929,23514932:558150,490372,0 +(1,95:8616929,23514932:558150,490372,0 +x1,95:9175079,23514932 +) +) +[1,95:9175079,23720444:311300,507307,0 +(1,95:9175079,23213137:32768,0,54616 +h1,95:9175079,23213137:0,0,0 +h1,95:9175079,23213137:0,0,54616 +(1,95:9175079,23213137:0,0,0 +h1,95:9175079,23213137:0,0,0 +) +) +(1,95:9175079,23720444:311300,337875,0 +h1,95:9175079,23720444:0,0,0 +(1,95:9175079,23720444:278532,337875,0 +(1,95:9175079,23720444:278532,337875,0 +x1,95:9453611,23720444 +) +) +) +] +) +$1,95:9486379,23514932 +x1,95:9685718,23514932 +g1,95:9924924,23514932 +x1,95:10323602,23514932 +x1,95:10943546,23514932 +x1,95:11262488,23514932 +x1,95:12000043,23514932 +x1,95:12482443,23514932 +g1,95:12721649,23514932 +x1,95:13190096,23514932 +x1,95:13847913,23514932 +x1,95:15203418,23514932 +g1,95:15442624,23514932 +x1,95:16269881,23514932 +x1,95:16987501,23514932 +x1,95:17585518,23514932 +x1,95:18382874,23514932 +g1,95:18622080,23514932 +x1,95:19618775,23514932 +k1,96:30229790,23514932:10611015 +g1,96:30229790,23514932 +) +(1,97:6636830,25392119:23592960,642250,275254 +g1,97:9340190,25392119 +r1,97:9340190,25392119:0,917504,275254 +(1,97:9340190,25392119:0,642250,275254 +k1,97:6636830,25392119:-2703360 +(1,97:6636830,25392119:2703360,642250,275254 +x1,97:8455454,25392119 +g1,97:9340190,25392119 +r1,97:9340190,25392119:0,917504,275254 +g1,97:9340190,25392119 +) +) +x1,97:12582675,25392119 +r1,97:12582675,25392119:0,917504,275254 +k1,97:30229790,25392119:17647115 +g1,97:30229790,25392119 +) +(1,98:6636830,26820270:23592960,623900,267389 +r1,98:6636830,26820270:0,891289,267389 +x1,98:9378715,26820270 +g1,98:9653800,26820270 +x1,98:10217925,26820270 +x1,98:14261682,26820270 +g1,98:14536767,26820270 +x1,98:16958716,26820270 +r1,98:16958716,26820270:0,891289,267389 +k1,98:30229790,26820270:13271074 +g1,98:30229790,26820270 +) +(1,100:6636830,28175021:23592960,620716,179404 +x1,100:7976388,28175021 +g1,99:8295329,28175021 +x1,99:8694007,28175021 +x1,99:10852848,28175021 +g1,99:11092054,28175021 +x1,99:11560501,28175021 +x1,99:13374484,28175021 +g1,99:13613690,28175021 +x1,99:13892765,28175021 +$1,99:13892765,28175021 +(1,99:13892765,28175021:1754394,620716,177407 +(1,99:13892765,28175021:916959,490372,0 +(1,99:13892765,28175021:916959,490372,0 +x1,99:14809724,28175021 +) +) +[1,99:14809724,28352428:837435,798123,0 +(1,99:14809724,27892180:837435,337875,54616 +h1,99:14809724,27892180:0,0,0 +h1,99:14809724,27892180:0,0,54616 +(1,99:14809724,27892180:804667,337875,54616 +(1,99:14809724,27892180:804667,337875,54616 +x1,99:15614391,27892180 +) +) +) +(1,99:14809724,28352428:32768,0,0 +h1,99:14809724,28352428:0,0,0 +(1,99:14809724,28352428:0,0,0 +h1,99:14809724,28352428:0,0,0 +) +) +] +) +$1,99:15647159,28175021 +x1,99:16125573,28175021 +g1,99:16364779,28175021 +x1,99:19305029,28175021 +g1,99:19544235,28175021 +x1,99:20062516,28175021 +x1,99:21760882,28175021 +g1,99:22000088,28175021 +x1,99:22279163,28175021 +$1,99:22279163,28175021 +(1,99:22279163,28175021:1363065,599601,177407 +(1,99:22279163,28175021:897025,490372,139537 +(1,99:22279163,28175021:897025,490372,139537 +x1,99:23176188,28175021 +) +) +[1,99:23176188,28352428:466040,777008,0 +(1,99:23176188,27892180:466040,316760,54616 +h1,99:23176188,27892180:0,0,0 +h1,99:23176188,27892180:0,0,54616 +(1,99:23176188,27892180:433272,316760,54616 +(1,99:23176188,27892180:433272,316760,54616 +x1,99:23609460,27892180 +) +) +) +(1,99:23176188,28352428:32768,0,0 +h1,99:23176188,28352428:0,0,0 +(1,99:23176188,28352428:0,0,0 +h1,99:23176188,28352428:0,0,0 +) +) +] +) +$1,99:23642228,28175021 +x1,99:24120642,28175021 +k1,100:30229790,28175021:6109148 +g1,100:30229790,28175021 +) +(1,102:6636830,29504148:23592960,623900,267389 +g1,102:12639136,29504148 +(1,102:12639136,29504148:11588347,623900,267389 +g1,102:12639136,29504148 +(1,102:12639136,29504148:0,623900,267389 +[1,102:12639136,29504148:0,623900,267389 +(1,21:12639136,29504148:0,623900,267389 +r1,102:12639136,29504148:0,891289,267389 +) +] +) +(1,102:12639136,29504148:11588347,613059,177407 +$1,102:12639136,29504148 +(1,102:12639136,29504148:11588347,613059,177407 +h1,102:12639136,29504148:0,0,0 +(1,102:12639136,29504148:11588347,613059,177407 +(1,102:12639136,29504148:2723220,490372,59802 +(1,102:12639136,29504148:550424,490372,0 +(1,102:12639136,29504148:550424,490372,0 +$1,102:12639136,29504148 +x1,102:13184016,29504148 +$1,102:13189560,29504148 +) +) +h1,102:13189560,29504148:0,0,0 +(1,102:13189560,29504148:558150,418611,59802 +x1,102:13747710,29504148 +) +h1,102:13747710,29504148:0,0,0 +(1,102:13747710,29504148:1614646,490372,0 +x1,102:15362356,29504148 +) +) +g1,102:15521824,29504148 +x1,102:16079974,29504148 +g1,102:16239442,29504148 +h1,102:16239442,29504148:0,0,0 +(1,102:16239442,29504148:1373031,613059,177407 +(1,102:16239442,29504148:906991,490372,139537 +x1,102:17136467,29504148 +) +[1,102:17146433,29681555:466040,790466,0 +(1,102:17146433,29207849:466040,316760,54616 +h1,102:17146433,29207849:0,0,0 +h1,102:17146433,29207849:0,0,54616 +(1,102:17146433,29207849:433272,316760,54616 +x1,102:17579705,29207849 +) +) +(1,102:17146433,29681555:32768,0,0 +h1,102:17146433,29681555:0,0,0 +h1,102:17146433,29681555:0,0,0 +) +] +) +(1,102:17612473,29504148:1549563,478561,0 +h1,102:17612473,29504148:0,0,0 +g1,102:17811808,29504148 +(1,102:17811808,29504148:1150893,478561,0 +[1,102:17811808,29504148:1150893,478561,0 +(1,102:17811808,29097349:1150893,0,0 +k1,102:17982022,29097349:170214 +g1,102:18699643,29097349 +k1,102:18962701,29097349:170214 +) +(1,102:17811808,29504148:1150893,263276,0 +$1,102:17811808,29504148 +(1,102:17811808,29504148:558150,0,0 +(1,102:17811808,29504148:558150,0,0 +$1,102:17811808,29504148 +(1,102:17811808,29504148:558150,418611,59802 +x1,102:18369958,29504148 +) +$1,102:18369958,29504148 +) +) +(1,102:18108183,29504148:398682,0,0 +$1,102:18108183,29504148 +(1,102:18028449,29504148:558150,0,0 +(1,102:18028449,29504148:558150,0,0 +$1,102:18028449,29504148 +(1,102:18028449,29504148:558150,418611,59802 +x1,102:18586599,29504148 +) +$1,102:18586599,29504148 +) +) +$1,102:18506865,29504148 +) +x1,102:18962701,29504148 +$1,102:18962701,29504148 +) +] +) +g1,102:19162036,29504148 +h1,102:19162036,29504148:0,0,0 +) +(1,102:19162036,29504148:3281370,490372,59802 +(1,102:19162036,29504148:550424,490372,0 +(1,102:19162036,29504148:550424,490372,0 +$1,102:19162036,29504148 +x1,102:19706916,29504148 +$1,102:19712460,29504148 +) +) +h1,102:19712460,29504148:0,0,0 +(1,102:19712460,29504148:558150,418611,59802 +x1,102:20270610,29504148 +) +h1,102:20270610,29504148:0,0,0 +(1,102:20270610,29504148:2172796,490372,0 +x1,102:22443406,29504148 +) +) +g1,102:22602874,29504148 +x1,102:23161024,29504148 +g1,102:23320492,29504148 +h1,102:23320492,29504148:0,0,0 +(1,102:23320492,29504148:906991,490372,139537 +x1,102:24217517,29504148 +) +) +) +$1,102:24227483,29504148 +) +) +g1,102:24227483,29504148 +(1,102:24227483,29504148:0,623900,267389 +(1,102:24227483,29504148:0,0,0 +$1,102:24227483,29504148 +h1,102:24227483,29504148:0,0,0 +$1,102:24227483,29504148 +) +g1,102:24227483,29504148 +) +g1,102:30229789,29504148 +(1,102:30229789,29504148:1,623900,267389 +(1,102:30229790,29504148:0,623900,267389 +k1,102:28754681,29504148:-1475109 +(1,102:28754681,29504148:1475109,623900,267389 +(1,102:28754681,29504148:0,623900,267389 +[1,102:28754681,29504148:0,623900,267389 +(1,21:28754681,29504148:0,623900,267389 +r1,102:28754681,29504148:0,891289,267389 +) +] +) +(1,102:28754681,29504148:1475109,538214,179404 +x1,102:29950715,29504148 +x1,102:30229790,29504148 +) +) +) +) +g1,102:30229790,29504148 +) +(1,104:6636830,31355120:23592960,623900,267389 +r1,104:6636830,31355120:0,891289,267389 +x1,104:9378715,31355120 +g1,104:9653800,31355120 +x1,104:10217925,31355120 +x1,104:14261682,31355120 +g1,104:14536767,31355120 +x1,104:17104232,31355120 +r1,104:17104232,31355120:0,891289,267389 +k1,104:30229790,31355120:13125558 +g1,104:30229790,31355120 +) +(1,107:6636830,32709871:23592960,490372,205512 +x1,107:7976388,32709871 +g1,105:8295329,32709871 +$1,105:8295329,32709871 +(1,105:8295329,32709871:2849549,490372,205512 +(1,105:8295329,32709871:558150,490372,0 +(1,105:8295329,32709871:558150,490372,0 +x1,105:8853479,32709871 +) +) +[1,105:8853479,32915383:311300,507307,0 +(1,105:8853479,32408076:32768,0,54616 +h1,105:8853479,32408076:0,0,0 +h1,105:8853479,32408076:0,0,54616 +(1,105:8853479,32408076:0,0,0 +h1,105:8853479,32408076:0,0,0 +) +) +(1,105:8853479,32915383:311300,337875,0 +h1,105:8853479,32915383:0,0,0 +(1,105:8853479,32915383:278532,337875,0 +(1,105:8853479,32915383:278532,337875,0 +x1,105:9132011,32915383 +) +) +) +] +(1,105:9164779,32709871:799349,490372,0 +(1,105:9164779,32709871:799349,490372,0 +x1,105:9964128,32709871 +) +) +[1,105:9964128,32915383:311300,507307,0 +(1,105:9964128,32408076:32768,0,54616 +h1,105:9964128,32408076:0,0,0 +h1,105:9964128,32408076:0,0,54616 +(1,105:9964128,32408076:0,0,0 +h1,105:9964128,32408076:0,0,0 +) +) +(1,105:9964128,32915383:311300,337875,0 +h1,105:9964128,32915383:0,0,0 +(1,105:9964128,32915383:278532,337875,0 +(1,105:9964128,32915383:278532,337875,0 +x1,105:10242660,32915383 +) +) +) +] +(1,105:10275428,32709871:558150,490372,0 +(1,105:10275428,32709871:558150,490372,0 +x1,105:10833578,32709871 +) +) +[1,105:10833578,32915383:311300,507307,0 +(1,105:10833578,32408076:32768,0,54616 +h1,105:10833578,32408076:0,0,0 +h1,105:10833578,32408076:0,0,54616 +(1,105:10833578,32408076:0,0,0 +h1,105:10833578,32408076:0,0,0 +) +) +(1,105:10833578,32915383:311300,337875,0 +h1,105:10833578,32915383:0,0,0 +(1,105:10833578,32915383:278532,337875,0 +(1,105:10833578,32915383:278532,337875,0 +x1,105:11112110,32915383 +) +) +) +] +) +$1,105:11144878,32709871 +k1,106:30229790,32709871:19084912 +g1,107:30229790,32709871 +) +(1,107:6636830,33601161:23592960,498346,139537 +x1,107:7753129,33601161 +x1,106:9048831,33601161 +g1,106:9288037,33601161 +x1,106:11365149,33601161 +g1,106:11604355,33601161 +x1,106:12760521,33601161 +g1,106:12999727,33601161 +x1,106:13936621,33601161 +x1,106:15232323,33601161 +g1,106:15471529,33601161 +x1,106:18248321,33601161 +g1,106:18487527,33601161 +x1,106:18886205,33601161 +x1,106:21060993,33601161 +g1,106:21300199,33601161 +x1,106:23791936,33601161 +g1,106:24031142,33601161 +x1,106:24409887,33601161 +x1,106:25408575,33601161 +x1,106:26784014,33601161 +k1,107:30229790,33601161:3445776 +g1,107:30229790,33601161 +) +(1,108:6636830,35452134:23592960,623900,267389 +r1,108:6636830,35452134:0,891289,267389 +x1,108:9378715,35452134 +g1,108:9653800,35452134 +x1,108:10217925,35452134 +x1,108:14261682,35452134 +g1,108:14536767,35452134 +x1,108:16364192,35452134 +r1,108:16364192,35452134:0,891289,267389 +k1,108:30229790,35452134:13865598 +g1,108:30229790,35452134 +) +(1,112:6636830,36806885:23592960,490372,205512 +x1,112:7976388,36806885 +g1,109:8295329,36806885 +$1,109:8295329,36806885 +(1,109:8295329,36806885:2484097,490372,205512 +(1,109:8295329,36806885:2172797,490372,0 +(1,109:8295329,36806885:2172797,490372,0 +x1,109:10468126,36806885 +) +) +[1,109:10468126,37012397:311300,507307,0 +(1,109:10468126,36505090:32768,0,54616 +h1,109:10468126,36505090:0,0,0 +h1,109:10468126,36505090:0,0,54616 +(1,109:10468126,36505090:0,0,0 +h1,109:10468126,36505090:0,0,0 +) +) +(1,109:10468126,37012397:311300,337875,0 +h1,109:10468126,37012397:0,0,0 +(1,109:10468126,37012397:278532,337875,0 +(1,109:10468126,37012397:278532,337875,0 +x1,109:10746658,37012397 +) +) +) +] +) +$1,109:10779426,36806885 +k1,110:30229790,36806885:19450364 +g1,112:30229790,36806885 +) +(1,112:6636830,37698175:23592960,498346,139537 +x1,112:8550485,37698175 +k1,110:8773894,37698175:223409 +x1,110:9172572,37698175 +x1,110:9792516,37698175 +x1,110:10191194,37698175 +x1,110:11347360,37698175 +k1,110:11570768,37698175:223408 +x1,110:12886405,37698175 +x1,110:13464488,37698175 +x1,110:14062505,37698175 +k1,110:14285914,37698175:223409 +x1,110:14684592,37698175 +x1,110:15304536,37698175 +x1,110:16062024,37698175 +x1,110:16978983,37698175 +k1,110:17202392,37698175:223409 +x1,110:18801090,37698175 +k1,110:19024499,37698175:223409 +x1,110:19403244,37698175 +x1,110:20003254,37698175 +x1,110:20401932,37698175 +x1,110:21159421,37698175 +x1,110:21641821,37698175 +x1,110:22479045,37698175 +k1,110:22702453,37698175:223408 +x1,110:23420073,37698175 +x1,110:24935049,37698175 +k1,110:25158458,37698175:223409 +x1,110:25557136,37698175 +x1,110:25896012,37698175 +x1,110:26494029,37698175 +x1,110:26872772,37698175 +x1,110:27833586,37698175 +x1,110:28591074,37698175 +k1,110:28814483,37698175:223409 +x1,110:29392567,37698175 +x1,110:29990584,37698175 +x1,110:30229790,37698175 +k1,112:30229790,37698175:0 +) +(1,112:6636830,38589465:23592960,498346,59802 +x1,112:7394318,38589465 +g1,110:7633524,38589465 +$1,110:7633524,38589465 +(1,110:7633524,38589465:1594712,490372,59802 +(1,110:7633524,38589465:518281,490372,0 +(1,110:7633524,38589465:518281,490372,0 +x1,110:8151805,38589465 +) +) +(1,110:8151805,38589465:558150,418611,59802 +x1,110:8709955,38589465 +) +(1,110:8709955,38589465:518281,490372,0 +(1,110:8709955,38589465:518281,490372,0 +x1,110:9228236,38589465 +) +) +) +$1,110:9228236,38589465 +g1,110:9467442,38589465 +x1,110:10065459,38589465 +g1,110:10304665,38589465 +x1,110:10906668,38589465 +x1,110:11484752,38589465 +x1,110:12403705,38589465 +g1,110:12642911,38589465 +x1,110:13021656,38589465 +x1,110:13621666,38589465 +x1,110:14020344,38589465 +x1,110:14399088,38589465 +x1,110:15395783,38589465 +k1,111:30229790,38589465:14834007 +g1,112:30229790,38589465 +) +(1,112:6636830,39480755:23592960,498346,139537 +x1,112:7753129,39480755 +x1,111:9048831,39480755 +k1,111:9384518,39480755:335687 +x1,111:10263603,39480755 +x1,111:10746003,39480755 +x1,111:11346013,39480755 +k1,111:11681699,39480755:335686 +x1,111:12080377,39480755 +x1,111:12700321,39480755 +x1,111:13098999,39480755 +x1,111:14255165,39480755 +k1,111:14590852,39480755:335687 +x1,111:15906489,39480755 +x1,111:16484572,39480755 +x1,111:17082589,39480755 +k1,111:17418276,39480755:335687 +x1,111:19016974,39480755 +k1,111:19352660,39480755:335686 +x1,111:19731405,39480755 +x1,111:20331415,39480755 +x1,111:20730093,39480755 +x1,111:21487582,39480755 +x1,111:21969982,39480755 +x1,111:22807206,39480755 +k1,111:23142893,39480755:335687 +x1,111:24299059,39480755 +k1,111:24634746,39480755:335687 +x1,111:25013491,39480755 +x1,111:25312498,39480755 +x1,111:26349061,39480755 +k1,111:26684747,39480755:335686 +x1,111:27402367,39480755 +x1,111:28917343,39480755 +k1,111:29253030,39480755:335687 +x1,111:29651708,39480755 +x1,111:29990584,39480755 +x1,111:30229790,39480755 +k1,112:30229790,39480755:0 +) +(1,112:6636830,40372045:23592960,498346,139537 +x1,112:7234847,40372045 +x1,112:7613590,40372045 +x1,112:8574404,40372045 +x1,112:9331892,40372045 +k1,111:9680466,40372045:348574 +x1,111:10258550,40372045 +x1,111:10856567,40372045 +x1,111:11614055,40372045 +k1,111:11962630,40372045:348575 +$1,111:11962630,40372045 +(1,111:11962630,40372045:1594712,490372,59802 +(1,111:11962630,40372045:518281,490372,0 +(1,111:11962630,40372045:518281,490372,0 +x1,111:12480911,40372045 +) +) +(1,111:12480911,40372045:558150,418611,59802 +x1,111:13039061,40372045 +) +(1,111:13039061,40372045:518281,490372,0 +(1,111:13039061,40372045:518281,490372,0 +x1,111:13557342,40372045 +) +) +) +$1,111:13557342,40372045 +k1,111:13905916,40372045:348574 +x1,111:14503933,40372045 +k1,111:14852508,40372045:348575 +x1,111:15454511,40372045 +x1,111:16032595,40372045 +x1,111:16951548,40372045 +k1,111:17300122,40372045:348574 +x1,111:17818403,40372045 +k1,111:18166868,40372045:348465 +x1,111:19841315,40372045 +x1,111:20040654,40372045 +x1,111:20419399,40372045 +x1,111:21017416,40372045 +k1,111:21365991,40372045:348575 +x1,111:22661695,40372045 +k1,111:23010269,40372045:348574 +x1,111:23887361,40372045 +x1,111:24923924,40372045 +k1,111:25272499,40372045:348575 +x1,111:25651244,40372045 +x1,111:26747607,40372045 +k1,111:27096181,40372045:348574 +x1,111:27694198,40372045 +x1,111:28451686,40372045 +x1,111:29133425,40372045 +x1,111:29512170,40372045 +x1,111:30229790,40372045 +k1,111:30229790,40372045:0 +) +(1,112:6636830,41263335:23592960,498346,139537 +x1,112:7234847,41263335 +x1,112:7633525,41263335 +x1,112:8291343,41263335 +x1,112:8690021,41263335 +x1,112:9048831,41263335 +x1,112:9387706,41263335 +g1,111:9626912,41263335 +x1,111:10224929,41263335 +x1,111:10866800,41263335 +g1,111:11106006,41263335 +x1,111:12780453,41263335 +x1,111:13139263,41263335 +x1,111:13697412,41263335 +x1,111:14494768,41263335 +g1,111:14733974,41263335 +x1,111:15333984,41263335 +x1,111:16071539,41263335 +x1,111:16553939,41263335 +g1,111:16793145,41263335 +x1,111:17311426,41263335 +x1,111:18308121,41263335 +g1,111:18547327,41263335 +x1,111:19504154,41263335 +x1,111:20600519,41263335 +k1,112:30229790,41263335:9629271 +g1,112:30229790,41263335 +) +(1,113:6636830,43140522:23592960,642250,275254 +g1,113:9340190,43140522 +r1,113:9340190,43140522:0,917504,275254 +(1,113:9340190,43140522:0,642250,275254 +k1,113:6636830,43140522:-2703360 +(1,113:6636830,43140522:2703360,642250,275254 +x1,113:8455454,43140522 +g1,113:9340190,43140522 +r1,113:9340190,43140522:0,917504,275254 +g1,113:9340190,43140522 +) +) +x1,113:12448509,43140522 +r1,113:12448509,43140522:0,917504,275254 +k1,113:30229790,43140522:17781281 +g1,113:30229790,43140522 +) +] +(1,115:6636830,45679049:23592960,0,0 +h1,115:6636830,45679049:23592960,0,0 +) +] +] +!31477 +}7 +Input:71:test.aux +!36 +Postamble: +Count:6909 +!26 +Post scriptum: diff --git a/Build/source/texk/web2c/synctexdir/tests/story-zapfino.tex b/Build/source/texk/web2c/synctexdir/tests/story-zapfino.tex new file mode 100644 index 00000000000..d928645ab61 --- /dev/null +++ b/Build/source/texk/web2c/synctexdir/tests/story-zapfino.tex @@ -0,0 +1,24 @@ +%!TEX TS-program = xetex +%!TEX encoding = UTF-8 Unicode + +% story.tex, with special characters converted to Unicode, and Zapfino font declarations +\nopagenumbers + +\font\body="Zapfino" at 10pt \body +\font\title="Zapfino:Stylistic Variants=First variant glyph set" at 12pt +\font\author="Zapfino:Stylistic Variants=Second variant glyph set" at 10pt + +\hrule +\vskip 1in +\centerline{\title A \ SHORT \ STORY} +\vskip 6pt +\centerline{\author by A. U. Thor} +\vskip .5cm +Once upon a time, in a distant galaxy called Ööç, +there lived a computer named R.~J. Drofnats. + +Mr.~Drofnats—or “R. J.,” as he preferred to be called—was happiest when he was at work +typesetting beautiful documents. +\vskip 1in +\hrule +\bye diff --git a/Build/source/texk/web2c/synctexdir/tests/test file.sh b/Build/source/texk/web2c/synctexdir/tests/test file.sh new file mode 100755 index 00000000000..598295348ad --- /dev/null +++ b/Build/source/texk/web2c/synctexdir/tests/test file.sh @@ -0,0 +1,192 @@ +#! /bin/sh +# this file is part of the synctex package +# it is a unit test to enlight any malfunction of the _synctex_get_name function +# This script can be sourced with "synctex" command available +# The test is a SUCCESS if no "FAILURE" appears in the output + +mkdir -p synctex_tests/foo/bar +mkdir -p synctex_tests/bar +cp ../source/texk/web2c/synctexdir/unit\ tests/footest.synctex synctex_tests +cp ../source/texk/web2c/synctexdir/unit\ tests/bartest.synctex.gz synctex_tests +rm synctex_tests/bartest.synctex +cp ../source/texk/web2c/synctexdir/unit\ tests/story-zapfino.tex synctex_tests +cd synctex_tests +which synctex +synctex test file -o footest.pdf +# +echo "-------------------------------- A-1" +synctex view -i 1:0:test.tex -o footest +synctex edit -o 1:0:0:bartest.pdf +synctex update -o footest.pdf -m 2000 -x 212 -y 734 +cat test.synctex +synctex update -o bartest.pdf -m 2000 -x 212 -y 734 +gunzip bartest.synctex.gz +echo "test diff" +diff footest.synctex bartest.synctex +echo "test done" +#pdflatex -synctex=1 story-zapfino.tex +exit 0 +function my_touch { + sleep 1 + touch $1 +} +function my_test { + # syntax test output build touched expected mode YES + echo " +================================" + echo "output:$1" + echo "build:$2" + if test -z "$2" + then + if test -z "$(synctex test file -o "$1"|grep "file name:$3\$")" || test -z "$(synctex test file -o "$1"|grep "mode:$4")" + then + if test "YES" = "$5" + then + echo "!!!!!!!!!!!!!!!" + echo "! FAILURE 1 !" + echo "!!!!!!!!!!!!!!!" + synctex test file -o "$1" + else + echo "SUCCESS" + ls -R + fi + else + if test "YES" = "$5" + then + echo "SUCCESS" + else + echo "!!!!!!!!!!!!!!!" + echo "! FAILURE 2 !" + echo "!!!!!!!!!!!!!!!" + synctex test file -o "$1" + fi + fi + else + if test -z "$(synctex test file -o "$1" -d "$2"|grep "file name:$3\$")" || test -z "$(synctex test file -o "$1" -d "$2"|grep "mode:$4")" + then + if test "YES" = "$5" + then + echo "!!!!!!!!!!!!!!!" + echo "! FAILURE 3 !" + echo "!!!!!!!!!!!!!!!" + synctex test file -o "$1" -d "$2" + else + echo "SUCCESS" + ls -R + fi + else + if test "YES" = "$5" + then + echo "SUCCESS" + else + echo "!!!!!!!!!!!!!!!" + echo "! FAILURE 4 !" + echo "!!!!!!!!!!!!!!!" + synctex test file -o "$1" -d "$2" + fi + fi + fi +} +echo "-------------------------------- B-1" +my_touch foo.synctex.gz +my_touch foo.synctex +my_touch bar/foo.synctex +my_touch bar/foo.synctex.gz +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_test foo.pdf "" foo.synctex none YES +my_touch foo.synctex +my_touch foo.synctex.gz +my_touch bar/foo.synctex +my_touch bar/foo.synctex.gz +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_test foo.pdf "" foo.synctex.gz gz YES +echo "-------------------------------- B-2" +my_touch bar/foo.synctex.gz +my_touch bar/foo.synctex +my_touch foo.synctex +my_touch foo.synctex.gz +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_test bar/foo.pdf "" bar/foo.synctex none YES +my_touch bar/foo.synctex +my_touch bar/foo.synctex.gz +my_touch foo.synctex +my_touch foo.synctex.gz +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_test bar/foo.pdf "" bar/foo.synctex.gz gz YES +echo "-------------------------------- B-3" +my_touch foo/bar/foo.synctex.gz +my_touch foo/bar/foo.synctex +my_touch foo.synctex +my_touch foo.synctex.gz +my_touch bar/foo.synctex.gz +my_touch bar/foo.synctex +my_test foo/bar/foo.pdf "" foo/bar/foo.synctex none YES +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_touch foo.synctex +my_touch foo.synctex.gz +my_touch bar/foo.synctex.gz +my_touch bar/foo.synctex +my_test foo/bar/foo.pdf "" foo/bar/foo.synctex.gz gz YES +echo "-------------------------------- B-4" +my_touch bar/foo.synctex +my_touch bar/foo.synctex.gz +my_touch foo.synctex.gz +my_touch foo.synctex +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_test foo.pdf bar foo.synctex none YES +my_touch bar/foo.synctex +my_touch bar/foo.synctex.gz +my_touch foo.synctex +my_touch foo.synctex.gz +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_test foo.pdf bar foo.synctex.gz gz YES +my_touch foo.synctex +my_touch foo.synctex.gz +my_touch bar/foo.synctex.gz +my_touch bar/foo.synctex +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_test foo.pdf bar bar/foo.synctex none YES +my_touch foo.synctex +my_touch foo.synctex.gz +my_touch bar/foo.synctex +my_touch bar/foo.synctex.gz +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_test foo.pdf bar bar/foo.synctex.gz gz YES +echo "-------------------------------- B-5" +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_touch bar/foo.synctex.gz +my_touch bar/foo.synctex +my_touch foo.synctex.gz +my_touch foo.synctex +my_test bar/foo.pdf foo bar/foo.synctex none YES +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_touch bar/foo.synctex +my_touch bar/foo.synctex.gz +my_touch foo.synctex.gz +my_touch foo.synctex +my_test bar/foo.pdf foo bar/foo.synctex.gz gz YES +my_touch bar/foo.synctex.gz +my_touch bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_touch foo/bar/foo.synctex +my_touch foo.synctex.gz +my_touch foo.synctex +my_test bar/foo.pdf foo foo/bar/foo.synctex none YES +my_touch bar/foo.synctex +my_touch bar/foo.synctex.gz +my_touch foo/bar/foo.synctex +my_touch foo/bar/foo.synctex.gz +my_touch foo.synctex.gz +my_touch foo.synctex +my_test bar/foo.pdf foo foo/bar/foo.synctex.gz gz YES |