summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/synctexdir
diff options
context:
space:
mode:
authorJérôme Laurens <jerome.laurens@u-bourgogne.fr>2009-07-08 11:35:32 +0000
committerJérôme Laurens <jerome.laurens@u-bourgogne.fr>2009-07-08 11:35:32 +0000
commitc22898f94bcbefb6ac42d8d109cdc298fc646007 (patch)
tree9ec375267ec93c2c47f5b7619440687f44d8287d /Build/source/texk/web2c/synctexdir
parentd68114f5117e9ca6c33a676b9b239a5617196baa (diff)
First synctex update, it might need some fine tuning in order to work on all platforms.\nSee the file synctex_parser_history.txt for more details.
git-svn-id: svn://tug.org/texlive/trunk@14186 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/synctexdir')
-rw-r--r--Build/source/texk/web2c/synctexdir/am/synctex.am2
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-common.h2
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-e-mem.ch04
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-e-mem.ch14
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-e-rec.ch06
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-e-rec.ch14
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-etex.h4
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-mem.ch044
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-mem.ch14
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-mem.ch24
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-pdf-rec.ch224
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-pdftex.h4
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-rec.ch012
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-rec.ch18
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-rec.ch24
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-tex.h4
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-xe-mem.ch24
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-xe-rec.ch26
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-xe-rec.ch34
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex-xetex.h4
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex.c262
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex.defines7
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex.h4
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex_main.c498
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex_parser.c2950
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex_parser.h335
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex_parser_local.h8
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex_parser_readme.txt74
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex_parser_utils.c451
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex_parser_utils.h125
-rw-r--r--Build/source/texk/web2c/synctexdir/synctex_parser_version.txt1
-rw-r--r--Build/source/texk/web2c/synctexdir/tests/LM-Volume-manuscript.tex6
-rw-r--r--Build/source/texk/web2c/synctexdir/tests/bartest.synctex.gzbin0 -> 33531 bytes
-rw-r--r--Build/source/texk/web2c/synctexdir/tests/footest.synctex8587
-rw-r--r--Build/source/texk/web2c/synctexdir/tests/story-zapfino.tex24
-rwxr-xr-xBuild/source/texk/web2c/synctexdir/tests/test file.sh192
36 files changed, 11993 insertions, 1683 deletions
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,&quoted,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
new file mode 100644
index 00000000000..7cdd7cb2dab
--- /dev/null
+++ b/Build/source/texk/web2c/synctexdir/tests/bartest.synctex.gz
Binary files differ
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