summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am8
-rw-r--r--configure.ac6
-rw-r--r--packaging/cairo.spec20
-rw-r--r--perf/.gitignore30
-rw-r--r--perf/COPYING5
-rw-r--r--perf/Makefile.am154
-rw-r--r--perf/Makefile.sources38
-rw-r--r--perf/Makefile.win3278
-rw-r--r--perf/README239
-rw-r--r--perf/cairo-analyse-trace.c592
-rw-r--r--perf/cairo-perf-chart.c1113
-rw-r--r--perf/cairo-perf-compare-backends.c398
-rwxr-xr-xperf/cairo-perf-diff255
-rw-r--r--perf/cairo-perf-diff-files.c506
-rwxr-xr-xperf/cairo-perf-graph206
-rw-r--r--perf/cairo-perf-graph-files.c604
-rw-r--r--perf/cairo-perf-graph-widget.c604
-rw-r--r--perf/cairo-perf-graph.h63
-rw-r--r--perf/cairo-perf-micro.c594
-rw-r--r--perf/cairo-perf-print.c139
-rw-r--r--perf/cairo-perf-report.c454
-rw-r--r--perf/cairo-perf-trace.c1067
-rw-r--r--perf/cairo-perf.c98
-rw-r--r--perf/cairo-perf.h250
-rw-r--r--perf/cairo-stats.c182
-rw-r--r--perf/cairo-stats.h52
-rw-r--r--perf/dirent-win32.h102
-rwxr-xr-xperf/make-html.py88
-rw-r--r--perf/micro/Makefile.am16
-rw-r--r--perf/micro/Makefile.sources51
-rw-r--r--perf/micro/Makefile.win3212
-rw-r--r--perf/micro/a1-curve.c112
-rw-r--r--perf/micro/a1-line.c223
-rw-r--r--perf/micro/box-outline.c215
-rw-r--r--perf/micro/cairo-perf-cover.c339
-rw-r--r--perf/micro/composite-checker.c117
-rw-r--r--perf/micro/curve.c111
-rw-r--r--perf/micro/disjoint.c101
-rw-r--r--perf/micro/dragon.c277
-rw-r--r--perf/micro/fill-clip.c126
-rw-r--r--perf/micro/fill.c122
-rw-r--r--perf/micro/glyphs.c202
-rw-r--r--perf/micro/hash-table.c115
-rw-r--r--perf/micro/hatching.c202
-rw-r--r--perf/micro/intersections.c160
-rw-r--r--perf/micro/line.c222
-rw-r--r--perf/micro/long-dashed-lines.c74
-rw-r--r--perf/micro/long-lines.c148
-rw-r--r--perf/micro/many-curves.c135
-rw-r--r--perf/micro/many-fills.c187
-rw-r--r--perf/micro/many-strokes.c186
-rw-r--r--perf/micro/mask.c305
-rw-r--r--perf/micro/mosaic.c176
-rw-r--r--perf/micro/mosaic.h4387
-rw-r--r--perf/micro/paint-with-alpha.c59
-rw-r--r--perf/micro/paint.c57
-rw-r--r--perf/micro/pattern_create_radial.c106
-rw-r--r--perf/micro/pixel.c237
-rw-r--r--perf/micro/pythagoras-tree.c95
-rw-r--r--perf/micro/rectangles.c121
-rw-r--r--perf/micro/rounded-rectangles.c144
-rw-r--r--perf/micro/sierpinski.c94
-rw-r--r--perf/micro/spiral.c352
-rw-r--r--perf/micro/stroke.c100
-rw-r--r--perf/micro/subimage_copy.c80
-rw-r--r--perf/micro/tessellate.c181
-rw-r--r--perf/micro/text.c69
-rw-r--r--perf/micro/tiger.c115
-rw-r--r--perf/micro/twin.c59
-rw-r--r--perf/micro/unaligned-clip.c73
-rw-r--r--perf/micro/wave.c115
-rw-r--r--perf/micro/wide-fills.c187
-rw-r--r--perf/micro/wide-strokes.c188
-rw-r--r--perf/micro/world-map.c149
-rw-r--r--perf/micro/world-map.h196
-rw-r--r--perf/micro/zrusin-another.h668
-rw-r--r--perf/micro/zrusin.c97
-rw-r--r--util/Makefile.am6
-rw-r--r--util/cairo-fdr/Makefile.am15
-rw-r--r--util/cairo-fdr/fdr.c331
-rw-r--r--util/cairo-sphinx/.gitignore1
-rw-r--r--util/cairo-sphinx/Makefile.am43
-rw-r--r--util/cairo-sphinx/fdr.c261
-rw-r--r--util/cairo-sphinx/sphinx.c1545
-rw-r--r--util/cairo-trace/.gitignore1
-rw-r--r--util/cairo-trace/COPYING5
-rw-r--r--util/cairo-trace/COPYING-GPL-3674
-rw-r--r--util/cairo-trace/Makefile.am40
-rw-r--r--util/cairo-trace/cairo-trace.in136
-rw-r--r--util/cairo-trace/lookup-symbol.c331
-rw-r--r--util/cairo-trace/lookup-symbol.h24
-rw-r--r--util/cairo-trace/trace.c5581
92 files changed, 19 insertions, 28783 deletions
diff --git a/Makefile.am b/Makefile.am
index 03fa35236..a797f2b9e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -16,11 +16,15 @@ EXTRA_DIST += \
ACLOCAL_AMFLAGS = -I build ${ACLOCAL_FLAGS}
-DIST_SUBDIRS = src doc util boilerplate test perf
+#DIST_SUBDIRS = src doc util boilerplate test perf
+#SUBDIRS = src doc util
+DIST_SUBDIRS = src doc util boilerplate test
SUBDIRS = src doc util
+
# libpng is required for our test programs
if CAIRO_HAS_PNG_FUNCTIONS
-SUBDIRS += boilerplate test perf
+#SUBDIRS += boilerplate test perf
+SUBDIRS += boilerplate test
endif
configure: cairo-version.h
diff --git a/configure.ac b/configure.ac
index e4a92d4d3..1ace52bf7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -920,17 +920,11 @@ boilerplate/Makefile
src/Makefile
test/Makefile
test/pdiff/Makefile
-perf/Makefile
-perf/micro/Makefile
util/Makefile
-util/cairo-fdr/Makefile
util/cairo-gobject/Makefile
util/cairo-missing/Makefile
util/cairo-script/Makefile
util/cairo-script/examples/Makefile
-util/cairo-sphinx/Makefile
-util/cairo-trace/Makefile
-util/cairo-trace/cairo-trace
doc/Makefile
doc/public/Makefile
])
diff --git a/packaging/cairo.spec b/packaging/cairo.spec
index 850546ee8..e25c15d00 100644
--- a/packaging/cairo.spec
+++ b/packaging/cairo.spec
@@ -203,16 +203,16 @@ make %{?_smp_mflags} V=1
%license util/cairo-script/COPYING
%{_libdir}/libcairo-script-interpreter.so.*
-%files -n tools
-%manifest %{name}.manifest
-%defattr(-, root, root)
-%license util/cairo-trace/COPYING util/cairo-trace/COPYING-GPL-3
-%{_bindir}/cairo-sphinx
-%{_bindir}/cairo-trace
-%dir %{_libdir}/cairo
-%{_libdir}/cairo/cairo-fdr.so*
-%{_libdir}/cairo/cairo-sphinx.so*
-%{_libdir}/cairo/libcairo-trace.so*
+#%files -n tools
+#%manifest %{name}.manifest
+#%defattr(-, root, root)
+#%license util/cairo-trace/COPYING util/cairo-trace/COPYING-GPL-3
+#%{_bindir}/cairo-sphinx
+#%{_bindir}/cairo-trace
+#%dir %{_libdir}/cairo
+#%{_libdir}/cairo/cairo-fdr.so*
+#%{_libdir}/cairo/cairo-sphinx.so*
+#%{_libdir}/cairo/libcairo-trace.so*
%files devel
%manifest %{name}.manifest
diff --git a/perf/.gitignore b/perf/.gitignore
deleted file mode 100644
index 02af7a93c..000000000
--- a/perf/.gitignore
+++ /dev/null
@@ -1,30 +0,0 @@
-TAGS
-tags
-cairo-analyse-trace
-cairo-perf
-cairo-perf-micro
-cairo-perf-print
-cairo-perf-trace
-cairo-perf-chart
-cairo-perf-compare-backends
-cairo-perf-diff-files
-cairo-perf-graph-files
-cairo-traces
-valgrind-log
-callgrind.out.*
-index.html
-*.png
-*.perf
-*.o
-*.gcda
-*.gcno
-*.exe
-*.manifest
-*.obj
-*.ilk
-*.suo
-*.lib
-*.pdb
-*~
-.*.sw?
-*.data
diff --git a/perf/COPYING b/perf/COPYING
deleted file mode 100644
index 17754cf7b..000000000
--- a/perf/COPYING
+++ /dev/null
@@ -1,5 +0,0 @@
-Cairo is free software.
-
-These tests are mainly available under a liberal MIT license to simplify
-any use of the code for reference purposes. Please check the opening comment
-of each file for copyright and licensing information.
diff --git a/perf/Makefile.am b/perf/Makefile.am
deleted file mode 100644
index 40b35bc38..000000000
--- a/perf/Makefile.am
+++ /dev/null
@@ -1,154 +0,0 @@
-include $(top_srcdir)/build/Makefile.am.common
-
-include $(top_srcdir)/perf/Makefile.sources
-
-AM_CPPFLAGS = \
- -I$(srcdir) \
- -I$(top_srcdir)/boilerplate \
- -I$(top_srcdir)/src \
- -I$(top_srcdir)/util/cairo-missing \
- -I$(top_srcdir)/util/cairo-script \
- -I$(top_builddir)/src \
- $(CAIRO_CFLAGS)
-
-AM_LDFLAGS = $(CAIRO_LDFLAGS)
-
-SUBDIRS = micro
-
-noinst_PROGRAMS = \
- cairo-analyse-trace \
- cairo-perf-trace \
- cairo-perf-micro \
- $(NULL)
-
-EXTRA_PROGRAMS += \
- cairo-analyse-trace \
- cairo-perf-micro \
- cairo-perf-trace \
- cairo-perf-diff-files \
- cairo-perf-print \
- cairo-perf-chart \
- cairo-perf-compare-backends \
- cairo-perf-graph-files \
- $(NULL)
-EXTRA_DIST += cairo-perf-diff COPYING
-EXTRA_LTLIBRARIES += libcairoperf.la
-
-LDADD = libcairoperf.la \
- $(top_builddir)/boilerplate/libcairoboilerplate.la \
- $(top_builddir)/src/libcairo.la
-
-cairo_perf_micro_SOURCES = $(cairo_perf_micro_sources)
-cairo_perf_micro_LDADD = \
- $(top_builddir)/perf/micro/libcairo-perf-micro.la \
- $(LDADD)
-cairo_perf_micro_DEPENDENCIES = \
- $(top_builddir)/perf/micro/libcairo-perf-micro.la \
- $(LDADD)
-
-libcairoperf_la_SOURCES = \
- $(libcairoperf_sources) \
- $(libcairoperf_external_sources) \
- $(libcairoperf_headers) \
- $(NULL)
-
-cairo_analyse_trace_SOURCES = \
- $(cairo_analyse_trace_sources) \
- $(cairo_analyse_trace_external_sources)
-cairo_analyse_trace_LDADD = \
- $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \
- $(top_builddir)/util/cairo-missing/libcairo-missing.la \
- $(LDADD)
-cairo_analyse_trace_DEPENDENCIES = \
- $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \
- $(top_builddir)/util/cairo-missing/libcairo-missing.la \
- $(LDADD)
-
-cairo_perf_trace_SOURCES = \
- $(cairo_perf_trace_sources) \
- $(cairo_perf_trace_external_sources)
-cairo_perf_trace_LDADD = \
- $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \
- $(top_builddir)/util/cairo-missing/libcairo-missing.la \
- $(LDADD)
-cairo_perf_trace_DEPENDENCIES = \
- $(top_builddir)/util/cairo-script/libcairo-script-interpreter.la \
- $(top_builddir)/util/cairo-missing/libcairo-missing.la \
- $(LDADD)
-
-cairo_perf_diff_files_SOURCES = $(cairo_perf_diff_files_sources)
-cairo_perf_print_SOURCES = $(cairo_perf_print_sources)
-cairo_perf_chart_SOURCES = $(cairo_perf_chart_sources)
-cairo_perf_compare_backends_SOURCES = $(cairo_perf_compare_backends_sources)
-
-cairo_perf_graph_files_SOURCES = \
- $(cairo_perf_graph_files_sources) \
- $(cairo_perf_graph_files_headers)
-cairo_perf_graph_files_CFLAGS = @gtk_CFLAGS@
-cairo_perf_graph_files_LDADD = @gtk_LIBS@ $(LDADD)
-
-# Install rules to rebuild the libraries and add explicit dependencies
-$(top_builddir)/perf/micro/libcairo-perf-micro.la:
- cd $(top_builddir)/perf/micro && $(MAKE) $(AM_MAKEFLAGS) libcairo-perf-micro.la
-
-$(top_builddir)/boilerplate/libcairoboilerplate.la: $(top_builddir)/src/libcairo.la
- cd $(top_builddir)/boilerplate && $(MAKE) $(AM_MAKEFLAGS) libcairoboilerplate.la
-
-$(top_builddir)/src/libcairo.la:
- cd $(top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) libcairo.la
-
-$(top_builddir)/util/cairo-script/libcairo-script-interpreter.la: $(top_builddir)/src/libcairo.la
- cd $(top_builddir)/util/cairo-script && $(MAKE) $(AM_MAKEFLAGS) libcairo-script-interpreter.la
-
-
-# Do a funny transition of CAIRO_TEST_TARGET through TARGETS such that
-# one can limit tested targets both through CAIRO_TEST_TARGET env var
-# and TARGETS make var on the command line. Same for the rest.
-TARGETS = $(CAIRO_TEST_TARGET)
-TARGETS_EXCLUDE = $(CAIRO_TEST_TARGET_EXCLUDE)
-FORMAT = $(CAIRO_TEST_TARGET_FORMAT)
-ITERS = $(CAIRO_PERF_ITERATIONS)
-
-CAIRO_PERF_ENVIRONMENT = CAIRO_PERF_ITERATIONS="$(ITERS)" CAIRO_TEST_TARGET="$(TARGETS)" CAIRO_TEST_TARGET_FORMAT="$(FORMAT)" CAIRO_TEST_TARGET_EXCLUDE="$(TARGETS_EXCLUDE)"
-
-perf: cairo-perf-micro$(EXEEXT) cairo-perf-trace$(EXEEXT)
- -$(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-micro$(EXEEXT)
- -$(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-trace$(EXEEXT)
-
-html-local: index.html
-
-perf-tag.html : cairo-perf-micro${EXEEXT}
- $(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-diff -t -h $@ `git describe --abbrev=0` HEAD
-perf-commit.html : cairo-perf-micro${EXEEXT}
- $(CAIRO_PERF_ENVIRONMENT) ./cairo-perf-diff -t -h $@ HEAD
-
-# Summarise changes in index.html, with details in links
-index.html: perf-tag.html perf-commit.html
- echo "<html><head><title>Performance Changes</title></head><body>Against <a href=\"perf-tag.html\">"`git describe --abbrev=0`"</a><br><a href=\"perf-commit.html\">Latest commit</a></body>" > $@
-
-EXTRA_VALGRIND_FLAGS = $(CAIRO_EXTRA_VALGRIND_FLAGS)
-VALGRIND_MEMCHECK_FLAGS = \
- --tool=memcheck \
- --suppressions=$(top_srcdir)/test/.valgrind-suppressions \
- --leak-check=yes --show-reachable=yes
-VALGRIND_CALLGRIND_FLAGS = \
- --tool=callgrind
-CLEANFILES += \
- valgrind-log \
- callgrind.out.* \
- index.html
-
-perf-valgrind:
- $(MAKE) $(AM_MAKEFLAGS) perf \
- $(top_builddir)/libtool --mode=execute \
- valgrind $(VALGRIND_MEMCHECK_FLAGS) $(EXTRA_VALGRIND_FLAGS)' \
- | tee valgrind-log
-
-perf-callgrind:
- $(MAKE) $(AM_MAKEFLAGS) perf \
- $(top_builddir)/libtool --mode=execute \
- valgrind $(VALGRIND_CALLGRIND_FLAGS) $(EXTRA_VALGRIND_FLAGS)'
-
-.PHONY: perf perf-valgrind perf-callgrind
-
-EXTRA_DIST += Makefile.win32
diff --git a/perf/Makefile.sources b/perf/Makefile.sources
deleted file mode 100644
index 1fcf14809..000000000
--- a/perf/Makefile.sources
+++ /dev/null
@@ -1,38 +0,0 @@
-libcairoperf_sources = \
- cairo-perf.c \
- cairo-perf-report.c \
- cairo-stats.c \
- $(NULL)
-
-libcairoperf_external_sources = ../src/cairo-time.c
-
-libcairoperf_headers = \
- cairo-perf.h \
- cairo-stats.h \
- $(NULL)
-
-cairo_analyse_trace_sources = cairo-analyse-trace.c
-cairo_analyse_trace_external_sources = ../src/cairo-error.c
-
-cairo_perf_trace_sources = cairo-perf-trace.c
-cairo_perf_trace_external_sources = \
- ../src/cairo-error.c \
- ../src/cairo-hash.c \
- $(NULL)
-
-cairo_perf_micro_sources = cairo-perf-micro.c
-
-cairo_perf_diff_files_sources = cairo-perf-diff-files.c
-
-cairo_perf_print_sources = cairo-perf-print.c
-
-cairo_perf_chart_sources = cairo-perf-chart.c
-
-cairo_perf_compare_backends_sources = cairo-perf-compare-backends.c
-
-cairo_perf_graph_files_sources = \
- cairo-perf-graph-files.c \
- cairo-perf-graph-widget.c \
- $(NULL)
-
-cairo_perf_graph_files_headers = cairo-perf-graph.h
diff --git a/perf/Makefile.win32 b/perf/Makefile.win32
deleted file mode 100644
index 084abf00e..000000000
--- a/perf/Makefile.win32
+++ /dev/null
@@ -1,78 +0,0 @@
-top_srcdir = ..
-include $(top_srcdir)/build/Makefile.win32.common
-include $(top_srcdir)/perf/Makefile.sources
-
-CFLAGS += -I$(top_srcdir)/boilerplate -I$(top_srcdir)/util/cairo-script/
-
-PERF_LIBS = \
- $(CFG)/libcairoperf.lib \
- $(top_builddir)/boilerplate/$(CFG)/boiler.lib \
- $(top_builddir)/src/$(CFG)/cairo-static.lib \
- $(NULL)
-
-PERF_EXES = \
- $(CFG)/cairo-perf-trace.exe \
- $(CFG)/cairo-perf-micro.exe \
- $(CFG)/cairo-perf-diff-files.exe \
- $(CFG)/cairo-perf-print.exe \
- $(CFG)/cairo-perf-chart.exe \
- $(CFG)/cairo-perf-compare-backends.exe \
- $(NULL)
-
-all: inform $(PERF_EXES)
-
-perf: inform $(CFG)/cairo-perf-micro.exe
- ./$(CFG)/cairo-perf-micro.exe
-
-
-libcairoperf_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(libcairoperf_sources))
-
-$(CFG)/libcairoperf.lib: $(libcairoperf_OBJECTS)
- @$(AR) $(CAIRO_ARFLAGS) -OUT:$@ $(libcairoperf_OBJECTS)
-
-cairo_perf_trace_OBJECTS = \
- $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_trace_sources)) \
- $(top_builddir)/util/cairo-script/$(CFG)/libcairo-script-interpreter.lib \
- $(NULL)
-
-cairo_perf_micro_OBJECTS = \
- $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_micro_sources)) \
- ./micro/$(CFG)/libcairo-perf-micro.lib \
- $(NULL)
-
-cairo_perf_diff_files_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_diff_files_sources))
-cairo_perf_print_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_print_sources))
-cairo_perf_chart_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_chart_sources))
-cairo_perf_compare_backends_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(cairo_perf_compare_backends_sources))
-
-
-$(CFG)/cairo-perf-trace.exe: $(cairo_perf_trace_OBJECTS) $(PERF_LIBS)
- @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_trace_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS)
-
-$(CFG)/cairo-perf-micro.exe: $(cairo_perf_micro_OBJECTS) $(PERF_LIBS)
- @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_micro_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS)
-
-$(CFG)/cairo-perf-diff-files.exe: $(cairo_perf_diff_files_OBJECTS) $(PERF_LIBS)
- @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_diff_files_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS)
-
-$(CFG)/cairo-perf-print.exe: $(cairo_perf_print_OBJECTS) $(PERF_LIBS)
- @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_print_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS)
-
-$(CFG)/cairo-perf-chart.exe: $(cairo_perf_chart_OBJECTS) $(PERF_LIBS)
- @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_chart_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS)
-
-$(CFG)/cairo-perf-compare-backends.exe: $(cairo_perf_compare_backends_OBJECTS) $(PERF_LIBS)
- @$(LD) $(CAIRO_LDFLAGS) -OUT:$@ $(cairo_perf_compare_backends_OBJECTS) $(PERF_LIBS) $(CAIRO_LIBS)
-
-
-./micro/$(CFG)/libcairo-perf-micro.lib:
- $(MAKE) -C micro -f Makefile.win32
-
-$(top_builddir)/src/$(CFG)/cairo-static.lib:
- $(MAKE) -C $(top_srcdir)/src -f Makefile.win32
-
-$(top_builddir)/boilerplate/$(CFG)/boiler.lib:
- $(MAKE) -C $(top_srcdir)/boilerplate -f Makefile.win32
-
-$(top_builddir)/util/cairo-script/$(CFG)/libcairo-script-interpreter.lib:
- $(MAKE) -C $(top_srcdir)/util/cairo-script -f Makefile.win32
diff --git a/perf/README b/perf/README
deleted file mode 100644
index 9e402098a..000000000
--- a/perf/README
+++ /dev/null
@@ -1,239 +0,0 @@
-This is cairo's micro-benchmark performance test suite.
-
-One of the simplest ways to run this performance suite is:
-
- make perf
-
-which will give a report of the speed of each individual test. See
-more details on other options for running the suite below.
-
-A macro test suite (with full traces and more intensive benchmarks) is
-also available; for this, see http://cgit.freedesktop.org/cairo-traces.
-The macro-benchmarks are better measures of actual real-world
-performance, and should be preferred over the micro-benchmarks (and over
-make perf) for identifying performance regressions or improvements. If
-you copy or symlink this repository at cairo/perf/cairo-traces, then
-make perf will run those tests as well.
-
-Running the micro-benchmarks
-----------------------------
-The micro-benchmark performance suite is composed of a series of
-hand-written, short, synthetic tests that measure the speed of doing a
-simple operation such as painting a surface or showing glyphs. These aim
-to give very good feedback on whether a performance related patch is
-successful without causing any performance degradations elsewhere.
-
-The micro-benchmarks are compiled into a single executable called
-cairo-perf-micro, which is what "make perf" executes. Some
-examples of running it:
-
- # Report on all tests with default number of iterations:
- ./cairo-perf-micro
-
- # Report on 100 iterations of all gradient tests:
- ./cairo-perf-micro -i 100 gradient
-
- # Generate raw results for 10 iterations into cairo.perf
- ./cairo-perf-micro -r -i 10 > cairo.perf
- # Append 10 more iterations of the paint test
- ./cairo-perf-micro -r -i 10 paint >> cairo.perf
-
-Raw results aren't useful for reading directly, but are quite useful
-when using cairo-perf-diff to compare separate runs (see more
-below). The advantage of using the raw mode is that test runs can be
-generated incrementally and appended to existing reports.
-
-Generating comparisons of separate runs
----------------------------------------
-It's often useful to generate a chart showing the comparison of two
-separate runs of the cairo performance suite, (for example, after
-applying a patch intended to improve cairo's performance). The
-cairo-perf-diff script can be used to compare two report files
-generated by cairo-perf.
-
-Again, by way of example:
-
- # Show performance changes from cairo-orig.perf to cairo-patched.perf
- ./cairo-perf-diff cairo-orig.perf cairo-patched.perf
-
-This will work whether the data files were generate in raw mode (with
-cairo-perf -r) or cooked, (cairo-perf without -r).
-
-Finally, in its most powerful mode, cairo-perf-diff accepts two git
-revisions and will do all the work of checking each revision out,
-building it, running cairo-perf for each revision, and finally
-generating the report. Obviously, this mode only works if you are
-using cairo within a git repository, (and not from a tar file). Using
-this mode is as simple as passing the git revisions to be compared to
-cairo-perf-diff:
-
- # Compare cairo 1.2.6 to cairo 1.4.0
- ./cairo-perf-diff 1.2.6 1.4.0
-
- # Measure the impact of the latest commit
- ./cairo-perf-diff HEAD~1 HEAD
-
-As a convenience, this common desire to measure a single commit is
-supported by passing a single revision to cairo-perf-diff, in which
-case it will compare it to the immediately preceding commit. So for
-example:
-
- # Measure the impact of the latest commit
- ./cairo-perf-diff HEAD
-
- # Measure the impact of an arbitrary commit by SHA-1
- ./cairo-perf-diff aa883123d2af90
-
-Also, when passing git revisions to cairo-perf-diff like this, it will
-automatically cache results and re-use them rather than re-running
-cairo-perf over and over on the same versions. This means that if you
-ask for a report that you've generated in the past, cairo-perf-diff
-should return it immediately.
-
-Now, sometimes it is desirable to generate more iterations rather than
-re-using cached results. In this case, the -f flag can be used to
-force cairo-perf-diff to generate additional results in addition to
-what has been cached:
-
- # Measure the impact of latest commit (force more measurement)
- ./cairo-perf-diff -f
-
-And finally, the -f mode is most useful in conjunction with the --
-option to cairo-perf-diff which allows you to pass options to the
-underlying cairo-perf runs. This allows you to restrict the additional
-test runs to a limited subset of the tests.
-
-For example, a frequently used trick is to first generate a chart with
-a very small number of iterations for all tests:
-
- ./cairo-perf-diff HEAD
-
-Then, if any of the results look suspicious, (say there's a slowdown
-reported in the text tests, but you think the text test shouldn't be
-affected), then you can force more iterations to be tested for only
-those tests:
-
- ./cairo-perf-diff -f HEAD -- text
-
-Generating comparisons of different backends
---------------------------------------------
-An alternate question that is often asked is, "how does the speed of one
-backend compare to another?". cairo-perf-compare-backends can read files
-generated by cairo-perf and produces a comparison of the backends for every
-test.
-
-Again, by way of example:
-
- # Show relative performance of the backends
- ./cairo-perf-compare-backends cairo.perf
-
-This will work whether the data files were generate in raw mode (with
-cairo-perf -r) or cooked, (cairo-perf without -r).
-
-
-Creating a new performance test
--------------------------------
-This is where we could use everybody's help. If you have encountered a
-sequence of cairo operations that are slower than you would like, then
-please provide a performance test. Writing a test is very simple, it
-requires you to write only a small C file with a couple of functions,
-one of which exercises the cairo calls of interest.
-
-Here is the basic structure of a performance test file:
-
- /* Copyright © 2006 Kind Cairo User
- *
- * ... Licensing information here ...
- * Please copy the MIT blurb as in other tests
- */
-
- #include "cairo-perf.h"
-
- static cairo_time_t
- do_my_new_test (cairo_t *cr, int width, int height)
- {
- cairo_perf_timer_start ();
-
- /* Make the cairo calls to be measured */
-
- cairo_perf_timer_stop ();
-
- return cairo_perf_timer_elapsed ();
- }
-
- void
- my_new_test (cairo_perf_t *perf, cairo_t *cr, int width, int height)
- {
- /* First do any setup for which the execution time should not
- * be measured. For example, this might include loading
- * images from disk, creating patterns, etc. */
-
- /* Then launch the actual performance testing. */
- cairo_perf_run (perf, "my_new_test", do_my_new_test);
-
- /* Finally, perform any cleanup from the setup above. */
- }
-
-That's really all there is to writing a new test. The first function
-above is the one that does the real work and returns a timing
-number. The second function is the one that will be called by the
-performance test rig (see below for how to accomplish that), and
-allows for multiple performance cases to be written in one file,
-(simply call cairo_perf_run once for each case, passing the
-appropriate callback function to each).
-
-We go through this dance of indirectly calling your own function
-through cairo_perf_run so that cairo_perf_run can call your function
-many times and measure statistical properties over the many runs.
-
-Finally, to fully integrate your new test case you just need to add
-your new test to three different lists. (TODO: We should set this up
-better so that the lists are maintained automatically---computed from
-the list of files in cairo/perf, for example). Here's what needs to be
-added:
-
- 1. Makefile.am: Add the new file name to the cairo_perf_SOURCES list
-
- 2. cairo-perf.h: Add a new CAIRO_PERF_DECL line with the name of your
- function, (my_new_test in the example above)
-
- 3. cairo-perf-micro.c: Add a new row to the list at the end of the
- file. A typical entry would look like:
-
- { my_new_test, 16, 64 }
-
- The last two numbers are a minimum and a maximum image size at
- which your test should be exercised. If these values are the same,
- then only that size will be used. If they are different, then
- intermediate sizes will be used by doubling. So in the example
- above, three tests would be performed at sizes of 16x16, 32x32 and
- 64x64.
-
-
-How to run cairo-perf-diff on WINDOWS
--------------------------------------
-This section explains the specifics of running cairo-perf-diff under
-win32 plateforms. It assumes that you have installed a UNIX-like shell
-environment such as MSYS (distributed as part of MinGW).
-
- 1. From your Mingw32 window, be sure to have all of your MSVC environ-
- ment variables set up for proper compilation using 'make'
-
- 2. Add the %GitBaseDir%/Git/bin path to your environment, replacing the
- %GitBaseDir% by whatever directory your Git version is installed to.
-
- 3. Comment out the "UNSET CDPATH" line in the git-sh-setup script
- (located inside the ...Git/bin directory) by putting a "#" at the
- beginning of the line.
-
-you should be ready to go !
-
-From your mingw32 window, go to your cairo/perf directory and run the
-cairo-perf-diff script with the right arguments.
-
-Thanks for your contributions and have fun with cairo!
-
-TODO
-----
-Add a control language for crafting and running small sets of micro
-benchmarks.
diff --git a/perf/cairo-analyse-trace.c b/perf/cairo-analyse-trace.c
deleted file mode 100644
index 994148660..000000000
--- a/perf/cairo-analyse-trace.c
+++ /dev/null
@@ -1,592 +0,0 @@
-/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */
-/*
- * Copyright © 2006 Mozilla Corporation
- * Copyright © 2006 Red Hat, Inc.
- * Copyright © 2009 Chris Wilson
- * Copyright © 2011 Intel Corporation
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * the authors not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. The authors make no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Authors: Vladimir Vukicevic <vladimir@pobox.com>
- * Carl Worth <cworth@cworth.org>
- * Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#define _GNU_SOURCE 1 /* for sched_getaffinity() and getline() */
-
-#include "../cairo-version.h" /* for the real version */
-
-#include "cairo-perf.h"
-#include "cairo-stats.h"
-
-#include "cairo-boilerplate-getopt.h"
-#include <cairo-script-interpreter.h>
-#include "cairo-missing.h"
-
-/* rudely reuse bits of the library... */
-#include "../src/cairo-error-private.h"
-
-/* For basename */
-#ifdef HAVE_LIBGEN_H
-#include <libgen.h>
-#endif
-#include <ctype.h> /* isspace() */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#ifdef _MSC_VER
-#include "dirent-win32.h"
-
-static char *
-basename_no_ext (char *path)
-{
- static char name[_MAX_FNAME + 1];
-
- _splitpath (path, NULL, NULL, name, NULL);
-
- name[_MAX_FNAME] = '\0';
-
- return name;
-}
-
-
-#else
-#include <dirent.h>
-
-static char *
-basename_no_ext (char *path)
-{
- char *dot, *name;
-
- name = basename (path);
-
- dot = strchr (name, '.');
- if (dot)
- *dot = '\0';
-
- return name;
-}
-
-#endif
-
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <signal.h>
-
-#if HAVE_FCFINI
-#include <fontconfig/fontconfig.h>
-#endif
-
-struct trace {
- const cairo_boilerplate_target_t *target;
- void *closure;
- cairo_surface_t *surface;
-};
-
-cairo_bool_t
-cairo_perf_can_run (cairo_perf_t *perf,
- const char *name,
- cairo_bool_t *is_explicit)
-{
- unsigned int i;
- char *copy, *dot;
- cairo_bool_t ret;
-
- if (is_explicit)
- *is_explicit = FALSE;
-
- if (perf->exact_names) {
- if (is_explicit)
- *is_explicit = TRUE;
- return TRUE;
- }
-
- if (perf->num_names == 0 && perf->num_exclude_names == 0)
- return TRUE;
-
- copy = xstrdup (name);
- dot = strchr (copy, '.');
- if (dot != NULL)
- *dot = '\0';
-
- if (perf->num_names) {
- ret = TRUE;
- for (i = 0; i < perf->num_names; i++)
- if (strstr (copy, perf->names[i])) {
- if (is_explicit)
- *is_explicit = strcmp (copy, perf->names[i]) == 0;
- goto check_exclude;
- }
-
- ret = FALSE;
- goto done;
- }
-
-check_exclude:
- if (perf->num_exclude_names) {
- ret = FALSE;
- for (i = 0; i < perf->num_exclude_names; i++)
- if (strstr (copy, perf->exclude_names[i])) {
- if (is_explicit)
- *is_explicit = strcmp (copy, perf->exclude_names[i]) == 0;
- goto done;
- }
-
- ret = TRUE;
- goto done;
- }
-
-done:
- free (copy);
-
- return ret;
-}
-
-static cairo_surface_t *
-surface_create (void *closure,
- cairo_content_t content,
- double width,
- double height,
- long uid)
-{
- struct trace *args = closure;
- return cairo_surface_create_similar (args->surface, content, width, height);
-}
-
-static int user_interrupt;
-
-static void
-interrupt (int sig)
-{
- if (user_interrupt) {
- signal (sig, SIG_DFL);
- raise (sig);
- }
-
- user_interrupt = 1;
-}
-
-static void
-describe (cairo_perf_t *perf,
- void *closure)
-{
- char *description = NULL;
-
- if (perf->has_described_backend)
- return;
- perf->has_described_backend = TRUE;
-
- if (perf->target->describe)
- description = perf->target->describe (closure);
-
- if (description == NULL)
- return;
-
- free (description);
-}
-
-static void
-execute (cairo_perf_t *perf,
- struct trace *args,
- const char *trace)
-{
- char *trace_cpy, *name;
- const cairo_script_interpreter_hooks_t hooks = {
- .closure = args,
- .surface_create = surface_create,
- };
-
- trace_cpy = xstrdup (trace);
- name = basename_no_ext (trace_cpy);
-
- if (perf->list_only) {
- printf ("%s\n", name);
- free (trace_cpy);
- return;
- }
-
- describe (perf, args->closure);
-
- {
- cairo_script_interpreter_t *csi;
- cairo_status_t status;
- unsigned int line_no;
-
- csi = cairo_script_interpreter_create ();
- cairo_script_interpreter_install_hooks (csi, &hooks);
-
- cairo_script_interpreter_run (csi, trace);
-
- cairo_script_interpreter_finish (csi);
-
- line_no = cairo_script_interpreter_get_line_number (csi);
- status = cairo_script_interpreter_destroy (csi);
- if (status) {
- /* XXXX cairo_status_to_string is just wrong! */
- fprintf (stderr, "Error during replay, line %d: %s\n",
- line_no, cairo_status_to_string (status));
- }
- }
- user_interrupt = 0;
-
- free (trace_cpy);
-}
-
-static void
-usage (const char *argv0)
-{
- fprintf (stderr,
-"Usage: %s [-l] [-i iterations] [-x exclude-file] [test-names ... | traces ...]\n"
-"\n"
-"Run the cairo trace analysis suite over the given tests (all by default)\n"
-"The command-line arguments are interpreted as follows:\n"
-"\n"
-" -i iterations; specify the number of iterations per test case\n"
-" -l list only; just list selected test case names without executing\n"
-" -x exclude; specify a file to read a list of traces to exclude\n"
-"\n"
-"If test names are given they are used as sub-string matches so a command\n"
-"such as \"%s firefox\" can be used to run all firefox traces.\n"
-"Alternatively, you can specify a list of filenames to execute.\n",
- argv0, argv0);
-}
-
-static cairo_bool_t
-read_excludes (cairo_perf_t *perf,
- const char *filename)
-{
- FILE *file;
- char *line = NULL;
- size_t line_size = 0;
- char *s, *t;
-
- file = fopen (filename, "r");
- if (file == NULL)
- return FALSE;
-
- while (getline (&line, &line_size, file) != -1) {
- /* terminate the line at a comment marker '#' */
- s = strchr (line, '#');
- if (s)
- *s = '\0';
-
- /* whitespace delimits */
- s = line;
- while (*s != '\0' && isspace (*s))
- s++;
-
- t = s;
- while (*t != '\0' && ! isspace (*t))
- t++;
-
- if (s != t) {
- int i = perf->num_exclude_names;
- perf->exclude_names = xrealloc (perf->exclude_names,
- sizeof (char *) * (i+1));
- perf->exclude_names[i] = strndup (s, t-s);
- perf->num_exclude_names++;
- }
- }
- free (line);
-
- fclose (file);
-
- return TRUE;
-}
-
-static void
-parse_options (cairo_perf_t *perf,
- int argc,
- char *argv[])
-{
- char *end;
- int c;
-
- perf->list_only = FALSE;
- perf->names = NULL;
- perf->num_names = 0;
- perf->exclude_names = NULL;
- perf->num_exclude_names = 0;
-
- while (1) {
- c = _cairo_getopt (argc, argv, "i:lx:");
- if (c == -1)
- break;
-
- switch (c) {
- case 'i':
- perf->exact_iterations = TRUE;
- perf->iterations = strtoul (optarg, &end, 10);
- if (*end != '\0') {
- fprintf (stderr, "Invalid argument for -i (not an integer): %s\n",
- optarg);
- exit (1);
- }
- break;
- case 'l':
- perf->list_only = TRUE;
- break;
- case 'x':
- if (! read_excludes (perf, optarg)) {
- fprintf (stderr, "Invalid argument for -x (not readable file): %s\n",
- optarg);
- exit (1);
- }
- break;
- default:
- fprintf (stderr, "Internal error: unhandled option: %c\n", c);
- /* fall-through */
- case '?':
- usage (argv[0]);
- exit (1);
- }
- }
-
- if (optind < argc) {
- perf->names = &argv[optind];
- perf->num_names = argc - optind;
- }
-}
-
-static void
-cairo_perf_fini (cairo_perf_t *perf)
-{
- cairo_boilerplate_free_targets (perf->targets);
- cairo_boilerplate_fini ();
-
- cairo_debug_reset_static_data ();
-#if HAVE_FCFINI
- FcFini ();
-#endif
-}
-
-static cairo_bool_t
-have_trace_filenames (cairo_perf_t *perf)
-{
- unsigned int i;
-
- if (perf->num_names == 0)
- return FALSE;
-
-#if HAVE_UNISTD_H
- for (i = 0; i < perf->num_names; i++)
- if (access (perf->names[i], R_OK) == 0)
- return TRUE;
-#endif
-
- return FALSE;
-}
-
-static cairo_status_t
-print (void *closure, const unsigned char *data, unsigned int length)
-{
- fwrite (data, length, 1, closure);
- return CAIRO_STATUS_SUCCESS;
-}
-
-static void
-cairo_perf_trace (cairo_perf_t *perf,
- const cairo_boilerplate_target_t *target,
- const char *trace)
-{
- struct trace args;
- cairo_surface_t *real;
-
- args.target = target;
- real = target->create_surface (NULL,
- CAIRO_CONTENT_COLOR_ALPHA,
- 1, 1,
- 1, 1,
- CAIRO_BOILERPLATE_MODE_PERF,
- &args.closure);
- args.surface =
- cairo_surface_create_observer (real,
- CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS);
- cairo_surface_destroy (real);
- if (cairo_surface_status (args.surface)) {
- fprintf (stderr,
- "Error: Failed to create target surface: %s\n",
- target->name);
- return;
- }
-
- printf ("Observing '%s'...", trace);
- fflush (stdout);
-
- execute (perf, &args, trace);
-
- printf ("\n");
- cairo_device_observer_print (cairo_surface_get_device (args.surface),
- print, stdout);
- fflush (stdout);
-
- cairo_surface_destroy (args.surface);
-
- if (target->cleanup)
- target->cleanup (args.closure);
-}
-
-static void
-warn_no_traces (const char *message,
- const char *trace_dir)
-{
- fprintf (stderr,
-"Error: %s '%s'.\n"
-"Have you cloned the cairo-traces repository and uncompressed the traces?\n"
-" git clone git://anongit.freedesktop.org/cairo-traces\n"
-" cd cairo-traces && make\n"
-"Or set the env.var CAIRO_TRACE_DIR to point to your traces?\n",
- message, trace_dir);
-}
-
-static int
-cairo_perf_trace_dir (cairo_perf_t *perf,
- const cairo_boilerplate_target_t *target,
- const char *dirname)
-{
- DIR *dir;
- struct dirent *de;
- int num_traces = 0;
- cairo_bool_t force;
- cairo_bool_t is_explicit;
-
- dir = opendir (dirname);
- if (dir == NULL)
- return 0;
-
- force = FALSE;
- if (cairo_perf_can_run (perf, dirname, &is_explicit))
- force = is_explicit;
-
- while ((de = readdir (dir)) != NULL) {
- char *trace;
- struct stat st;
-
- if (de->d_name[0] == '.')
- continue;
-
- xasprintf (&trace, "%s/%s", dirname, de->d_name);
- if (stat (trace, &st) != 0)
- goto next;
-
- if (S_ISDIR(st.st_mode)) {
- num_traces += cairo_perf_trace_dir (perf, target, trace);
- } else {
- const char *dot;
-
- dot = strrchr (de->d_name, '.');
- if (dot == NULL)
- goto next;
- if (strcmp (dot, ".trace"))
- goto next;
-
- num_traces++;
- if (!force && ! cairo_perf_can_run (perf, de->d_name, NULL))
- goto next;
-
- cairo_perf_trace (perf, target, trace);
- }
-next:
- free (trace);
-
- }
- closedir (dir);
-
- return num_traces;
-}
-
-int
-main (int argc,
- char *argv[])
-{
- cairo_perf_t perf;
- const char *trace_dir = "cairo-traces:/usr/src/cairo-traces:/usr/share/cairo-traces";
- unsigned int n;
- int i;
-
- parse_options (&perf, argc, argv);
-
- signal (SIGINT, interrupt);
-
- if (getenv ("CAIRO_TRACE_DIR") != NULL)
- trace_dir = getenv ("CAIRO_TRACE_DIR");
-
- perf.targets = cairo_boilerplate_get_targets (&perf.num_targets, NULL);
-
- /* do we have a list of filenames? */
- perf.exact_names = have_trace_filenames (&perf);
-
- for (i = 0; i < perf.num_targets; i++) {
- const cairo_boilerplate_target_t *target = perf.targets[i];
-
- if (! perf.list_only && ! target->is_measurable)
- continue;
-
- perf.target = target;
- perf.has_described_backend = FALSE;
-
- if (perf.exact_names) {
- for (n = 0; n < perf.num_names; n++) {
- struct stat st;
-
- if (stat (perf.names[n], &st) == 0) {
- if (S_ISDIR (st.st_mode)) {
- cairo_perf_trace_dir (&perf, target, perf.names[n]);
- } else
- cairo_perf_trace (&perf, target, perf.names[n]);
- }
- }
- } else {
- int num_traces = 0;
- const char *dir;
-
- dir = trace_dir;
- do {
- char buf[1024];
- const char *end = strchr (dir, ':');
- if (end != NULL) {
- memcpy (buf, dir, end-dir);
- buf[end-dir] = '\0';
- end++;
-
- dir = buf;
- }
-
- num_traces += cairo_perf_trace_dir (&perf, target, dir);
- dir = end;
- } while (dir != NULL);
-
- if (num_traces == 0) {
- warn_no_traces ("Found no traces in", trace_dir);
- return 1;
- }
- }
-
- if (perf.list_only)
- break;
- }
-
- cairo_perf_fini (&perf);
-
- return 0;
-}
diff --git a/perf/cairo-perf-chart.c b/perf/cairo-perf-chart.c
deleted file mode 100644
index 738fe5c7b..000000000
--- a/perf/cairo-perf-chart.c
+++ /dev/null
@@ -1,1113 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- * Copyright © 2009 Chris Wilson
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of the
- * copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Authors: Carl Worth <cworth@cworth.org>
- * Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-#include <math.h>
-#include <assert.h>
-
-struct chart {
- cairo_perf_report_t *reports;
- const char **names;
-
- cairo_t *cr;
- int width, height;
- int num_tests, num_reports;
- double min_value, max_value;
- double *average;
-
- cairo_bool_t use_html;
- cairo_bool_t relative;
-};
-struct color {
- double red, green, blue;
-};
-
-#define FONT_SIZE 12
-#define PAD (4)
-
-static double
-to_factor (double x)
-{
-#if 1
- if (x > 1.)
- return (x-1) * 100.;
- else
- return (1. - 1./x) * 100.;
-#else
- return log (x);
-#endif
-}
-
-static int
-_double_cmp (const void *_a,
- const void *_b)
-{
- const double *a = _a;
- const double *b = _b;
-
- if (*a > *b)
- return 1;
- if (*a < *b)
- return -1;
- return 0;
-}
-
-static void
-trim_outliers (double *values,
- int num_values,
- double *min,
- double *max)
-{
- double q1, q3, iqr;
- double outlier_min, outlier_max;
- int i;
-
- /* First, identify any outliers, using the definition of "mild
- * outliers" from:
- *
- * http://en.wikipedia.org/wiki/Outliers
- *
- * Which is that outliers are any values less than Q1 - 1.5 * IQR
- * or greater than Q3 + 1.5 * IQR where Q1 and Q3 are the first
- * and third quartiles and IQR is the inter-quartile range (Q3 -
- * Q1).
- */
- qsort (values, num_values,
- sizeof (double), _double_cmp);
-
- q1 = values[1*num_values / 6];
- q3 = values[5*num_values / 6];
-
- iqr = q3 - q1;
-
- outlier_min = q1 - 3 * iqr;
- outlier_max = q3 + 3 * iqr;
-
- i = 0;
- while (i < num_values && values[i] < outlier_min)
- i++;
- if (i == num_values)
- return;
-
- *min = values[i];
-
- while (i < num_values && values[i] <= outlier_max)
- i++;
-
- *max = values[i-1];
-}
-
-static void
-find_ranges (struct chart *chart)
-{
- test_report_t **tests, *min_test;
- double *values;
- int num_values, size_values;
- double min = 0, max = 0;
- double test_time;
- int seen_non_null;
- int num_tests = 0;
- double slow_sum = 0, fast_sum = 0, sum;
- int slow_count = 0, fast_count = 0;
- int *count;
- int i;
-
- num_values = 0;
- size_values = 64;
- values = xmalloc (size_values * sizeof (double));
-
- chart->average = xmalloc(chart->num_reports * sizeof(double));
- count = xmalloc(chart->num_reports * sizeof(int));
- for (i = 0; i < chart->num_reports; i++) {
- chart->average[i] = 0;
- count[i] = 0;
- }
-
- tests = xmalloc (chart->num_reports * sizeof (test_report_t *));
- for (i = 0; i < chart->num_reports; i++)
- tests[i] = chart->reports[i].tests;
-
- while (1) {
- /* We expect iterations values of 0 when multiple raw reports
- * for the same test have been condensed into the stats of the
- * first. So we just skip these later reports that have no
- * stats. */
- seen_non_null = 0;
- for (i = 0; i < chart->num_reports; i++) {
- while (tests[i]->name && tests[i]->stats.iterations == 0)
- tests[i]++;
- if (tests[i]->name)
- seen_non_null++;
- }
- if (! seen_non_null)
- break;
-
- num_tests++;
-
- /* Find the minimum of all current tests, (we have to do this
- * in case some reports don't have a particular test). */
- for (i = 0; i < chart->num_reports; i++) {
- if (tests[i]->name) {
- min_test = tests[i];
- break;
- }
- }
- for (++i; i < chart->num_reports; i++) {
- if (tests[i]->name && test_report_cmp_name (tests[i], min_test) < 0)
- min_test = tests[i];
- }
-
- test_time = 0;
- for (i = 0; i < chart->num_reports; i++) {
- double report_time = HUGE_VAL;
-
- while (tests[i]->name &&
- test_report_cmp_name (tests[i], min_test) == 0)
- {
- double time = tests[i]->stats.min_ticks;
- if (time < report_time) {
- time /= tests[i]->stats.ticks_per_ms;
- if (time < report_time)
- report_time = time;
- }
- tests[i]++;
- }
-
- if (report_time != HUGE_VAL) {
- if (test_time == 0)
- test_time = report_time;
-
- chart->average[i] += report_time / test_time;
- count[i]++;
-
- if (chart->relative) {
- if (test_time != report_time) {
- double v = to_factor (test_time / report_time);
- if (num_values == size_values) {
- size_values *= 2;
- values = xrealloc (values,
- size_values * sizeof (double));
- }
- values[num_values++] = v;
- if (v < min)
- min = v;
- if (v > max)
- max = v;
- if (v > 0)
- fast_sum += v/100, fast_count++;
- else
- slow_sum += v/100, slow_count++;
- sum += v/100;
- printf ("%s %d: %f\n", min_test->name, num_values, v);
- }
- } else {
- if (report_time < min)
- min = report_time;
- if (report_time > max)
- max = report_time;
- }
- }
- }
- }
-
- for (i = 0; i < chart->num_reports; i++) {
- if (count[i])
- chart->average[i] = count[i] / chart->average[i];
- else
- chart->average[i] = 1.;
- }
-
- if (chart->relative)
- trim_outliers (values, num_values, &min, &max);
- chart->min_value = min;
- chart->max_value = max;
- chart->num_tests = num_tests + !!chart->relative;
-
- free (values);
- free (tests);
- free (count);
-
- printf ("%d: slow[%d] average: %f, fast[%d] average: %f, %f\n",
- num_values, slow_count, slow_sum / slow_count, fast_count, fast_sum / fast_count, sum / num_values);
-}
-
-#define SET_COLOR(C, R, G, B) (C)->red = (R), (C)->green = (G), (C)->blue = (B)
-static void
-hsv_to_rgb (double h,
- double s,
- double v,
- struct color *color)
-{
- double m, n, f;
- int i;
-
- while (h < 0)
- h += 6.;
- while (h > 6.)
- h -= 6.;
-
- if (s < 0.)
- s = 0.;
- if (s > 1.)
- s = 1.;
-
- if (v < 0.)
- v = 0.;
- if (v > 1.)
- v = 1.;
-
- i = floor (h);
- f = h - i;
- if ((i & 1) == 0)
- f = 1 - f;
-
- m = v * (1 - s);
- n = v * (1 - s * f);
- switch(i){
- default:
- case 6:
- case 0: SET_COLOR (color, v, n, m); break;
- case 1: SET_COLOR (color, n, v, m); break;
- case 2: SET_COLOR (color, m, v, n); break;
- case 3: SET_COLOR (color, m, n, v); break;
- case 4: SET_COLOR (color, n, m, v); break;
- case 5: SET_COLOR (color, v, m, n); break;
- }
-}
-
-static void set_report_color (struct chart *chart, int report)
-{
- struct color color;
-
- hsv_to_rgb (6. / chart->num_reports * report, .7, .7, &color);
- cairo_set_source_rgb (chart->cr, color.red, color.green, color.blue);
-}
-
-static void set_report_gradient (struct chart *chart, int report,
- double x, double y, double w, double h)
-{
- struct color color;
- cairo_pattern_t *p;
-
- hsv_to_rgb (6. / chart->num_reports * report, .7, .7, &color);
-
- p = cairo_pattern_create_linear (x, 0, x+w, 0);
- cairo_pattern_add_color_stop_rgba (p, 0.0,
- color.red, color.green, color.blue,
- .50);
- cairo_pattern_add_color_stop_rgba (p, 0.5,
- color.red, color.green, color.blue,
- .50);
- cairo_pattern_add_color_stop_rgba (p, 1.0,
- color.red, color.green, color.blue,
- 1.0);
- cairo_set_source (chart->cr, p);
- cairo_pattern_destroy (p);
-}
-
-static void
-test_background (struct chart *c,
- int test)
-{
- double dx, x;
-
- dx = c->width / (double) c->num_tests;
- x = dx * test;
-
- if (test & 1)
- cairo_set_source_rgba (c->cr, .2, .2, .2, .2);
- else
- cairo_set_source_rgba (c->cr, .8, .8, .8, .2);
-
- cairo_rectangle (c->cr, floor (x), 0,
- floor (dx + x) - floor (x), c->height);
- cairo_fill (c->cr);
-}
-
-static void
-add_chart (struct chart *c,
- int test,
- int report,
- double value)
-{
- double dx, dy, x;
-
- if (fabs (value) < 0.1)
- return;
-
- if (c->relative) {
- cairo_text_extents_t extents;
- char buf[80];
- double y;
-
- dy = (c->height/2. - PAD) / MAX (-c->min_value, c->max_value);
- /* the first report is always skipped, as it is used as the baseline */
- dx = c->width / (double) (c->num_tests * c->num_reports);
- x = dx * (c->num_reports * test + report - .5);
-
- cairo_rectangle (c->cr,
- floor (x), c->height / 2.,
- floor (x + dx) - floor (x),
- ceil (-dy*value - c->height/2.) + c->height/2.);
- if (dx < 5) {
- set_report_color (c, report);
- cairo_fill (c->cr);
- } else {
- set_report_gradient (c, report,
- floor (x), c->height / 2.,
- floor (x + dx) - floor (x),
- ceil (-dy*value - c->height/2.) + c->height/2.);
-
- cairo_fill_preserve (c->cr);
- cairo_save (c->cr);
- cairo_clip_preserve (c->cr);
- set_report_color (c, report);
- cairo_stroke (c->cr);
- cairo_restore (c->cr);
- }
-
- /* Skip the label if the difference between the two is less than 0.1% */
- if (fabs (value) < 0.1)
- return;
-
- cairo_save (c->cr);
- cairo_set_font_size (c->cr, dx - 2);
-
- if (value < 0) {
- sprintf (buf, "%.1f", -value/100 + 1);
- } else {
- sprintf (buf, "%.1f", value/100 + 1);
- }
- cairo_text_extents (c->cr, buf, &extents);
-
- /* will it be clipped? */
- y = -dy * value;
- if (y < -c->height/2) {
- y = -c->height/2;
- } else if (y > c->height/2) {
- y = c->height/2;
- }
-
- if (y < 0) {
- if (y > -extents.width - 6)
- y -= extents.width + 6;
- } else {
- if (y < extents.width + 6)
- y += extents.width + 6;
- }
-
- cairo_translate (c->cr,
- floor (x) + (floor (x + dx) - floor (x))/2,
- floor (y) + c->height/2.);
- cairo_rotate (c->cr, -M_PI/2);
- if (y < 0) {
- cairo_move_to (c->cr, -extents.x_bearing -extents.width - 4, -extents.y_bearing/2);
- } else {
- cairo_move_to (c->cr, 2, -extents.y_bearing/2);
- }
-
- cairo_set_source_rgb (c->cr, .95, .95, .95);
- cairo_show_text (c->cr, buf);
- cairo_restore (c->cr);
- } else {
- dy = (c->height - PAD) / c->max_value;
- dx = c->width / (double) (c->num_tests * (c->num_reports+1));
- x = dx * ((c->num_reports+1) * test + report + .5);
-
- cairo_rectangle (c->cr,
- floor (x), c->height,
- floor (x + dx) - floor (x),
- floor (c->height - dy*value) - c->height);
- if (dx < 5) {
- set_report_color (c, report);
- cairo_fill (c->cr);
- } else {
- set_report_gradient (c, report,
- floor (x), c->height,
- floor (x + dx) - floor (x),
- floor (c->height - dy*value) - c->height);
- cairo_fill_preserve (c->cr);
- cairo_save (c->cr);
- cairo_clip_preserve (c->cr);
- set_report_color (c, report);
- cairo_stroke (c->cr);
- cairo_restore (c->cr);
- }
- }
-}
-
-static void
-add_average (struct chart *c,
- int test,
- int report,
- double value)
-{
- double dx, dy, x;
- cairo_text_extents_t extents;
- char buf[80];
- double y;
-
- if (fabs (value) < 0.1)
- return;
-
- dy = (c->height/2. - PAD) / MAX (-c->min_value, c->max_value);
- /* the first report is always skipped, as it is used as the baseline */
- dx = c->width / (double) (c->num_tests * c->num_reports);
- x = dx * (c->num_reports * test + report - .5);
-
- cairo_rectangle (c->cr,
- floor (x), c->height / 2.,
- floor (x + dx) - floor (x),
- ceil (-dy*value - c->height/2.) + c->height/2.);
- if (dx < 5) {
- set_report_color (c, report);
- cairo_fill (c->cr);
- } else {
- set_report_gradient (c, report,
- floor (x), c->height / 2.,
- floor (x + dx) - floor (x),
- ceil (-dy*value - c->height/2.) + c->height/2.);
-
- cairo_fill_preserve (c->cr);
- cairo_save (c->cr);
- cairo_clip_preserve (c->cr);
- set_report_color (c, report);
- cairo_stroke (c->cr);
- cairo_restore (c->cr);
- }
-
- /* Skip the label if the difference between the two is less than 0.1% */
- if (fabs (value) < 0.1)
- return;
-
- cairo_save (c->cr);
- cairo_set_font_size (c->cr, dx - 2);
-
- if (value < 0) {
- sprintf (buf, "%.1f", -value/100 + 1);
- } else {
- sprintf (buf, "%.1f", value/100 + 1);
- }
- cairo_text_extents (c->cr, buf, &extents);
-
- /* will it be clipped? */
- y = -dy * value;
- if (y < -c->height/2) {
- y = -c->height/2;
- } else if (y > c->height/2) {
- y = c->height/2;
- }
-
- if (y < 0) {
- if (y > -extents.width - 6)
- y -= extents.width + 6;
- } else {
- if (y < extents.width + 6)
- y += extents.width + 6;
- }
-
- cairo_translate (c->cr,
- floor (x) + (floor (x + dx) - floor (x))/2,
- floor (y) + c->height/2.);
- cairo_rotate (c->cr, -M_PI/2);
- if (y < 0) {
- cairo_move_to (c->cr, -extents.x_bearing -extents.width - 4, -extents.y_bearing/2);
- } else {
- cairo_move_to (c->cr, 2, -extents.y_bearing/2);
- }
-
- cairo_set_source_rgb (c->cr, .95, .95, .95);
- cairo_show_text (c->cr, buf);
- cairo_restore (c->cr);
-}
-
-static void
-add_label (struct chart *c,
- int test,
- const char *label)
-{
- cairo_text_extents_t extents;
- double dx, x;
-
- cairo_save (c->cr);
- dx = c->width / (double) c->num_tests;
- if (dx / 2 - PAD < 4)
- return;
- cairo_set_font_size (c->cr, dx / 2 - PAD);
- cairo_text_extents (c->cr, label, &extents);
-
- cairo_set_source_rgb (c->cr, .5, .5, .5);
-
- x = (test + .5) * dx;
- cairo_save (c->cr);
- cairo_translate (c->cr, x, c->height - PAD / 2);
- cairo_rotate (c->cr, -M_PI/2);
- cairo_move_to (c->cr, 0, -extents.y_bearing/2);
- cairo_show_text (c->cr, label);
- cairo_restore (c->cr);
-
- cairo_save (c->cr);
- cairo_translate (c->cr, x, PAD / 2);
- cairo_rotate (c->cr, -M_PI/2);
- cairo_move_to (c->cr, -extents.width, -extents.y_bearing/2);
- cairo_show_text (c->cr, label);
- cairo_restore (c->cr);
-
- cairo_restore (c->cr);
-}
-
-static void
-add_base_line (struct chart *c)
-{
- double y;
-
- cairo_save (c->cr);
- cairo_set_line_width (c->cr, 2.);
- if (c->relative) {
- y = c->height / 2.;
- } else {
- y = c->height;
- }
- cairo_move_to (c->cr, 0, y);
- cairo_line_to (c->cr, c->width, y);
- cairo_set_source_rgb (c->cr, 1, 1, 1);
- cairo_stroke (c->cr);
- cairo_restore (c->cr);
-}
-
-static void
-add_absolute_lines (struct chart *c)
-{
- const double dashes[] = { 2, 4 };
- const double vlog_steps[] = { 10, 5, 4, 3, 2, 1, .5, .4, .3, .2, .1};
- double v, y, dy;
- unsigned int i;
- char buf[80];
- cairo_text_extents_t extents;
-
- v = c->max_value / 2.;
-
- for (i = 0; i < sizeof (vlog_steps) / sizeof (vlog_steps[0]); i++) {
- double vlog = log (v) / log (vlog_steps[i]);
- if (vlog > 1) {
- v = pow (vlog_steps[i], floor (vlog));
- goto done;
- }
- }
- return;
-done:
-
- dy = (c->height - PAD) / c->max_value;
-
- cairo_save (c->cr);
- cairo_set_line_width (c->cr, 1.);
- cairo_set_dash (c->cr, dashes, sizeof (dashes) / sizeof (dashes[0]), 0);
-
- i = 0;
- do {
- y = c->height - ++i * v * dy;
- if (y < PAD)
- break;
-
- cairo_set_font_size (c->cr, 8);
-
- sprintf (buf, "%.0fs", i*v/1000);
- cairo_text_extents (c->cr, buf, &extents);
-
- cairo_set_source_rgba (c->cr, .75, 0, 0, .95);
- cairo_move_to (c->cr, 1-extents.x_bearing, floor (y) - (extents.height/2 + extents.y_bearing) + .5);
- cairo_show_text (c->cr, buf);
-
- cairo_move_to (c->cr, c->width-extents.width-1, floor (y) - (extents.height/2 + extents.y_bearing) + .5);
- cairo_show_text (c->cr, buf);
-
- cairo_set_source_rgba (c->cr, .75, 0, 0, .5);
- cairo_move_to (c->cr,
- ceil (extents.width + extents.x_bearing + 2),
- floor (y) + .5);
- cairo_line_to (c->cr,
- floor (c->width - (extents.width + extents.x_bearing + 2)),
- floor (y) + .5);
- cairo_stroke (c->cr);
- } while (1);
-
- cairo_restore (c->cr);
-}
-
-static void
-add_relative_lines (struct chart *c)
-{
- const double dashes[] = { 2, 4 };
- const double v_steps[] = { 10, 5, 1, .5, .1, .05, .01};
- const int precision_steps[] = { 0, 0, 0, 1, 1, 2, 2};
- int precision;
- double v, y, dy, mid;
- unsigned int i;
- char buf[80];
- cairo_text_extents_t extents;
-
- v = MAX (-c->min_value, c->max_value) / 200;
-
- for (i = 0; i < sizeof (v_steps) / sizeof (v_steps[0]); i++) {
- if (v > v_steps[i]) {
- v = v_steps[i];
- precision = precision_steps[i];
- goto done;
- }
- }
- return;
-done:
-
- mid = c->height/2.;
- dy = (mid - PAD) / MAX (-c->min_value, c->max_value);
-
- cairo_save (c->cr);
- cairo_set_line_width (c->cr, 1.);
- cairo_set_dash (c->cr, dashes, sizeof (dashes) / sizeof (dashes[0]), 0);
- cairo_set_font_size (c->cr, 8);
-
- i = 0;
- do {
- y = ++i * v * dy * 100;
- if (y > mid)
- break;
-
- sprintf (buf, "%.*fx", precision, i*v + 1);
- cairo_text_extents (c->cr, buf, &extents);
-
- cairo_set_source_rgba (c->cr, .75, 0, 0, .95);
- cairo_move_to (c->cr, 1-extents.x_bearing, floor (mid + y) - (extents.height/2 + extents.y_bearing) + .5);
- cairo_show_text (c->cr, buf);
-
- cairo_move_to (c->cr, c->width-extents.width-1, floor (mid + y) - (extents.height/2 + extents.y_bearing) + .5);
- cairo_show_text (c->cr, buf);
-
- cairo_set_source_rgba (c->cr, 0, .75, 0, .95);
- cairo_move_to (c->cr, 1-extents.x_bearing, ceil (mid - y) - (extents.height/2 + extents.y_bearing) + .5);
- cairo_show_text (c->cr, buf);
-
- cairo_move_to (c->cr, c->width-extents.width-1, ceil (mid - y) - (extents.height/2 + extents.y_bearing) + .5);
- cairo_show_text (c->cr, buf);
-
- /* trim the dashes to no obscure the labels */
- cairo_set_source_rgba (c->cr, .75, 0, 0, .5);
- cairo_move_to (c->cr,
- ceil (extents.width + extents.x_bearing + 2),
- floor (mid + y) + .5);
- cairo_line_to (c->cr,
- floor (c->width - (extents.width + 2)),
- floor (mid + y) + .5);
- cairo_stroke (c->cr);
-
- cairo_set_source_rgba (c->cr, 0, .75, 0, .5);
- cairo_move_to (c->cr,
- ceil (extents.width + extents.x_bearing + 2),
- ceil (mid - y) + .5);
- cairo_line_to (c->cr,
- floor (c->width - (extents.width + 2)),
- ceil (mid - y) + .5);
- cairo_stroke (c->cr);
-
- } while (1);
-
- cairo_restore (c->cr);
-}
-
-static void
-add_slower_faster_guide (struct chart *c)
-{
- cairo_text_extents_t extents;
-
- cairo_save (c->cr);
-
- cairo_set_font_size (c->cr, FONT_SIZE);
-
- cairo_text_extents (c->cr, "FASTER", &extents);
- cairo_set_source_rgba (c->cr, 0, .75, 0, .5);
- cairo_move_to (c->cr,
- c->width/4. - extents.width/2. + extents.x_bearing,
- 1 - extents.y_bearing);
- cairo_show_text (c->cr, "FASTER");
- cairo_move_to (c->cr,
- 3*c->width/4. - extents.width/2. + extents.x_bearing,
- 1 - extents.y_bearing);
- cairo_show_text (c->cr, "FASTER");
-
- cairo_text_extents (c->cr, "SLOWER", &extents);
- cairo_set_source_rgba (c->cr, .75, 0, 0, .5);
- cairo_move_to (c->cr,
- c->width/4. - extents.width/2. + extents.x_bearing,
- c->height - 1);
- cairo_show_text (c->cr, "SLOWER");
- cairo_move_to (c->cr,
- 3*c->width/4. - extents.width/2. + extents.x_bearing,
- c->height - 1);
- cairo_show_text (c->cr, "SLOWER");
-
- cairo_restore (c->cr);
-}
-
-static void
-cairo_perf_reports_compare (struct chart *chart,
- cairo_bool_t print)
-{
- test_report_t **tests, *min_test;
- double test_time, best_time;
- int num_test = 0;
- int seen_non_null;
- int i;
-
- tests = xmalloc (chart->num_reports * sizeof (test_report_t *));
- for (i = 0; i < chart->num_reports; i++)
- tests[i] = chart->reports[i].tests;
-
- if (print) {
- if (chart->use_html) {
- printf ("<table style=\"text-align:right\" cellspacing=\"4\">\n");
- printf ("<tr><td></td>");
- for (i = 0; i < chart->num_reports; i++) {
- printf ("<td>%s</td>", chart->names[i] ? chart->names[i] : "");
- }
- printf ("</tr>\n");
- }
- }
-
- while (1) {
- /* We expect iterations values of 0 when multiple raw reports
- * for the same test have been condensed into the stats of the
- * first. So we just skip these later reports that have no
- * stats. */
- seen_non_null = 0;
- for (i = 0; i < chart->num_reports; i++) {
- while (tests[i]->name && tests[i]->stats.iterations == 0)
- tests[i]++;
- if (tests[i]->name)
- seen_non_null++;
- }
- if (! seen_non_null)
- break;
-
- /* Find the minimum of all current tests, (we have to do this
- * in case some reports don't have a particular test). */
- for (i = 0; i < chart->num_reports; i++) {
- if (tests[i]->name) {
- min_test = tests[i];
- break;
- }
- }
- for (++i; i < chart->num_reports; i++) {
- if (tests[i]->name && test_report_cmp_name (tests[i], min_test) < 0)
- min_test = tests[i];
- }
-
- add_label (chart, num_test, min_test->name);
- if (print) {
- if (chart->use_html) {
- printf ("<tr><td>%s</td>", min_test->name);
- } else {
- if (min_test->size) {
- printf ("%16s, size %4d:\n",
- min_test->name,
- min_test->size);
- } else {
- printf ("%26s:",
- min_test->name);
- }
- }
- }
-
- test_time = 0;
- best_time = HUGE_VAL;
- for (i = 0; i < chart->num_reports; i++) {
- test_report_t *initial = tests[i];
- double report_time = HUGE_VAL;
-
- while (tests[i]->name &&
- test_report_cmp_name (tests[i], min_test) == 0)
- {
- double time = tests[i]->stats.min_ticks;
- if (time < report_time) {
- time /= tests[i]->stats.ticks_per_ms;
- if (time < report_time)
- report_time = time;
- }
- tests[i]++;
- }
-
- if (test_time == 0 && report_time != HUGE_VAL)
- test_time = report_time;
- if (report_time < best_time)
- best_time = report_time;
-
- tests[i] = initial;
- }
-
- for (i = 0; i < chart->num_reports; i++) {
- double report_time = HUGE_VAL;
-
- while (tests[i]->name &&
- test_report_cmp_name (tests[i], min_test) == 0)
- {
- double time = tests[i]->stats.min_ticks;
- if (time > 0) {
- time /= tests[i]->stats.ticks_per_ms;
- if (time < report_time)
- report_time = time;
- }
- tests[i]++;
- }
-
- if (print) {
- if (chart->use_html) {
- if (report_time < HUGE_VAL) {
- if (report_time / best_time < 1.01) {
- printf ("<td><strong>%.1f</strong></td>", report_time/1000);
- } else {
- printf ("<td>%.1f</td>", report_time/1000);
- }
- } else {
- printf ("<td></td>");
- }
- } else {
- if (report_time < HUGE_VAL)
- printf (" %6.1f", report_time/1000);
- else
- printf (" ---");
- }
- }
-
- if (report_time < HUGE_VAL) {
- if (chart->relative) {
- add_chart (chart, num_test, i,
- to_factor (test_time / report_time));
- } else {
- add_chart (chart, num_test, i, report_time);
- }
- }
- }
-
- if (print) {
- if (chart->use_html) {
- printf ("</tr>\n");
- } else {
- printf ("\n");
- }
- }
-
- num_test++;
- }
- if (chart->relative) {
- add_label (chart, num_test, "(geometric mean)");
- for (i = 0; i < chart->num_reports; i++)
- add_average (chart, num_test, i, to_factor (chart->average[i]));
- }
- free (tests);
-
- if (print) {
- if (chart->use_html)
- printf ("</table>\n");
-
- printf ("\n");
- for (i = 0; i < chart->num_reports; i++) {
- if (chart->names[i]) {
- printf ("[%s] %s\n",
- chart->names[i], chart->reports[i].configuration);
- } else {
- printf ("[%d] %s\n",
- i, chart->reports[i].configuration);
- }
- }
- }
-}
-
-static void
-add_legend (struct chart *chart)
-{
- cairo_text_extents_t extents;
- const char *str;
- int i, x, y;
-
- cairo_set_font_size (chart->cr, FONT_SIZE);
-
- x = PAD;
- y = chart->height + PAD;
- for (i = chart->relative; i < chart->num_reports; i++) {
- str = chart->names[i] ?
- chart->names[i] : chart->reports[i].configuration;
-
- set_report_color (chart, i);
-
- cairo_rectangle (chart->cr, x, y + 6, 8, 8);
- cairo_fill (chart->cr);
-
- cairo_set_source_rgb (chart->cr, 1, 1, 1);
- cairo_move_to (chart->cr, x + 10, y + FONT_SIZE + PAD / 2.);
- cairo_text_extents (chart->cr, str, &extents);
- cairo_show_text (chart->cr, str);
-
- x += 10 + 2 * PAD + ceil (extents.width);
- }
-
- if (chart->relative) {
- char buf[80];
-
- str = chart->names[0] ?
- chart->names[0] : chart->reports[0].configuration;
-
- sprintf (buf, "(relative to %s)", str);
- cairo_text_extents (chart->cr, buf, &extents);
-
- cairo_set_source_rgb (chart->cr, 1, 1, 1);
- cairo_move_to (chart->cr,
- chart->width - 1 - extents.width,
- y + FONT_SIZE + PAD / 2.);
- cairo_show_text (chart->cr, buf);
- }
-}
-
-static void
-usage (void)
-{
- printf("Usage:\n");
- printf(" cairo-perf-chart [OPTION...] <result1> <result2>...<resultN>\n");
- printf("\n");
- printf("Help Options:\n");
- printf(" --help, --?\tShow help options\n");
- printf("\n");
- printf("Application Options:\n");
- printf(" --html\tOutput an HTML table comparing the results\n");
- printf(" --height=\tSet the height of the output graph"\
- " (default 480)\n");
- printf(" --width=\tSet the width of the output graph"\
- " (default 640)\n");
- printf(" --name\tSet the name of graph series."\
- " This only sets the name for the\n\t\tfirst result file."\
- " The graph series is usually set using the\n\t\tfile name for"\
- " the results file.\n");
- printf("\n");
- printf("Example:\n");
- printf(" cairo-perf-chart --width=1024 --height=768 run1 run2 run3\n");
- return;
-}
-
-int
-main (int argc,
- const char *argv[])
-{
- cairo_surface_t *surface;
- struct chart chart;
- test_report_t *t;
- int i;
-
- chart.use_html = 0;
- chart.width = 640;
- chart.height = 480;
-
- chart.reports = xcalloc (argc-1, sizeof (cairo_perf_report_t));
- chart.names = xcalloc (argc-1, sizeof (cairo_perf_report_t));
-
- chart.num_reports = 0;
- for (i = 1; i < argc; i++) {
- if (strcmp (argv[i], "--html") == 0) {
- chart.use_html = 1;
- } else if (strncmp (argv[i], "--width=", 8) == 0) {
- chart.width = atoi (argv[i] + 8);
- } else if (strncmp (argv[i], "--height=", 9) == 0) {
- chart.height = atoi (argv[i] + 9);
- } else if (strcmp (argv[i], "--name") == 0) {
- if (i + 1 < argc)
- chart.names[chart.num_reports] = argv[++i];
- } else if (strncmp (argv[i], "--name=", 7) == 0) {
- chart.names[chart.num_reports] = argv[i] + 7;
- } else if ((strcmp (argv[i], "--help") == 0) ||
- (strcmp (argv[i], "--?") == 0)) {
- usage();
- return 0;
- } else {
- cairo_perf_report_load (&chart.reports[chart.num_reports++],
- argv[i], i,
- test_report_cmp_name);
- }
- }
-
- for (chart.relative = 0; chart.relative <= 1; chart.relative++) {
- surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- chart.width,
- chart.height + (FONT_SIZE + PAD) + 2*PAD);
- chart.cr = cairo_create (surface);
- cairo_surface_destroy (surface);
-
- cairo_set_source_rgb (chart.cr, 0, 0, 0);
- cairo_paint (chart.cr);
-
- find_ranges (&chart);
-
- for (i = 0; i < chart.num_tests; i++)
- test_background (&chart, i);
- if (chart.relative) {
- add_relative_lines (&chart);
- add_slower_faster_guide (&chart);
- } else
- add_absolute_lines (&chart);
-
- cairo_save (chart.cr);
- cairo_rectangle (chart.cr, 0, 0, chart.width, chart.height);
- cairo_clip (chart.cr);
- cairo_perf_reports_compare (&chart, !chart.relative);
- cairo_restore (chart.cr);
-
- add_base_line (&chart);
- add_legend (&chart);
-
- cairo_surface_write_to_png (cairo_get_target (chart.cr),
- chart.relative ? "relative.png" : "absolute.png");
- cairo_destroy (chart.cr);
- }
-
- /* Pointless memory cleanup, (would be a great place for talloc) */
- for (i = 0; i < chart.num_reports; i++) {
- for (t = chart.reports[i].tests; t->name; t++) {
- free (t->samples);
- free (t->backend);
- free (t->name);
- }
- free (chart.reports[i].tests);
- free (chart.reports[i].configuration);
- }
- free (chart.names);
- free (chart.reports);
-
- return 0;
-}
diff --git a/perf/cairo-perf-compare-backends.c b/perf/cairo-perf-compare-backends.c
deleted file mode 100644
index ff7359e1a..000000000
--- a/perf/cairo-perf-compare-backends.c
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- * Copyright © 2009 Chris Wilson
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of the
- * copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Authors: Carl Worth <cworth@cworth.org>
- * Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-#include <math.h>
-#include <assert.h>
-
-typedef struct _cairo_perf_report_options {
- double min_change;
- int use_utf;
- int print_change_bars;
-} cairo_perf_report_options_t;
-
-typedef struct _cairo_perf_diff_files_args {
- const char **filenames;
- int num_filenames;
- cairo_perf_report_options_t options;
-} cairo_perf_diff_files_args_t;
-
-static int
-test_diff_cmp (const void *a,
- const void *b)
-{
- const test_diff_t *a_diff = a;
- const test_diff_t *b_diff = b;
-
- /* Reverse sort by magnitude of change so larger changes come
- * first */
- if (a_diff->change > b_diff->change)
- return -1;
-
- if (a_diff->change < b_diff->change)
- return 1;
-
- return 0;
-}
-
-#define CHANGE_BAR_WIDTH 70
-static void
-print_change_bar (double change,
- double max_change,
- int use_utf)
-{
- int units_per_cell = ceil (max_change / CHANGE_BAR_WIDTH);
- static char const *ascii_boxes[8] = {
- "****","***" ,"***", "**",
- "**", "*", "*", ""
- };
- static char const *utf_boxes[8] = {
- "█", "▉", "▊", "▋",
- "▌", "▍", "▎", "▏"
- };
- char const **boxes = use_utf ? utf_boxes : ascii_boxes;
-
- /* For a 1.0x speedup we want a zero-size bar to show "no
- * change". */
- change -= 1.0;
-
- while (change > units_per_cell) {
- printf ("%s", boxes[0]);
- change -= units_per_cell;
- }
-
- change /= units_per_cell;
-
- if (change > 7.5/8.0)
- printf ("%s", boxes[0]);
- else if (change > 6.5/8.0)
- printf ("%s", boxes[1]);
- else if (change > 5.5/8.0)
- printf ("%s", boxes[2]);
- else if (change > 4.5/8.0)
- printf ("%s", boxes[3]);
- else if (change > 3.5/8.0)
- printf ("%s", boxes[4]);
- else if (change > 2.5/8.0)
- printf ("%s", boxes[5]);
- else if (change > 1.5/8.0)
- printf ("%s", boxes[6]);
- else if (change > 0.5/8.0)
- printf ("%s", boxes[7]);
-}
-
-static void
-test_diff_print (test_diff_t *diff,
- double max_change,
- cairo_perf_report_options_t *options)
-{
- int i;
- double test_time;
- double change;
-
- if (diff->tests[0]->size != 0) {
- printf ("(%s, size: %d)\n",
- diff->tests[0]->name,
- diff->tests[0]->size);
- } else {
- printf ("(%s)\n", diff->tests[0]->name);
- }
-
- for (i = 0; i < diff->num_tests; i++) {
- test_time = diff->tests[i]->stats.min_ticks;
- test_time /= diff->tests[i]->stats.ticks_per_ms;
- change = diff->max / test_time;
- printf ("%8s-%s-%s\t%6.2f: %5.2fx ",
- diff->tests[i]->backend,
- diff->tests[i]->content,
- diff->tests[i]->configuration,
- diff->tests[i]->stats.min_ticks / diff->tests[i]->stats.ticks_per_ms,
- change);
-
- if (options->print_change_bars)
- print_change_bar (change, max_change, options->use_utf);
- printf ("\n");
- }
-
- printf("\n");
-}
-
-static void
-cairo_perf_reports_compare (cairo_perf_report_t *reports,
- int num_reports,
- cairo_perf_report_options_t *options)
-{
- int i;
- test_report_t **tests, *min_test;
- test_diff_t *diff, *diffs;
- int num_diffs, max_diffs;
- double max_change;
- double test_time;
- int seen_non_null;
-
- tests = xmalloc (num_reports * sizeof (test_report_t *));
-
- max_diffs = reports[0].tests_count;
- for (i = 0; i < num_reports; i++) {
- tests[i] = reports[i].tests;
- if (reports[i].tests_count > max_diffs)
- max_diffs = reports[i].tests_count;
- }
-
- diff = diffs = xmalloc (max_diffs * sizeof (test_diff_t));
-
- num_diffs = 0;
- while (1) {
- int num_tests;
-
- /* We expect iterations values of 0 when multiple raw reports
- * for the same test have been condensed into the stats of the
- * first. So we just skip these later reports that have no
- * stats. */
- seen_non_null = 0;
- for (i = 0; i < num_reports; i++) {
- while (tests[i]->name && tests[i]->stats.iterations == 0)
- tests[i]++;
- if (tests[i]->name)
- seen_non_null++;
- }
- if (! seen_non_null)
- break;
-
- /* Find the minimum of all current tests, (we have to do this
- * in case some reports don't have a particular test). */
- for (i = 0; i < num_reports; i++) {
- if (tests[i]->name) {
- min_test = tests[i];
- break;
- }
- }
- for (++i; i < num_reports; i++) {
- if (tests[i]->name && test_report_cmp_name (tests[i], min_test) < 0)
- min_test = tests[i];
- }
-
- num_tests = 0;
- for (i = 0; i < num_reports; i++) {
- test_report_t *test;
- int n = 0;
-
- test = tests[i];
- while (test[n].name &&
- test_report_cmp_name (&test[n], min_test) == 0)
- {
- n++;
- }
-
- num_tests += n;
- }
-
- /* For each report that has the current test, record it into
- * the diff structure. */
- diff->num_tests = 0;
- diff->tests = xmalloc (num_tests * sizeof (test_diff_t));
- for (i = 0; i < num_reports; i++) {
- while (tests[i]->name &&
- test_report_cmp_name (tests[i], min_test) == 0)
- {
- test_time = tests[i]->stats.min_ticks;
- if (test_time > 0) {
- test_time /= tests[i]->stats.ticks_per_ms;
- if (diff->num_tests == 0) {
- diff->min = test_time;
- diff->max = test_time;
- } else {
- if (test_time < diff->min)
- diff->min = test_time;
- if (test_time > diff->max)
- diff->max = test_time;
- }
- diff->tests[diff->num_tests++] = tests[i];
- }
- tests[i]++;
- }
- }
- diff->change = diff->max / diff->min;
-
- diff++;
- num_diffs++;
- }
- if (num_diffs == 0)
- goto DONE;
-
- qsort (diffs, num_diffs, sizeof (test_diff_t), test_diff_cmp);
-
- max_change = 1.0;
- for (i = 0; i < num_diffs; i++) {
- if (fabs (diffs[i].change) > max_change)
- max_change = fabs (diffs[i].change);
- }
-
- for (i = 0; i < num_diffs; i++) {
- diff = &diffs[i];
-
- /* Discard as uninteresting a change which is less than the
- * minimum change required, (default may be overridden on
- * command-line). */
- if (fabs (diff->change) - 1.0 < options->min_change)
- continue;
-
- test_diff_print (diff, max_change, options);
- }
-
- for (i = 0; i < num_diffs; i++)
- free (diffs[i].tests);
- DONE:
- free (diffs);
- free (tests);
-}
-
-static void
-usage (const char *argv0)
-{
- char const *basename = strrchr(argv0, '/');
- basename = basename ? basename+1 : argv0;
- fprintf (stderr,
- "Usage: %s [options] file [...]\n\n",
- basename);
- fprintf (stderr,
- "Computes significant performance differences for cairo performance reports.\n"
- "Each file should be the output of the cairo-perf program (or \"make perf\").\n"
- "The following options are available:\n"
- "\n"
- "--no-utf Use ascii stars instead of utf-8 change bars.\n"
- " Four stars are printed per factor of speedup.\n"
- "\n"
- "--no-bars Don't display change bars at all.\n\n"
- "\n"
- "--use-ms Use milliseconds to calculate differences.\n"
- " (instead of ticks which are hardware dependent)\n"
- "\n"
- "--min-change threshold[%%]\n"
- " Suppress all changes below the given threshold.\n"
- " The default threshold of 0.05 or 5%% ignores any\n"
- " speedup or slowdown of 1.05 or less. A threshold\n"
- " of 0 will cause all output to be reported.\n"
- );
- exit(1);
-}
-
-static void
-parse_args (int argc,
- char const **argv,
- cairo_perf_diff_files_args_t *args)
-{
- int i;
-
- for (i = 1; i < argc; i++) {
- if (strcmp (argv[i], "--no-utf") == 0) {
- args->options.use_utf = 0;
- }
- else if (strcmp (argv[i], "--no-bars") == 0) {
- args->options.print_change_bars = 0;
- }
- else if (strcmp (argv[i], "--min-change") == 0) {
- char *end = NULL;
- i++;
- if (i >= argc)
- usage (argv[0]);
- args->options.min_change = strtod (argv[i], &end);
- if (*end) {
- if (*end == '%') {
- args->options.min_change /= 100;
- } else {
- usage (argv[0]);
- }
- }
- }
- else {
- args->num_filenames++;
- args->filenames = xrealloc (args->filenames,
- args->num_filenames * sizeof (char *));
- args->filenames[args->num_filenames - 1] = argv[i];
- }
- }
-}
-
-int
-main (int argc,
- const char *argv[])
-{
- cairo_perf_diff_files_args_t args = {
- NULL, /* filenames */
- 0, /* num_filenames */
- {
- 0.05, /* min change */
- 1, /* use UTF-8? */
- 1, /* display change bars? */
- }
- };
- cairo_perf_report_t *reports;
- test_report_t *t;
- int i;
-
- parse_args (argc, argv, &args);
-
- if (args.num_filenames) {
- reports = xcalloc (args.num_filenames, sizeof (cairo_perf_report_t));
- for (i = 0; i < args.num_filenames; i++) {
- cairo_perf_report_load (&reports[i], args.filenames[i], i,
- test_report_cmp_name);
- printf ("loaded: %s, %d tests\n",
- args.filenames[i], reports[i].tests_count);
- }
- } else {
- args.num_filenames = 1;
- reports = xcalloc (args.num_filenames, sizeof (cairo_perf_report_t));
- cairo_perf_report_load (&reports[0], NULL, 0, test_report_cmp_name);
- }
-
- cairo_perf_reports_compare (reports, args.num_filenames, &args.options);
-
- /* Pointless memory cleanup, (would be a great place for talloc) */
- free (args.filenames);
- for (i = 0; i < args.num_filenames; i++) {
- for (t = reports[i].tests; t->name; t++) {
- free (t->samples);
- free (t->backend);
- free (t->name);
- }
- free (reports[i].tests);
- free (reports[i].configuration);
- }
- free (reports);
-
- return 0;
-}
diff --git a/perf/cairo-perf-diff b/perf/cairo-perf-diff
deleted file mode 100755
index 5a4b7b386..000000000
--- a/perf/cairo-perf-diff
+++ /dev/null
@@ -1,255 +0,0 @@
-#!/bin/sh
-set -e
-
-usage() {
- argv0=`basename $0`
-
- cat >&2 << END
-Usage:
-For comparing files created my cairo-perf:
-
- $argv0 old.perf new.perf
-
-For comparing (cached) performance of revisions:
-
- $argv0 [OPTIONS] <revision> [-- cairo-perf options]
- $argv0 [OPTIONS] <rev1> <rev2> [-- cairo-perf-options]
-
-If given a single revision, compares its results to that of its
-(first-parent) predecessor. Otherwise compares the two given revisions.
-The revisions can be any revision accepted by git. For example:
-
- $argv0 HEAD # Show impact of latest commit
- $argv0 1.2.0 1.2.4 # Compare performance of 1.2.0 to 1.2.4
-
-Options:
-
--f, --force
- Forces cairo-perf-diff to re-run performance tests
- even if cached performance data is available.
-
--h, --html
- With this option performance changes are summarized
- as HTML table.
-
--t, --trace
- Compare performance using trace replays instead of
- microbenchmarks.
-
-Additional options can be passed the child cairo-perf process
-by separating them with a double hyphen (--). For example, to
-examine what the impact of the latest change is on the stroke
-test you might use:
-
- $argv0 HEAD -- stroke
-
-The performance results are cached in .perf next to the .git directory.
-
-Set CAIRO_AUTOGEN_OPTIONS to pass options to autogen for both
-builds.
-END
-
- exit 1
-}
-
-benchmark="cairo-perf-micro"
-
-# First, pull off any known options
-while true; do
- case $1 in
- -f|--force) force_cairo_perf="true";;
- -h|--html) html_output="$2"; shift ;;
- -t|--trace) benchmark="cairo-perf-trace";;
- *) break;;
- esac
-
- shift
-done
-
-# Then if anything is left that still looks like an option, (begins
-# with a dash), give usage to catch --help or any other -garbage
-if [ $# -eq 0 ] || [ "`echo "$1" | sed 's/^-//'`" != "$1" ]; then
- usage
-fi
-
-# Finally, pick up the actual revision arguments
-if [ $# -eq 1 ] || [ "$2" = "--" ]; then
- old="$1^"
- new="$1"
- shift 1
-else
- old="$1"
- new="$2"
- shift 2
-fi
-
-# And post-finally, pass anything after -- on to cairo-perf
-CAIRO_PERF_OPTIONS="-r -i 10"
-if [ $# -gt 0 ]; then
- if [ "$1" = "--" ]; then
- shift 1
- CAIRO_PERF_OPTIONS="$CAIRO_PERF_OPTIONS $@"
- else
- usage
- fi
-fi
-
-git_setup() {
- SUBDIRECTORY_OK='Yes'
- . "$(git --exec-path)/git-sh-setup"
- CAIRO_DIR=`dirname $GIT_DIR`
- if [ "$CAIRO_DIR" = "." ]; then
- CAIRO_DIR=`pwd`
- fi
- CAIRO_PERF_DIR=$CAIRO_DIR/.perf
-}
-
-rev2sha() {
- rev=$1
- git rev-parse --verify $rev || ( echo "Cannot resolve $rev as a git object" && exit 1 )
-}
-
-cpu_count() {
- test -f /proc/cpuinfo &&
- grep -c '^processor[[:blank:]]\+:' /proc/cpuinfo ||
- echo 1
-}
-
-# We cache performance output based on a two-part name capturing the
-# current performance test suite and the library being tested. We
-# capture these as the tree object of the perf directory in HEAD and
-# the tree object of the src directory of the revision being tested.
-#
-# This way, whenever the performance suite is updated, cached output
-# from old versions of the suite are automatically invalidated. Also,
-# if a commit just changes things outside of the src tree, (say it
-# changes the "test" test suite, or README or configure.in, or
-# whatever), cairo-perf-diff will be smart enough to still use cached
-# results from a run with an equivalent src tree.
-rev2perf() {
- rev=$1
- sha=`rev2sha $rev`
- src_tree_sha=`rev2sha $rev:src`
- perf_tree_sha=`rev2sha HEAD:perf`
- script_tree_sha=`rev2sha HEAD:util/cairo-script`
- echo "$CAIRO_PERF_DIR/${sha}-${perf_tree_sha}-${script_tree_sha}-${src_tree_sha}.perf"
-}
-rev2perf_glob() {
- rev=$1
- src_tree_sha=`rev2sha $rev:src`
- perf_tree_sha=`rev2sha HEAD:perf`
- script_tree_sha=`rev2sha HEAD:util/cairo-script`
- echo "$CAIRO_PERF_DIR/*-${perf_tree_sha}-${script_tree_sha}-${src_tree_sha}.perf"
-}
-
-build() {
- build_dir=$1
- sha=$2
-
- if [ ! -d $build_dir ]; then
- git clone -s $CAIRO_DIR $build_dir
- (cd $build_dir; git checkout -b tmp-cairo-perf-diff $sha)
- fi
- cd $build_dir
-
- git checkout tmp-cairo-perf-diff
- git reset --hard $sha
-
- if [ -z "$MAKEFLAGS" ]; then
- CPU_COUNT=`cpu_count`
- export MAKEFLAGS="-j`expr $CPU_COUNT + 1`"
- fi
-
- if [ ! -e Makefile ]; then
- ./autogen.sh $CAIRO_AUTOGEN_OPTIONS
- fi
-
- for file in $boilerplate_files; do
- rsync $CAIRO_DIR/$file boilerplate
- done
- for file in $perf_files; do
- rsync $CAIRO_DIR/$file perf
- done
- for file in $script_files; do
- rsync $CAIRO_DIR/$file util/cairo-script
- done
-
- make || (rm config.cache && make)
- (cd boilerplate && make libcairoboilerplate.la)
-
- cd perf
- make ${benchmark}
-}
-
-# Usage: run_cairo_perf_if_not_cached <rev> <suffix>
-# The <rev> argument must be a valid git ref-spec that can
-# be resolved to a commit. The suffix is just something
-# unique so that build directories can be separated for
-# multiple calls to this function.
-run_cairo_perf_if_not_cached() {
- rev=$1
- build_dir="build-$2"
-
- owd=`pwd`
- sha=`rev2sha $rev`
- perf=`rev2perf $rev`
- glob=`rev2perf_glob $rev`
- if [ -e $glob ] && [ "$force_cairo_perf" != "true" ]; then
- return 0
- fi
- if [ ! -d $CAIRO_PERF_DIR ]; then
- echo "Creating new perf cache in $CAIRO_PERF_DIR"
- mkdir $CAIRO_PERF_DIR
- fi
-
- cd $CAIRO_DIR
- boilerplate_files=`git ls-tree --name-only HEAD boilerplate/*`
- perf_files=`git ls-tree --name-only HEAD perf/*`
- script_files=`git ls-tree --name-only HEAD util/cairo-script/*`
- cd $CAIRO_PERF_DIR
-
- build $build_dir $sha || {
- rm -rf $build_dir
- build $build_dir $sha || exit 1
- }
-
- echo "Running \"cairo-perf $CAIRO_PERF_OPTIONS\" against $rev. Results will be cached in:"
- { ./$benchmark $CAIRO_PERF_OPTIONS || echo "*** Performance test crashed"; } >> $perf
-
- cd $owd
-}
-
-git_setup
-
-if [ -e ./cairo-perf-diff-files ]; then
- bindir="."
-else
- bindir=$CAIRO_DIR/perf
-
- # Build cairo-perf-diff-files if not available
- if [ ! -e $bindir/cairo-perf-diff-files ]; then
- echo "Building cairo-perf-diff-files"
- if [ "x$OS" = "xWindows_NT" ]; then
- make -f Makefile.win32 -C $bindir cairo-perf-diff-files CFG=debug
- else
- make -C $bindir cairo-perf-diff-files
- fi
- fi
-fi
-
-if [ ! -e $old ]; then
- run_cairo_perf_if_not_cached $old old
- old=`rev2perf $old`
-fi
-
-if [ ! -e $new ]; then
- run_cairo_perf_if_not_cached $new new
- new=`rev2perf $new`
-fi
-
-if [ -z "$html_output" ]; then
- $bindir/cairo-perf-diff-files $old $new
-else
- $bindir/cairo-perf-diff-files $old $new |
- $CAIRO_DIR/perf/make-html.py > $html_output
-fi
diff --git a/perf/cairo-perf-diff-files.c b/perf/cairo-perf-diff-files.c
deleted file mode 100644
index 36b80cda4..000000000
--- a/perf/cairo-perf-diff-files.c
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of the
- * copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Authors: Carl Worth <cworth@cworth.org>
- */
-
-#include "cairo-perf.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-#include <math.h>
-#include <assert.h>
-
-typedef struct _cairo_perf_report_options {
- double min_change;
- int use_utf;
- int print_change_bars;
- int use_ticks;
-} cairo_perf_report_options_t;
-
-typedef struct _cairo_perf_diff_files_args {
- const char **filenames;
- int num_filenames;
- cairo_perf_report_options_t options;
-} cairo_perf_diff_files_args_t;
-
-static int
-test_diff_cmp_speedup_before_slowdown (const void *a,
- const void *b)
-{
- const test_diff_t *a_diff = a;
- const test_diff_t *b_diff = b;
-
- /* First make all speedups come before all slowdowns. */
- if (a_diff->change > 0 && b_diff->change < 0)
- return -1;
- if (a_diff->change < 0 && b_diff->change > 0)
- return 1;
-
- if (a_diff->change == b_diff->change)
- return 0;
-
- /* Large speedups come first. */
- if (a_diff->change > 0) {
- if (a_diff->change > b_diff->change)
- return -1;
- else
- return 1;
- }
-
- /* Large slowdowns come last. */
- if (a_diff->change < 0) {
- if (a_diff->change < b_diff->change)
- return 1;
- else
- return -1;
- }
-
- return 0;
-}
-
-static int
-test_diff_cmp (const void *a,
- const void *b)
-{
- const test_diff_t *a_diff = a;
- const test_diff_t *b_diff = b;
-
- /* Reverse sort by magnitude of change so larger changes come
- * first */
- if (a_diff->change > b_diff->change)
- return -1;
-
- if (a_diff->change < b_diff->change)
- return 1;
-
- return 0;
-}
-
-#define CHANGE_BAR_WIDTH 70
-static void
-print_change_bar (double change,
- double max_change,
- int use_utf)
-{
- int units_per_cell = ceil (max_change / CHANGE_BAR_WIDTH);
- static char const *ascii_boxes[8] = {
- "****","***" ,"***", "**",
- "**", "*", "*", ""
- };
- static char const *utf_boxes[8] = {
- "█", "▉", "▊", "▋",
- "▌", "▍", "▎", "▏"
- };
- char const **boxes = use_utf ? utf_boxes : ascii_boxes;
-
- /* For a 1.0x speedup we want a zero-size bar to show "no
- * change". */
- change -= 1.0;
-
- while (change > units_per_cell) {
- printf ("%s", boxes[0]);
- change -= units_per_cell;
- }
-
- change /= units_per_cell;
-
- if (change > 7.5/8.0)
- printf ("%s", boxes[0]);
- else if (change > 6.5/8.0)
- printf ("%s", boxes[1]);
- else if (change > 5.5/8.0)
- printf ("%s", boxes[2]);
- else if (change > 4.5/8.0)
- printf ("%s", boxes[3]);
- else if (change > 3.5/8.0)
- printf ("%s", boxes[4]);
- else if (change > 2.5/8.0)
- printf ("%s", boxes[5]);
- else if (change > 1.5/8.0)
- printf ("%s", boxes[6]);
- else if (change > 0.5/8.0)
- printf ("%s", boxes[7]);
-
- printf ("\n");
-}
-
-static void
-test_diff_print_binary (test_diff_t *diff,
- double max_change,
- cairo_perf_report_options_t *options)
-{
- if (diff->tests[0]->size)
- printf ("%5s-%-4s %26s-%-3d",
- diff->tests[0]->backend, diff->tests[0]->content,
- diff->tests[0]->name, diff->tests[0]->size);
- else
- printf ("%5s %26s", diff->tests[0]->backend, diff->tests[0]->name);
-
- printf (" %6.2f (%.2f %4.2f%%) -> %6.2f (%.2f %4.2f%%): %5.2fx ",
- diff->tests[0]->stats.min_ticks / diff->tests[0]->stats.ticks_per_ms,
- diff->tests[0]->stats.median_ticks / diff->tests[0]->stats.ticks_per_ms,
- diff->tests[0]->stats.std_dev * 100,
- diff->tests[1]->stats.min_ticks / diff->tests[1]->stats.ticks_per_ms,
- diff->tests[1]->stats.median_ticks / diff->tests[1]->stats.ticks_per_ms,
- diff->tests[1]->stats.std_dev * 100,
- fabs (diff->change));
-
- if (diff->change > 1.0)
- printf ("speedup\n");
- else
- printf ("slowdown\n");
-
- if (options->print_change_bars)
- print_change_bar (fabs (diff->change), max_change,
- options->use_utf);
-}
-
-static void
-test_diff_print_multi (test_diff_t *diff,
- double max_change,
- cairo_perf_report_options_t *options)
-{
- int i;
- double test_time;
- double change;
-
- if (diff->tests[0]->size) {
- printf ("%s (backend: %s-%s, size: %d)\n",
- diff->tests[0]->name,
- diff->tests[0]->backend,
- diff->tests[0]->content,
- diff->tests[0]->size);
- } else {
- printf ("%s (backend: %s)\n",
- diff->tests[0]->name,
- diff->tests[0]->backend);
- }
-
- for (i = 0; i < diff->num_tests; i++) {
- test_time = diff->tests[i]->stats.min_ticks;
- if (! options->use_ticks)
- test_time /= diff->tests[i]->stats.ticks_per_ms;
- change = diff->max / test_time;
- printf ("[%d] %6.2f: %5.2fx ",
- diff->tests[i]->fileno,
- diff->tests[i]->stats.min_ticks / diff->tests[i]->stats.ticks_per_ms,
- change);
-
- if (options->print_change_bars)
- print_change_bar (change, max_change, options->use_utf);
- else
- printf("\n");
- }
-
- printf("\n");
-}
-
-static void
-cairo_perf_reports_compare (cairo_perf_report_t *reports,
- int num_reports,
- cairo_perf_report_options_t *options)
-{
- int i;
- test_report_t **tests, *min_test;
- test_diff_t *diff, *diffs;
- int num_diffs, max_diffs;
- double max_change;
- double test_time;
- int seen_non_null;
- cairo_bool_t printed_speedup = FALSE;
- cairo_bool_t printed_slowdown = FALSE;
-
- assert (num_reports >= 2);
-
- tests = xmalloc (num_reports * sizeof (test_report_t *));
-
- max_diffs = reports[0].tests_count;
- for (i = 0; i < num_reports; i++) {
- tests[i] = reports[i].tests;
- if (reports[i].tests_count > max_diffs)
- max_diffs = reports[i].tests_count;
- }
-
- diff = diffs = xmalloc (max_diffs * sizeof (test_diff_t));
-
- num_diffs = 0;
- while (1) {
- /* We expect iterations values of 0 when multiple raw reports
- * for the same test have been condensed into the stats of the
- * first. So we just skip these later reports that have no
- * stats. */
- seen_non_null = 0;
- for (i = 0; i < num_reports; i++) {
- while (tests[i]->name && tests[i]->stats.iterations == 0)
- tests[i]++;
- if (tests[i]->name)
- seen_non_null++;
- }
-
- if (seen_non_null < 2)
- break;
-
- /* Find the minimum of all current tests, (we have to do this
- * in case some reports don't have a particular test). */
- for (i = 0; i < num_reports; i++) {
- if (tests[i]->name) {
- min_test = tests[i];
- break;
- }
- }
- for (++i; i < num_reports; i++) {
- if (tests[i]->name &&
- test_report_cmp_backend_then_name (tests[i], min_test) < 0)
- {
- min_test = tests[i];
- }
- }
-
- /* For each report that has the current test, record it into
- * the diff structure. */
- diff->num_tests = 0;
- diff->tests = xmalloc (num_reports * sizeof (test_diff_t));
- for (i = 0; i < num_reports; i++) {
- if (tests[i]->name &&
- test_report_cmp_backend_then_name (tests[i], min_test) == 0)
- {
- test_time = tests[i]->stats.min_ticks;
- if (! options->use_ticks)
- test_time /= tests[i]->stats.ticks_per_ms;
- if (diff->num_tests == 0) {
- diff->min = test_time;
- diff->max = test_time;
- } else {
- if (test_time < diff->min)
- diff->min = test_time;
- if (test_time > diff->max)
- diff->max = test_time;
- }
- diff->tests[diff->num_tests++] = tests[i];
- tests[i]++;
- }
- }
- diff->change = diff->max / diff->min;
-
- if (num_reports == 2) {
- double old_time, new_time;
- if (diff->num_tests == 1) {
- printf ("Only in %s: %s %s\n",
- diff->tests[0]->configuration,
- diff->tests[0]->backend,
- diff->tests[0]->name);
- continue;
- }
- old_time = diff->tests[0]->stats.min_ticks;
- new_time = diff->tests[1]->stats.min_ticks;
- if (! options->use_ticks) {
- old_time /= diff->tests[0]->stats.ticks_per_ms;
- new_time /= diff->tests[1]->stats.ticks_per_ms;
- }
- diff->change = old_time / new_time;
- if (diff->change < 1.0)
- diff->change = - 1.0 / diff->change;
- }
-
- diff++;
- num_diffs++;
- }
- if (num_diffs == 0)
- goto DONE;
-
- if (num_reports == 2)
- qsort (diffs, num_diffs, sizeof (test_diff_t),
- test_diff_cmp_speedup_before_slowdown);
- else
- qsort (diffs, num_diffs, sizeof (test_diff_t), test_diff_cmp);
-
- max_change = 1.0;
- for (i = 0; i < num_diffs; i++) {
- if (fabs (diffs[i].change) > max_change)
- max_change = fabs (diffs[i].change);
- }
-
- if (num_reports == 2)
- printf ("old: %s\n"
- "new: %s\n",
- diffs->tests[0]->configuration,
- diffs->tests[1]->configuration);
-
- for (i = 0; i < num_diffs; i++) {
- diff = &diffs[i];
-
- /* Discard as uninteresting a change which is less than the
- * minimum change required, (default may be overriden on
- * command-line). */
- if (fabs (diff->change) - 1.0 < options->min_change)
- continue;
-
- if (num_reports == 2) {
- if (diff->change > 1.0 && ! printed_speedup) {
- printf ("Speedups\n"
- "========\n");
- printed_speedup = TRUE;
- }
- if (diff->change < 1.0 && ! printed_slowdown) {
- printf ("Slowdowns\n"
- "=========\n");
- printed_slowdown = TRUE;
- }
- test_diff_print_binary (diff, max_change, options);
- } else {
- test_diff_print_multi (diff, max_change, options);
- }
- }
-
- DONE:
- for (i = 0; i < num_diffs; i++)
- free (diffs[i].tests);
- free (diffs);
- free (tests);
-}
-
-static void
-usage (const char *argv0)
-{
- char const *basename = strrchr(argv0, '/');
- basename = basename ? basename+1 : argv0;
- fprintf (stderr,
- "Usage: %s [options] file1 file2 [...]\n\n",
- basename);
- fprintf (stderr,
- "Computes significant performance differences for cairo performance reports.\n"
- "Each file should be the output of the cairo-perf program (or \"make perf\").\n"
- "The following options are available:\n"
- "\n"
- "--no-utf Use ascii stars instead of utf-8 change bars.\n"
- " Four stars are printed per factor of speedup.\n"
- "\n"
- "--no-bars Don't display change bars at all.\n\n"
- "\n"
- "--use-ms Use milliseconds to calculate differences.\n"
- " (instead of ticks which are hardware dependent)\n"
- "\n"
- "--min-change threshold[%%]\n"
- " Suppress all changes below the given threshold.\n"
- " The default threshold of 0.05 or 5%% ignores any\n"
- " speedup or slowdown of 1.05 or less. A threshold\n"
- " of 0 will cause all output to be reported.\n"
- );
- exit(1);
-}
-
-static void
-parse_args (int argc,
- char const **argv,
- cairo_perf_diff_files_args_t *args)
-{
- int i;
-
- for (i = 1; i < argc; i++) {
- if (strcmp (argv[i], "--no-utf") == 0) {
- args->options.use_utf = 0;
- }
- else if (strcmp (argv[i], "--no-bars") == 0) {
- args->options.print_change_bars = 0;
- }
- else if (strcmp (argv[i], "--use-ms") == 0) {
- /* default */
- }
- else if (strcmp (argv[i], "--use-ticks") == 0) {
- args->options.use_ticks = 1;
- }
- else if (strcmp (argv[i], "--min-change") == 0) {
- char *end = NULL;
- i++;
- if (i >= argc)
- usage (argv[0]);
- args->options.min_change = strtod (argv[i], &end);
- if (*end) {
- if (*end == '%') {
- args->options.min_change /= 100;
- } else {
- usage (argv[0]);
- }
- }
- }
- else {
- args->num_filenames++;
- args->filenames = xrealloc (args->filenames,
- args->num_filenames * sizeof (char *));
- args->filenames[args->num_filenames - 1] = argv[i];
- }
- }
-}
-
-int
-main (int argc,
- const char *argv[])
-{
- cairo_perf_diff_files_args_t args = {
- NULL, /* filenames */
- 0, /* num_filenames */
- {
- 0.05, /* min change */
- 1, /* use UTF-8? */
- 1, /* display change bars? */
- }
- };
- cairo_perf_report_t *reports;
- test_report_t *t;
- int i;
-
- parse_args (argc, argv, &args);
-
- if (args.num_filenames < 2)
- usage (argv[0]);
-
- reports = xmalloc (args.num_filenames * sizeof (cairo_perf_report_t));
-
- for (i = 0; i < args.num_filenames; i++ ) {
- cairo_perf_report_load (&reports[i], args.filenames[i], i, NULL);
- printf ("[%d] %s\n", i, args.filenames[i]);
- }
- printf ("\n");
-
- cairo_perf_reports_compare (reports, args.num_filenames, &args.options);
-
- /* Pointless memory cleanup, (would be a great place for talloc) */
- free (args.filenames);
- for (i = 0; i < args.num_filenames; i++) {
- for (t = reports[i].tests; t->name; t++) {
- free (t->samples);
- free (t->backend);
- free (t->name);
- }
- free (reports[i].tests);
- free (reports[i].configuration);
- }
- free (reports);
-
- return 0;
-}
diff --git a/perf/cairo-perf-graph b/perf/cairo-perf-graph
deleted file mode 100755
index a167351fc..000000000
--- a/perf/cairo-perf-graph
+++ /dev/null
@@ -1,206 +0,0 @@
-#!/bin/sh
-set -e
-
-###
-### XXX Source common functions from cairo-perf-diff
-###
-
-usage() {
- argv0=`basename $0`
-
- cat >&2 << END
-Usage:
-As opposed to its sibling, cairo-perf-diff, cairo-perf-graph targets
-reviewing changes between series by graphically comparing the performance
-at each commit.
-
-The two revisions can be any revision accepted by git. For example:
-
- $argv0 1.2.0 1.2.4 # Compare performance of 1.2.0 to 1.2.4
-
-Options:
-
--f, --force
- Forces cairo-perf-diff to re-run performance tests
- even if cached performance data is available.
-
--h, --html
- With this option performance changes are summarized
- as HTML table.
-
-Additional options can be passed the child cairo-perf process
-by separating them with a double hyphen (--). For example, to
-examine what the impact of the latest change is on the stroke
-test you might use:
-
- $argv0 HEAD -- stroke
-
-The performance results are cached in .perf next to the .git directory.
-
-Set CAIRO_AUTOGEN_OPTIONS to pass options to autogen for both
-builds.
-END
-
- exit 1
-}
-
-# First, pull off any known options
-while true; do
- case $1 in
- -f|--force) force_cairo_perf="true";;
- -h|--html) html_output="true";;
- -s|--show) show_only="true";;
- *) break;;
- esac
-
- shift
-done
-
-# Then if anything is left that still looks like an option, (begins
-# with a dash), give usage to catch --help or any other -garbage
-if [ $# -eq 0 ] || [ "`echo "$1" | sed 's/^-//'`" != "$1" ]; then
- usage
-fi
-
-# Finally, pick up the actual revision arguments
-old="$1"
-new="$2"
-shift 2
-
-# And post-finally, pass anything after -- on to cairo-perf
-CAIRO_PERF_OPTIONS="-r -i 25"
-if [ $# -gt 0 ]; then
- if [ "$1" = "--" ]; then
- shift 1
- CAIRO_PERF_OPTIONS="$CAIRO_PERF_OPTIONS $@"
- else
- usage
- fi
-fi
-
-git_setup() {
- SUBDIRECTORY_OK='Yes'
- . "$(git --exec-path)/git-sh-setup"
- CAIRO_DIR=`dirname $GIT_DIR`
- if [ "$CAIRO_DIR" = "." ]; then
- CAIRO_DIR=`pwd`
- fi
- CAIRO_PERF_DIR=$CAIRO_DIR/.perf
-}
-
-rev2sha() {
- rev=$1
- git rev-parse --verify $rev || ( echo "Cannot resolve $rev as a git object" && exit 1 )
-}
-
-cpu_count() {
- test -f /proc/cpuinfo &&
- grep -c '^processor[[:blank:]]\+:' /proc/cpuinfo ||
- echo 1
-}
-
-# We cache performance output based on a two-part name capturing the
-# current performance test suite and the library being tested. We
-# capture these as the tree object of the perf directory in HEAD and
-# the tree object of the src directory of the revision being tested.
-#
-# This way, whenever the performance suite is updated, cached output
-# from old versions of the suite are automatically invalidated. Also,
-# if a commit just changes things outside of the src tree, (say it
-# changes the "test" test suite, or README or configure.in, or
-# whatever), cairo-perf-diff will be smart enough to still use cached
-# results from a run with an equivalent src tree.
-rev2perf() {
- rev=$1
- sha=`rev2sha $rev`
- src_tree_sha=`rev2sha $rev:src`
- perf_tree_sha=`rev2sha HEAD:perf`
- echo "$CAIRO_PERF_DIR/${sha}-${perf_tree_sha}-${src_tree_sha}.perf"
-}
-rev2perf_glob() {
- rev=$1
- src_tree_sha=`rev2sha $rev:src`
- perf_tree_sha=`rev2sha HEAD:perf`
- echo "$CAIRO_PERF_DIR/*-${perf_tree_sha}-${src_tree_sha}.perf"
-}
-
-# Usage: run_cairo_perf_if_not_cached <rev> <suffix>
-# The <rev> argument must be a valid git ref-spec that can
-# be resolved to a commit. The suffix is just something
-# unique so that build directories can be separated for
-# multiple calls to this function.
-run_cairo_perf_if_not_cached() {
- rev=$1
- build_dir="build-$2"
-
- owd=`pwd`
- sha=`rev2sha $rev`
- perf=`rev2perf $rev`
- glob=`rev2perf_glob $rev`
- if [ -e $glob ] && [ "$force_cairo_perf" != "true" ] || [ -n "$show_only" ]; then
- return 0
- fi
- if [ ! -d $CAIRO_PERF_DIR ]; then
- echo "Creating new perf cache in $CAIRO_PERF_DIR"
- mkdir $CAIRO_PERF_DIR
- fi
-
- cd $CAIRO_DIR
- boilerplate_files=`git ls-tree --name-only HEAD boilerplate/*`
- perf_files=`git ls-tree --name-only HEAD perf/*`
- cd $CAIRO_PERF_DIR
-
- if [ ! -d $build_dir ]; then
- git clone -s $CAIRO_DIR $build_dir
- (cd $build_dir; git checkout -b tmp-cairo-perf-diff $sha)
- fi
- cd $build_dir
-
- git checkout tmp-cairo-perf-diff
- git reset --hard $sha
-
- if [ -z "$MAKEFLAGS" ]; then
- CPU_COUNT=`cpu_count`
- export MAKEFLAGS="-j`expr $CPU_COUNT + 1`"
- fi
-
- if [ ! -e Makefile ]; then
- CFLAGS="-O2" ./autogen.sh $CAIRO_AUTOGEN_OPTIONS
- fi
- make CFLAGS="-O2" || (rm config.cache && make CFLAGS="-O2")
- for file in $boilerplate_files; do
- rsync $CAIRO_DIR/$file boilerplate
- done
- (cd boilerplate; make)
- for file in $perf_files; do
- rsync $CAIRO_DIR/$file perf
- done
- cd perf;
- make cairo-perf || exit 1
- echo "Running \"cairo-perf $CAIRO_PERF_OPTIONS\" against $rev. Results will be cached in:"
- echo "$perf"
- (./cairo-perf $CAIRO_PERF_OPTIONS || echo "*** Performance test crashed") >> $perf
- cd $owd
-}
-
-git_setup
-
-# Build cairo-perf-graph-files if not available
-if [ ! -e $CAIRO_DIR/perf/cairo-perf-graph-files ]; then
- echo "Building cairo-perf-graph-files"
- if [ "x$OS" = "xWindows_NT" ]; then
- make -f Makefile.win32 -C $CAIRO_DIR/perf/ cairo-perf-graph-files CFG=debug
- else
- make -C $CAIRO_DIR/perf/ cairo-perf-graph-files
- fi
-fi
-
-revs=""
-for rev in `git rev-list --reverse $old..$new`; do
- run_cairo_perf_if_not_cached $rev rev
- perf=`rev2perf $rev`
- [ -e "$perf" ] && revs="$revs $perf"
-done
-
-exec $CAIRO_DIR/perf/cairo-perf-graph-files $revs
-#exec $CAIRO_DIR/libtool --mode=execute gdb --args $CAIRO_DIR/perf/cairo-perf-graph-files $revs
diff --git a/perf/cairo-perf-graph-files.c b/perf/cairo-perf-graph-files.c
deleted file mode 100644
index 1fd99e4ad..000000000
--- a/perf/cairo-perf-graph-files.c
+++ /dev/null
@@ -1,604 +0,0 @@
-/*
- * Copyright © 2008 Chris Wilson
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of the
- * copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Authors: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-#include "cairo-perf-graph.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
-
-#include <cairo.h>
-
-static void
-usage (const char *argv0)
-{
- char const *basename = strrchr (argv0, '/');
- basename = basename ? basename+1 : argv0;
- g_printerr ("Usage: %s [options] file1 file2 [...]\n\n", basename);
- g_printerr ("Draws a graph illustrating the change in performance over a series.\n");
- exit(1);
-}
-
-enum {
- CASE_SHOWN,
- CASE_INCONSISTENT,
- CASE_BACKEND,
- CASE_CONTENT,
- CASE_NAME,
- CASE_SIZE,
- CASE_FG_COLOR,
- CASE_DATA,
- CASE_NCOLS
-};
-
-static GtkTreeStore *
-cases_to_store (test_case_t *cases)
-{
- GtkTreeStore *store;
- GtkTreeIter backend_iter;
- GtkTreeIter content_iter;
- const char *backend = NULL;
- const char *content = NULL;
-
- store = gtk_tree_store_new (CASE_NCOLS,
- G_TYPE_BOOLEAN, /* shown */
- G_TYPE_BOOLEAN, /* inconsistent */
- G_TYPE_STRING, /* backend */
- G_TYPE_STRING, /* content */
- G_TYPE_STRING, /* name */
- G_TYPE_INT, /* size */
- GDK_TYPE_COLOR, /* fg color */
- G_TYPE_POINTER); /* data */
- while (cases->backend != NULL) {
- GtkTreeIter iter;
-
- if (backend == NULL || strcmp (backend, cases->backend)) {
- gtk_tree_store_append (store, &backend_iter, NULL);
- gtk_tree_store_set (store, &backend_iter,
- CASE_SHOWN, TRUE,
- CASE_BACKEND, cases->backend,
- -1);
- backend = cases->backend;
- content = NULL;
- }
- if (content == NULL || strcmp (content, cases->content)) {
- gtk_tree_store_append (store, &content_iter, &backend_iter);
- gtk_tree_store_set (store, &content_iter,
- CASE_SHOWN, TRUE,
- CASE_BACKEND, cases->backend,
- CASE_CONTENT, cases->content,
- -1);
- content = cases->content;
- }
-
- gtk_tree_store_append (store, &iter, &content_iter);
- gtk_tree_store_set (store, &iter,
- CASE_SHOWN, TRUE,
- CASE_BACKEND, cases->backend,
- CASE_CONTENT, cases->content,
- CASE_NAME, cases->name,
- CASE_SIZE, cases->size,
- CASE_FG_COLOR, &cases->color,
- CASE_DATA, cases,
- -1);
- cases++;
- }
-
- return store;
-}
-
-struct _app_data {
- GtkWidget *window;
-
- test_case_t *cases;
- cairo_perf_report_t *reports;
- int num_reports;
-
- GtkTreeStore *case_store;
-
- GIOChannel *git_io;
- GtkTextBuffer *git_buffer;
-
- GtkWidget *gv;
-};
-
-static void
-recurse_set_shown (GtkTreeModel *model,
- GtkTreeIter *parent,
- gboolean shown)
-{
- GtkTreeIter iter;
-
- if (gtk_tree_model_iter_children (model, &iter, parent)) do {
- test_case_t *c;
-
- gtk_tree_model_get (model, &iter, CASE_DATA, &c, -1);
- if (c == NULL) {
- recurse_set_shown (model, &iter, shown);
- } else if (shown != c->shown) {
- c->shown = shown;
- gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
- CASE_SHOWN, shown,
- CASE_INCONSISTENT, FALSE,
- -1);
- }
- } while (gtk_tree_model_iter_next (model, &iter));
-}
-
-static gboolean
-children_consistent (GtkTreeModel *model,
- GtkTreeIter *parent)
-{
- GtkTreeIter iter;
- gboolean first = TRUE;
- gboolean first_active;
-
- if (gtk_tree_model_iter_children (model, &iter, parent)) do {
- gboolean active, inconsistent;
-
- gtk_tree_model_get (model, &iter,
- CASE_INCONSISTENT, &inconsistent,
- CASE_SHOWN, &active,
- -1);
- if (inconsistent)
- return FALSE;
-
- if (first) {
- first_active = active;
- first = FALSE;
- } else if (active != first_active)
- return FALSE;
- } while (gtk_tree_model_iter_next (model, &iter));
-
- return TRUE;
-}
-
-static void
-check_consistent (GtkTreeModel *model,
- GtkTreeIter *child)
-{
- GtkTreeIter parent;
-
- if (gtk_tree_model_iter_parent (model, &parent, child)) {
- gtk_tree_store_set (GTK_TREE_STORE (model), &parent,
- CASE_INCONSISTENT,
- ! children_consistent (model, &parent),
- -1);
- check_consistent (model, &parent);
- }
-}
-
-static void
-show_case_toggled (GtkCellRendererToggle *cell,
- gchar *str,
- struct _app_data *app)
-{
- GtkTreeModel *model;
- GtkTreePath *path;
- GtkTreeIter iter;
- test_case_t *c;
- gboolean active;
-
- active = ! gtk_cell_renderer_toggle_get_active (cell);
-
- model = GTK_TREE_MODEL (app->case_store);
-
- path = gtk_tree_path_new_from_string (str);
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_path_free (path);
-
- gtk_tree_store_set (app->case_store, &iter,
- CASE_SHOWN, active,
- CASE_INCONSISTENT, FALSE,
- -1);
- gtk_tree_model_get (model, &iter, CASE_DATA, &c, -1);
- if (c != NULL) {
- if (active == c->shown)
- return;
-
- c->shown = active;
- } else {
- recurse_set_shown (model, &iter, active);
- }
- check_consistent (model, &iter);
-
- graph_view_update_visible ((GraphView *) app->gv);
-}
-
-static gboolean
-git_read (GIOChannel *io,
- GIOCondition cond,
- struct _app_data *app)
-{
- int fd;
-
- fd = g_io_channel_unix_get_fd (io);
- do {
- char buf[4096];
- int len;
- GtkTextIter end;
-
- len = read (fd, buf, sizeof (buf));
- if (len <= 0) {
- int err = len ? errno : 0;
- switch (err) {
- case EAGAIN:
- case EINTR:
- return TRUE;
- default:
- g_io_channel_unref (app->git_io);
- app->git_io = NULL;
- return FALSE;
- }
- }
-
- gtk_text_buffer_get_end_iter (app->git_buffer, &end);
- gtk_text_buffer_insert (app->git_buffer, &end, buf, len);
- } while (TRUE);
-}
-
-static void
-do_git (struct _app_data *app,
- char **argv)
-{
- gint output;
- GError *error = NULL;
- GtkTextIter start, stop;
- long flags;
-
- if (! g_spawn_async_with_pipes (NULL, argv, NULL,
- G_SPAWN_SEARCH_PATH |
- G_SPAWN_STDERR_TO_DEV_NULL |
- G_SPAWN_FILE_AND_ARGV_ZERO,
- NULL, NULL, NULL,
- NULL, &output, NULL,
- &error))
- {
- g_error ("spawn failed: %s", error->message);
- }
-
- if (app->git_io) {
- g_io_channel_shutdown (app->git_io, FALSE, NULL);
- g_io_channel_unref (app->git_io);
- }
-
- gtk_text_buffer_get_bounds (app->git_buffer, &start, &stop);
- gtk_text_buffer_delete (app->git_buffer, &start, &stop);
-
- flags = fcntl (output, F_GETFL);
- if ((flags & O_NONBLOCK) == 0)
- fcntl (output, F_SETFL, flags | O_NONBLOCK);
-
- app->git_io = g_io_channel_unix_new (output);
- g_io_add_watch (app->git_io, G_IO_IN | G_IO_HUP, (GIOFunc) git_read, app);
-}
-
-static void
-gv_report_selected (GraphView *gv,
- int i,
- struct _app_data *app)
-{
- cairo_perf_report_t *report;
- char *hyphen;
-
- if (i == -1)
- return;
-
- report = &app->reports[i];
- hyphen = strchr (report->configuration, '-');
- if (hyphen != NULL) {
- int len = hyphen - report->configuration;
- char *id = g_malloc (len + 1);
- char *argv[5];
-
- memcpy (id, report->configuration, len);
- id[len] = '\0';
-
- argv[0] = (char *) "git";
- argv[1] = (char *) "git";
- argv[2] = (char *) "show";
- argv[3] = id;
- argv[4] = NULL;
-
- do_git (app, argv);
- g_free (id);
- }
-}
-
-static GtkWidget *
-window_create (test_case_t *cases,
- cairo_perf_report_t *reports,
- int num_reports)
-{
- GtkWidget *window, *table, *w;
- GtkWidget *tv, *sw;
- GtkTreeStore *store;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- struct _app_data *data;
-
-
- data = g_new0 (struct _app_data, 1);
- data->cases = cases;
- data->reports = reports;
- data->num_reports = num_reports;
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title (GTK_WINDOW (window), "Cairo Performance Graph");
- g_object_set_data_full (G_OBJECT (window),
- "app-data", data, (GDestroyNotify)g_free);
-
- data->window = window;
-
- table = gtk_table_new (2, 2, FALSE);
-
- /* legend & show/hide lines (categorised) */
- tv = gtk_tree_view_new ();
- store = cases_to_store (cases);
- data->case_store = store;
- gtk_tree_view_set_model (GTK_TREE_VIEW (tv), GTK_TREE_MODEL (store));
-
- renderer = gtk_cell_renderer_toggle_new ();
- column = gtk_tree_view_column_new_with_attributes (NULL,
- renderer,
- "active", CASE_SHOWN,
- "inconsistent", CASE_INCONSISTENT,
- NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
- g_signal_connect (renderer, "toggled",
- G_CALLBACK (show_case_toggled), data);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Backend",
- renderer,
- "text", CASE_BACKEND,
- NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Content",
- renderer,
- "text", CASE_CONTENT,
- NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Test",
- renderer,
- "text", CASE_NAME,
- "foreground-gdk", CASE_FG_COLOR,
- NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Size",
- renderer,
- "text", CASE_SIZE,
- NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column);
-
- gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tv), TRUE);
- g_object_unref (store);
-
- sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
- GTK_POLICY_NEVER,
- GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (sw), tv);
- gtk_widget_show (tv);
- gtk_table_attach (GTK_TABLE (table), sw,
- 0, 1, 0, 2,
- GTK_FILL, GTK_FILL,
- 4, 4);
- gtk_widget_show (sw);
-
- /* the performance chart */
- w = graph_view_new ();
- data->gv = w;
- g_signal_connect (w, "report-selected",
- G_CALLBACK (gv_report_selected), data);
- graph_view_set_reports ((GraphView *)w, cases, reports, num_reports);
- gtk_table_attach (GTK_TABLE (table), w,
- 1, 2, 0, 1,
- GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
- 4, 4);
- gtk_widget_show (w);
-
- /* interesting information - presumably the commit log */
- w = gtk_text_view_new ();
- data->git_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (w));
- sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
- GTK_POLICY_NEVER,
- GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (sw), w);
- gtk_widget_show (w);
- gtk_table_attach (GTK_TABLE (table), sw,
- 1, 2, 1, 2,
- GTK_FILL, GTK_FILL | GTK_EXPAND,
- 4, 4);
- gtk_widget_show (sw);
-
- gtk_container_add (GTK_CONTAINER (window), table);
- gtk_widget_show (table);
-
- return window;
-}
-
-static void
-name_to_color (const char *name,
- GdkColor *color)
-{
- gint v = g_str_hash (name);
-
- color->red = ((v >> 0) & 0xff) / 384. * 0xffff;
- color->green = ((v >> 8) & 0xff) / 384. * 0xffff;
- color->blue = ((v >> 16) & 0xff) / 384. * 0xffff;
-}
-
-static test_case_t *
-test_cases_from_reports (cairo_perf_report_t *reports,
- int num_reports)
-{
- test_case_t *cases, *c;
- test_report_t **tests;
- int i, j;
- int num_tests;
-
- num_tests = 0;
- for (i = 0; i < num_reports; i++) {
- for (j = 0; reports[i].tests[j].name != NULL; j++)
- ;
- if (j > num_tests)
- num_tests = j;
- }
-
- cases = xcalloc (num_tests+1, sizeof (test_case_t));
- tests = xmalloc (num_reports * sizeof (test_report_t *));
- for (i = 0; i < num_reports; i++)
- tests[i] = reports[i].tests;
-
- c = cases;
- while (1) {
- int seen_non_null;
- test_report_t *min_test;
-
- /* We expect iterations values of 0 when multiple raw reports
- * for the same test have been condensed into the stats of the
- * first. So we just skip these later reports that have no
- * stats. */
- seen_non_null = 0;
- for (i = 0; i < num_reports; i++) {
- while (tests[i]->name && tests[i]->stats.iterations == 0)
- tests[i]++;
- if (tests[i]->name)
- seen_non_null++;
- }
-
- if (seen_non_null < 2)
- break;
-
- /* Find the minimum of all current tests, (we have to do this
- * in case some reports don't have a particular test). */
- for (i = 0; i < num_reports; i++) {
- if (tests[i]->name) {
- min_test = tests[i];
- break;
- }
- }
- for (++i; i < num_reports; i++) {
- if (tests[i]->name &&
- test_report_cmp_backend_then_name (tests[i], min_test) < 0)
- {
- min_test = tests[i];
- }
- }
-
- c->min_test = min_test;
- c->backend = min_test->backend;
- c->content = min_test->content;
- c->name = min_test->name;
- c->size = min_test->size;
- c->baseline = min_test->stats.min_ticks;
- c->min = c->max = 1.;
- c->shown = TRUE;
- name_to_color (c->name, &c->color);
-
- for (i = 0; i < num_reports; i++) {
- if (tests[i]->name &&
- test_report_cmp_backend_then_name (tests[i], min_test) == 0)
- {
- tests[i]++;
- break;
- }
- }
-
- for (++i; i < num_reports; i++) {
- if (tests[i]->name &&
- test_report_cmp_backend_then_name (tests[i], min_test) == 0)
- {
- double v = tests[i]->stats.min_ticks / c->baseline;
- if (v < c->min)
- c->min = v;
- if (v > c->max)
- c->max = v;
- tests[i]++;
- }
- }
-
- c++;
- }
- free (tests);
-
- return cases;
-}
-int
-main (int argc,
- char *argv[])
-{
- cairo_perf_report_t *reports;
- test_case_t *cases;
- test_report_t *t;
- int i;
- GtkWidget *window;
-
- gtk_init (&argc, &argv);
-
- if (argc < 3)
- usage (argv[0]);
-
- reports = xmalloc ((argc-1) * sizeof (cairo_perf_report_t));
- for (i = 1; i < argc; i++ )
- cairo_perf_report_load (&reports[i-1], argv[i], i, NULL);
-
- cases = test_cases_from_reports (reports, argc-1);
-
- window = window_create (cases, reports, argc-1);
- g_signal_connect (window, "delete-event",
- G_CALLBACK (gtk_main_quit), NULL);
- gtk_widget_show (window);
-
- gtk_main ();
-
- /* Pointless memory cleanup, (would be a great place for talloc) */
- free (cases);
- for (i = 0; i < argc-1; i++) {
- for (t = reports[i].tests; t->name; t++) {
- free (t->samples);
- free (t->backend);
- free (t->name);
- }
- free (reports[i].tests);
- free (reports[i].configuration);
- }
- free (reports);
-
- return 0;
-}
diff --git a/perf/cairo-perf-graph-widget.c b/perf/cairo-perf-graph-widget.c
deleted file mode 100644
index 41311f7ee..000000000
--- a/perf/cairo-perf-graph-widget.c
+++ /dev/null
@@ -1,604 +0,0 @@
-/*
- * Copyright © 2008 Chris Wilson
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of the
- * copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Authors: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-#include "cairo-perf-graph.h"
-
-#include <gtk/gtk.h>
-
-struct _GraphView {
- GtkWidget widget;
-
- test_case_t *cases;
- cairo_perf_report_t *reports;
- int num_reports;
- double ymin, ymax;
-
- int selected_report;
-};
-
-typedef struct _GraphViewClass {
- GtkWidgetClass parent_class;
-} GraphViewClass;
-
-static GType graph_view_get_type (void);
-
-enum {
- REPORT_SELECTED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL];
-
-G_DEFINE_TYPE (GraphView, graph_view, GTK_TYPE_WIDGET)
-
-static void
-draw_baseline_performance (test_case_t *cases,
- cairo_perf_report_t *reports,
- int num_reports,
- cairo_t *cr,
- const cairo_matrix_t *m)
-{
- test_report_t **tests;
- double dots[2] = { 0, 1.};
- int i;
-
- tests = xmalloc (num_reports * sizeof (test_report_t *));
- for (i = 0; i < num_reports; i++)
- tests[i] = reports[i].tests;
-
- while (cases->backend != NULL) {
- test_report_t *min_test;
- double baseline, last_y;
- double x, y;
-
- if (! cases->shown) {
- cases++;
- continue;
- }
-
- min_test = cases->min_test;
-
- for (i = 0; i < num_reports; i++) {
- while (tests[i]->name &&
- test_report_cmp_backend_then_name (tests[i], min_test) < 0)
- {
- tests[i]++;
- }
- }
-
- /* first the stroke */
- cairo_save (cr);
- cairo_set_line_width (cr, 2.);
- gdk_cairo_set_source_color (cr, &cases->color);
- for (i = 0; i < num_reports; i++) {
- if (tests[i]->name &&
- test_report_cmp_backend_then_name (tests[i], min_test) == 0)
- {
- baseline = tests[i]->stats.min_ticks;
-
- x = i; y = 0;
- cairo_matrix_transform_point (m, &x, &y);
- x = floor (x);
- y = floor (y);
- cairo_move_to (cr, x, y);
- last_y = y;
- break;
- }
- }
-
- for (++i; i < num_reports; i++) {
- if (tests[i]->name &&
- test_report_cmp_backend_then_name (tests[i], min_test) == 0)
- {
- x = i, y = tests[i]->stats.min_ticks / baseline;
-
- if (y < 1.)
- y = -1./y + 1;
- else
- y -= 1;
-
- cairo_matrix_transform_point (m, &x, &y);
- x = floor (x);
- y = floor (y);
- cairo_line_to (cr, x, last_y);
- cairo_line_to (cr, x, y);
- last_y = y;
- }
- }
- {
- x = num_reports, y = 0;
- cairo_matrix_transform_point (m, &x, &y);
- x = floor (x);
- cairo_line_to (cr, x, last_y);
- }
-
- cairo_set_line_width (cr, 1.);
- cairo_stroke (cr);
-
- /* then draw the points */
- for (i = 0; i < num_reports; i++) {
- if (tests[i]->name &&
- test_report_cmp_backend_then_name (tests[i], min_test) == 0)
- {
- baseline = tests[i]->stats.min_ticks;
-
- x = i; y = 0;
- cairo_matrix_transform_point (m, &x, &y);
- x = floor (x);
- y = floor (y);
- cairo_move_to (cr, x, y);
- cairo_close_path (cr);
- last_y = y;
-
- tests[i]++;
- break;
- }
- }
-
- for (++i; i < num_reports; i++) {
- if (tests[i]->name &&
- test_report_cmp_backend_then_name (tests[i], min_test) == 0)
- {
- x = i, y = tests[i]->stats.min_ticks / baseline;
-
- if (y < 1.)
- y = -1./y + 1;
- else
- y -= 1;
-
- cairo_matrix_transform_point (m, &x, &y);
- x = floor (x);
- y = floor (y);
- cairo_move_to (cr, x, last_y);
- cairo_close_path (cr);
- cairo_move_to (cr, x, y);
- cairo_close_path (cr);
- last_y = y;
-
- tests[i]++;
- }
- }
- {
- x = num_reports, y = 0;
- cairo_matrix_transform_point (m, &x, &y);
- x = floor (x);
- cairo_move_to (cr, x, last_y);
- cairo_close_path (cr);
- }
- cairo_set_source_rgba (cr, 0, 0, 0, .5);
- cairo_set_dash (cr, dots, 2, 0.);
- cairo_set_line_width (cr, 3.);
- cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
- cairo_stroke (cr);
- cairo_restore (cr);
-
- cases++;
- }
- free (tests);
-}
-
-static void
-draw_hline (cairo_t *cr,
- const cairo_matrix_t *m,
- double y0,
- double xmin,
- double xmax)
-{
- double x, y;
- double py_offset;
-
- py_offset = fmod (cairo_get_line_width (cr) / 2., 1.);
-
- x = xmin; y = y0;
- cairo_matrix_transform_point (m, &x, &y);
- cairo_move_to (cr, floor (x), floor (y) + py_offset);
-
- x = xmax; y = y0;
- cairo_matrix_transform_point (m, &x, &y);
- cairo_line_to (cr, ceil (x), floor (y) + py_offset);
-
- cairo_stroke (cr);
-}
-
-static void
-draw_label (cairo_t *cr,
- const cairo_matrix_t *m,
- double y0,
- double xmin,
- double xmax)
-{
- double x, y;
- char buf[80];
- cairo_text_extents_t extents;
-
- snprintf (buf, sizeof (buf), "%.0fx", fabs (y0));
- cairo_text_extents (cr, buf, &extents);
-
- x = xmin; y = y0;
- cairo_matrix_transform_point (m, &x, &y);
- cairo_move_to (cr,
- x - extents.width - 4,
- y - (extents.height/2. + extents.y_bearing));
- cairo_show_text (cr, buf);
-
-
- snprintf (buf, sizeof (buf), "%.0fx", fabs (y0));
- cairo_text_extents (cr, buf, &extents);
-
- x = xmax; y = y0;
- cairo_matrix_transform_point (m, &x, &y);
- cairo_move_to (cr,
- x + 4,
- y - (extents.height/2. + extents.y_bearing));
- cairo_show_text (cr, buf);
-}
-
-#define ALIGN_X(v) ((v)<<0)
-#define ALIGN_Y(v) ((v)<<2)
-static void
-draw_rotated_label (cairo_t *cr,
- const char *text,
- double x,
- double y,
- double angle,
- int align)
-{
- cairo_text_extents_t extents;
-
- cairo_text_extents (cr, text, &extents);
-
- cairo_save (cr); {
- cairo_translate (cr, x, y);
- cairo_rotate (cr, angle);
- switch (align) {
- case ALIGN_X(0) | ALIGN_Y(0):
- cairo_move_to (cr,
- -extents.x_bearing,
- -extents.y_bearing);
- break;
- case ALIGN_X(0) | ALIGN_Y(1):
- cairo_move_to (cr,
- -extents.x_bearing,
- - (extents.height/2. + extents.y_bearing));
- break;
- case ALIGN_X(0) | ALIGN_Y(2):
- cairo_move_to (cr,
- -extents.x_bearing,
- - (extents.height + extents.y_bearing));
- break;
-
- case ALIGN_X(1) | ALIGN_Y(0):
- cairo_move_to (cr,
- - (extents.width/2. + extents.x_bearing),
- -extents.y_bearing);
- break;
- case ALIGN_X(1) | ALIGN_Y(1):
- cairo_move_to (cr,
- - (extents.width/2. + extents.x_bearing),
- - (extents.height/2. + extents.y_bearing));
- break;
- case ALIGN_X(1) | ALIGN_Y(2):
- cairo_move_to (cr,
- - (extents.width/2. + extents.x_bearing),
- - (extents.height + extents.y_bearing));
- break;
-
- case ALIGN_X(2) | ALIGN_Y(0):
- cairo_move_to (cr,
- - (extents.width + extents.x_bearing),
- -extents.y_bearing);
- break;
- case ALIGN_X(2) | ALIGN_Y(1):
- cairo_move_to (cr,
- - (extents.width + extents.x_bearing),
- - (extents.height/2. + extents.y_bearing));
- break;
- case ALIGN_X(2) | ALIGN_Y(2):
- cairo_move_to (cr,
- - (extents.width + extents.x_bearing),
- - (extents.height + extents.y_bearing));
- break;
- }
- cairo_show_text (cr, text);
- } cairo_restore (cr);
-}
-
-#define PAD 36
-static void
-graph_view_draw (GraphView *self,
- cairo_t *cr)
-{
- cairo_matrix_t m;
- const double dash[2] = {4, 4};
- double range;
- int i;
-
- if (self->widget.allocation.width < 4 *PAD)
- return;
- if (self->widget.allocation.height < 3 *PAD)
- return;
-
- range = floor (self->ymax+1) - ceil (self->ymin-1);
-
- cairo_matrix_init_translate (&m, PAD, self->widget.allocation.height - PAD);
- cairo_matrix_scale (&m,
- (self->widget.allocation.width-2*PAD)/(self->num_reports),
- -(self->widget.allocation.height-2*PAD)/range);
- cairo_matrix_translate (&m, 0, floor (self->ymax+1));
-
- if (self->selected_report != -1) {
- cairo_save (cr); {
- double x0, x1, y;
- x0 = self->selected_report; y = 0;
- cairo_matrix_transform_point (&m, &x0, &y);
- x0 = floor (x0);
- x1 = self->selected_report + 1; y = 0;
- cairo_matrix_transform_point (&m, &x1, &y);
- x1 = ceil (x1);
- y = (x1 - x0) / 8;
- y = MIN (y, PAD / 2);
- x0 -= y;
- x1 += y;
- cairo_rectangle (cr, x0, PAD/2, x1-x0, self->widget.allocation.height-2*PAD + PAD);
- gdk_cairo_set_source_color (cr, &self->widget.style->base[GTK_STATE_SELECTED]);
- cairo_fill (cr);
- } cairo_restore (cr);
- }
-
- cairo_save (cr); {
- cairo_pattern_t *linear;
- double x, y;
-
- gdk_cairo_set_source_color (cr,
- &self->widget.style->fg[GTK_WIDGET_STATE (self)]);
- cairo_set_line_width (cr, 2.);
- draw_hline (cr, &m, 0, 0, self->num_reports);
-
- cairo_set_line_width (cr, 1.);
- cairo_set_dash (cr, NULL, 0, 0);
-
- for (i = ceil (self->ymin-1); i <= floor (self->ymax+1); i++) {
- if (i != 0)
- draw_hline (cr, &m, i, 0, self->num_reports);
- }
-
- cairo_set_font_size (cr, 11);
-
- linear = cairo_pattern_create_linear (0, PAD, 0, self->widget.allocation.height-2*PAD);
- cairo_pattern_add_color_stop_rgb (linear, 0, 0, 1, 0);
- cairo_pattern_add_color_stop_rgb (linear, 1, 1, 0, 0);
- cairo_set_source (cr, linear);
- cairo_pattern_destroy (linear);
-
- for (i = ceil (self->ymin-1); i <= floor (self->ymax+1); i++) {
- if (i != 0)
- draw_label (cr, &m, i, 0, self->num_reports);
- }
-
- x = 0, y = floor (self->ymax+1);
- cairo_matrix_transform_point (&m, &x, &y);
- draw_rotated_label (cr, "Faster", x - 7, y + 14,
- 270./360 * 2 * G_PI,
- ALIGN_X(2) | ALIGN_Y(1));
- x = self->num_reports, y = floor (self->ymax+1);
- cairo_matrix_transform_point (&m, &x, &y);
- draw_rotated_label (cr, "Faster", x + 11, y + 14,
- 270./360 * 2 * G_PI,
- ALIGN_X(2) | ALIGN_Y(1));
-
- x = 0, y = ceil (self->ymin-1);
- cairo_matrix_transform_point (&m, &x, &y);
- draw_rotated_label (cr, "Slower", x - 7, y - 14,
- 90./360 * 2 * G_PI,
- ALIGN_X(2) | ALIGN_Y(1));
- x = self->num_reports, y = ceil (self->ymin-1);
- cairo_matrix_transform_point (&m, &x, &y);
- draw_rotated_label (cr, "Slower", x + 11, y - 14,
- 90./360 * 2 * G_PI,
- ALIGN_X(2) | ALIGN_Y(1));
- } cairo_restore (cr);
-
- draw_baseline_performance (self->cases,
- self->reports, self->num_reports,
- cr, &m);
-
- cairo_save (cr); {
- cairo_set_source_rgb (cr, 0.7, 0.7, 0.7);
- cairo_set_line_width (cr, 1.);
- cairo_set_dash (cr, dash, 2, 0);
- draw_hline (cr, &m, 0, 0, self->num_reports);
- } cairo_restore (cr);
-}
-
-static gboolean
-graph_view_expose (GtkWidget *w,
- GdkEventExpose *ev)
-{
- GraphView *self = (GraphView *) w;
- cairo_t *cr;
-
- cr = gdk_cairo_create (w->window);
- gdk_cairo_set_source_color (cr, &w->style->base[GTK_WIDGET_STATE (w)]);
- cairo_paint (cr);
-
- graph_view_draw (self, cr);
-
- cairo_destroy (cr);
-
- return FALSE;
-}
-
-static gboolean
-graph_view_button_press (GtkWidget *w,
- GdkEventButton *ev)
-{
- GraphView *self = (GraphView *) w;
- cairo_matrix_t m;
- double x,y;
- int i;
-
- cairo_matrix_init_translate (&m, PAD, self->widget.allocation.height-PAD);
- cairo_matrix_scale (&m, (self->widget.allocation.width-2*PAD)/self->num_reports, -(self->widget.allocation.height-2*PAD)/(self->ymax - self->ymin));
- cairo_matrix_translate (&m, 0, -self->ymin);
- cairo_matrix_invert (&m);
-
- x = ev->x;
- y = ev->y;
- cairo_matrix_transform_point (&m, &x, &y);
-
- i = floor (x);
- if (i < 0 || i >= self->num_reports)
- i = -1;
-
- if (i != self->selected_report) {
- self->selected_report = i;
- gtk_widget_queue_draw (w);
-
- g_signal_emit (w, signals[REPORT_SELECTED], 0, i);
- }
-
- return FALSE;
-}
-
-static gboolean
-graph_view_button_release (GtkWidget *w,
- GdkEventButton *ev)
-{
- GraphView *self = (GraphView *) w;
-
- return FALSE;
-}
-
-static void
-graph_view_realize (GtkWidget *widget)
-{
- GdkWindowAttr attributes;
-
- GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
-
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.x = widget->allocation.x;
- attributes.y = widget->allocation.y;
- attributes.width = widget->allocation.width;
- attributes.height = widget->allocation.height;
- attributes.wclass = GDK_INPUT_OUTPUT;
- attributes.visual = gtk_widget_get_visual (widget);
- attributes.colormap = gtk_widget_get_colormap (widget);
- attributes.event_mask = gtk_widget_get_events (widget) |
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_EXPOSURE_MASK;
-
- widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
- &attributes,
- GDK_WA_X | GDK_WA_Y |
- GDK_WA_VISUAL | GDK_WA_COLORMAP);
- gdk_window_set_user_data (widget->window, widget);
-
- widget->style = gtk_style_attach (widget->style, widget->window);
- gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
-}
-
-static void
-graph_view_finalize (GObject *obj)
-{
- G_OBJECT_CLASS (graph_view_parent_class)->finalize (obj);
-}
-
-static void
-graph_view_class_init (GraphViewClass *klass)
-{
- GObjectClass *object_class = (GObjectClass *) klass;
- GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
-
- object_class->finalize = graph_view_finalize;
-
- widget_class->realize = graph_view_realize;
- widget_class->expose_event = graph_view_expose;
- widget_class->button_press_event = graph_view_button_press;
- widget_class->button_release_event = graph_view_button_release;
-
- signals[REPORT_SELECTED] =
- g_signal_new ("report-selected",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_FIRST,
- 0,//G_STRUCT_OFFSET (GraphView, report_selected),
- NULL, NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE, 1, G_TYPE_INT);
-}
-
-static void
-graph_view_init (GraphView *self)
-{
- self->selected_report = -1;
-}
-
-GtkWidget *
-graph_view_new (void)
-{
- return g_object_new (graph_view_get_type (), NULL);
-}
-
-void
-graph_view_update_visible (GraphView *gv)
-{
- double min, max;
- test_case_t *cases;
-
- cases = gv->cases;
-
- min = max = 1.;
- while (cases->name != NULL) {
- if (cases->shown) {
- if (cases->min < min)
- min = cases->min;
- if (cases->max > max)
- max = cases->max;
- }
- cases++;
- }
- gv->ymin = -1/min + 1;
- gv->ymax = max - 1;
-
- gtk_widget_queue_draw (&gv->widget);
-}
-
-void
-graph_view_set_reports (GraphView *gv,
- test_case_t *cases,
- cairo_perf_report_t *reports,
- int num_reports)
-{
- /* XXX ownership? */
- gv->cases = cases;
- gv->reports = reports;
- gv->num_reports = num_reports;
-
- graph_view_update_visible (gv);
-}
diff --git a/perf/cairo-perf-graph.h b/perf/cairo-perf-graph.h
deleted file mode 100644
index 4cb62165f..000000000
--- a/perf/cairo-perf-graph.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright © 2008 Chris Wilson
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of the
- * copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Authors: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#ifndef CAIRO_PERF_GRAPH_H
-#define CAIRO_PERF_GRAPH_H
-
-#include <gtk/gtk.h>
-
-#include "cairo-perf.h"
-
-typedef struct _test_case {
- const char *backend;
- const char *content;
- const char *name;
- int size;
-
- test_report_t *min_test;
-
- cairo_bool_t shown;
- double baseline;
- double min, max;
- GdkColor color;
-} test_case_t;
-
-typedef struct _GraphView GraphView;
-
-GtkWidget *
-graph_view_new (void);
-
-void
-graph_view_set_reports (GraphView *gv,
- test_case_t *tests,
- cairo_perf_report_t *reports,
- int num_reports);
-
-void
-graph_view_update_visible (GraphView *gv);
-
-#endif
diff --git a/perf/cairo-perf-micro.c b/perf/cairo-perf-micro.c
deleted file mode 100644
index d6b52c446..000000000
--- a/perf/cairo-perf-micro.c
+++ /dev/null
@@ -1,594 +0,0 @@
-/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */
-/*
- * Copyright © 2006 Mozilla Corporation
- * Copyright © 2006 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * the authors not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. The authors make no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Authors: Vladimir Vukicevic <vladimir@pobox.com>
- * Carl Worth <cworth@cworth.org>
- */
-
-#define _GNU_SOURCE 1 /* for sched_getaffinity() */
-
-#include "../cairo-version.h" /* for the real version */
-
-#include "cairo-perf.h"
-#include "cairo-stats.h"
-
-#include "cairo-boilerplate-getopt.h"
-
-/* For basename */
-#ifdef HAVE_LIBGEN_H
-#include <libgen.h>
-#endif
-
-#if HAVE_FCFINI
-#include <fontconfig/fontconfig.h>
-#endif
-
-#ifdef HAVE_SCHED_H
-#include <sched.h>
-#endif
-
-#define CAIRO_PERF_ITERATIONS_DEFAULT 100
-#define CAIRO_PERF_LOW_STD_DEV 0.03
-#define CAIRO_PERF_STABLE_STD_DEV_COUNT 5
-#define CAIRO_PERF_ITERATION_MS_DEFAULT 2000
-#define CAIRO_PERF_ITERATION_MS_FAST 5
-
-typedef struct _cairo_perf_case {
- CAIRO_PERF_RUN_DECL (*run);
- cairo_bool_t (*enabled) (cairo_perf_t *perf);
- unsigned int min_size;
- unsigned int max_size;
-} cairo_perf_case_t;
-
-const cairo_perf_case_t perf_cases[];
-
-static const char *
-_content_to_string (cairo_content_t content,
- cairo_bool_t similar)
-{
- switch (content|similar) {
- case CAIRO_CONTENT_COLOR:
- return "rgb";
- case CAIRO_CONTENT_COLOR|1:
- return "rgb&";
- case CAIRO_CONTENT_ALPHA:
- return "a";
- case CAIRO_CONTENT_ALPHA|1:
- return "a&";
- case CAIRO_CONTENT_COLOR_ALPHA:
- return "rgba";
- case CAIRO_CONTENT_COLOR_ALPHA|1:
- return "rgba&";
- default:
- return "<unknown_content>";
- }
-}
-
-static cairo_bool_t
-cairo_perf_has_similar (cairo_perf_t *perf)
-{
- cairo_surface_t *target;
-
- if (getenv ("CAIRO_TEST_SIMILAR") == NULL)
- return FALSE;
-
- /* exclude the image backend */
- target = cairo_get_target (perf->cr);
- if (cairo_surface_get_type (target) == CAIRO_SURFACE_TYPE_IMAGE)
- return FALSE;
-
- return TRUE;
-}
-
-cairo_bool_t
-cairo_perf_can_run (cairo_perf_t *perf,
- const char *name,
- cairo_bool_t *is_explicit)
-{
- unsigned int i;
-
- if (is_explicit)
- *is_explicit = FALSE;
-
- if (perf->num_names == 0)
- return TRUE;
-
- for (i = 0; i < perf->num_names; i++) {
- if (strstr (name, perf->names[i])) {
- if (is_explicit)
- *is_explicit = FALSE;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static unsigned
-cairo_perf_calibrate (cairo_perf_t *perf,
- cairo_perf_func_t perf_func)
-{
- cairo_time_t calibration, calibration_max;
- unsigned loops, min_loops;
-
- min_loops = 1;
- calibration = perf_func (perf->cr, perf->size, perf->size, min_loops);
-
- if (!perf->fast_and_sloppy) {
- calibration_max = _cairo_time_from_s (perf->ms_per_iteration * 0.0001 / 4);
- while (calibration < calibration_max) {
- min_loops *= 2;
- calibration = perf_func (perf->cr, perf->size, perf->size, min_loops);
- }
- }
-
- /* XXX
- * Compute the number of loops required for the timing
- * interval to be perf->ms_per_iteration milliseconds. This
- * helps to eliminate sampling variance due to timing and
- * other systematic errors. However, it also hides
- * synchronisation overhead as we attempt to process a large
- * batch of identical operations in a single shot. This can be
- * considered both good and bad... It would be good to perform
- * a more rigorous analysis of the synchronisation overhead,
- * that is to estimate the time for loop=0.
- */
- loops = _cairo_time_from_s (perf->ms_per_iteration * 0.001 * min_loops / calibration);
- min_loops = perf->fast_and_sloppy ? 1 : 10;
- if (loops < min_loops)
- loops = min_loops;
-
- return loops;
-}
-
-void
-cairo_perf_run (cairo_perf_t *perf,
- const char *name,
- cairo_perf_func_t perf_func,
- cairo_count_func_t count_func)
-{
- static cairo_bool_t first_run = TRUE;
- unsigned int i, similar, similar_iters;
- cairo_time_t *times;
- cairo_stats_t stats = {0.0, 0.0};
- int low_std_dev_count;
-
- if (perf->list_only) {
- printf ("%s\n", name);
- return;
- }
-
- if (first_run) {
- if (perf->raw) {
- printf ("[ # ] %s.%-s %s %s %s ...\n",
- "backend", "content", "test-size", "ticks-per-ms", "time(ticks)");
- }
-
- if (perf->summary) {
- fprintf (perf->summary,
- "[ # ] %8s.%-4s %28s %8s %8s %5s %5s %s %s\n",
- "backend", "content", "test-size", "min(ticks)", "min(ms)", "median(ms)",
- "stddev.", "iterations", "overhead");
- }
- first_run = FALSE;
- }
-
- times = perf->times;
-
- if (getenv ("CAIRO_PERF_OUTPUT") != NULL) { /* check output */
- char *filename;
- cairo_status_t status;
-
- xasprintf (&filename, "%s.%s.%s.%d.out.png",
- name, perf->target->name,
- _content_to_string (perf->target->content, 0),
- perf->size);
- cairo_save (perf->cr);
- perf_func (perf->cr, perf->size, perf->size, 1);
- cairo_restore (perf->cr);
- status = cairo_surface_write_to_png (cairo_get_target (perf->cr), filename);
- if (status) {
- fprintf (stderr, "Failed to generate output check '%s': %s\n",
- filename, cairo_status_to_string (status));
- return;
- }
-
- free (filename);
- }
-
- if (cairo_perf_has_similar (perf))
- similar_iters = 2;
- else
- similar_iters = 1;
-
- for (similar = 0; similar < similar_iters; similar++) {
- unsigned loops;
-
- if (perf->summary) {
- fprintf (perf->summary,
- "[%3d] %8s.%-5s %26s.%-3d ",
- perf->test_number, perf->target->name,
- _content_to_string (perf->target->content, similar),
- name, perf->size);
- fflush (perf->summary);
- }
-
- /* We run one iteration in advance to warm caches and calibrate. */
- cairo_perf_yield ();
- if (similar)
- cairo_push_group_with_content (perf->cr,
- cairo_boilerplate_content (perf->target->content));
- else
- cairo_save (perf->cr);
- perf_func (perf->cr, perf->size, perf->size, 1);
- loops = cairo_perf_calibrate (perf, perf_func);
- if (similar)
- cairo_pattern_destroy (cairo_pop_group (perf->cr));
- else
- cairo_restore (perf->cr);
-
- low_std_dev_count = 0;
- for (i =0; i < perf->iterations; i++) {
- cairo_perf_yield ();
- if (similar)
- cairo_push_group_with_content (perf->cr,
- cairo_boilerplate_content (perf->target->content));
- else
- cairo_save (perf->cr);
- times[i] = perf_func (perf->cr, perf->size, perf->size, loops) ;
- if (similar)
- cairo_pattern_destroy (cairo_pop_group (perf->cr));
- else
- cairo_restore (perf->cr);
- if (perf->raw) {
- if (i == 0)
- printf ("[*] %s.%s %s.%d %g",
- perf->target->name,
- _content_to_string (perf->target->content, similar),
- name, perf->size,
- _cairo_time_to_double (_cairo_time_from_s (1.)) / 1000.);
- printf (" %lld", (long long) (times[i] / (double) loops));
- } else if (! perf->exact_iterations) {
- if (i > 0) {
- _cairo_stats_compute (&stats, times, i+1);
-
- if (stats.std_dev <= CAIRO_PERF_LOW_STD_DEV) {
- low_std_dev_count++;
- if (low_std_dev_count >= CAIRO_PERF_STABLE_STD_DEV_COUNT)
- break;
- } else {
- low_std_dev_count = 0;
- }
- }
- }
- }
-
- if (perf->raw)
- printf ("\n");
-
- if (perf->summary) {
- _cairo_stats_compute (&stats, times, i);
- if (count_func != NULL) {
- double count = count_func (perf->cr, perf->size, perf->size);
- fprintf (perf->summary,
- "%.3f [%10lld/%d] %#8.3f %#8.3f %#5.2f%% %3d: %.2f\n",
- stats.min_ticks /(double) loops,
- (long long) stats.min_ticks, loops,
- _cairo_time_to_s (stats.min_ticks) * 1000.0 / loops,
- _cairo_time_to_s (stats.median_ticks) * 1000.0 / loops,
- stats.std_dev * 100.0, stats.iterations,
- count / _cairo_time_to_s (stats.min_ticks));
- } else {
- fprintf (perf->summary,
- "%.3f [%10lld/%d] %#8.3f %#8.3f %#5.2f%% %3d\n",
- stats.min_ticks /(double) loops,
- (long long) stats.min_ticks, loops,
- _cairo_time_to_s (stats.min_ticks) * 1000.0 / loops,
- _cairo_time_to_s (stats.median_ticks) * 1000.0 / loops,
- stats.std_dev * 100.0, stats.iterations);
- }
- fflush (perf->summary);
- }
-
- perf->test_number++;
- }
-}
-
-static void
-usage (const char *argv0)
-{
- fprintf (stderr,
-"Usage: %s [-flrv] [-i iterations] [test-names ...]\n"
-"\n"
-"Run the cairo performance test suite over the given tests (all by default)\n"
-"The command-line arguments are interpreted as follows:\n"
-"\n"
-" -f fast; faster, less accurate\n"
-" -i iterations; specify the number of iterations per test case\n"
-" -l list only; just list selected test case names without executing\n"
-" -r raw; display each time measurement instead of summary statistics\n"
-" -v verbose; in raw mode also show the summaries\n"
-"\n"
-"If test names are given they are used as sub-string matches so a command\n"
-"such as \"%s text\" can be used to run all text test cases.\n",
- argv0, argv0);
-}
-
-static void
-parse_options (cairo_perf_t *perf,
- int argc,
- char *argv[])
-{
- int c;
- const char *iters;
- const char *ms = NULL;
- char *end;
- int verbose = 0;
-
- if ((iters = getenv("CAIRO_PERF_ITERATIONS")) && *iters)
- perf->iterations = strtol(iters, NULL, 0);
- else
- perf->iterations = CAIRO_PERF_ITERATIONS_DEFAULT;
- perf->exact_iterations = 0;
-
- perf->fast_and_sloppy = FALSE;
- perf->ms_per_iteration = CAIRO_PERF_ITERATION_MS_DEFAULT;
- if ((ms = getenv("CAIRO_PERF_ITERATION_MS")) && *ms) {
- perf->ms_per_iteration = atof(ms);
- }
-
- perf->raw = FALSE;
- perf->list_only = FALSE;
- perf->names = NULL;
- perf->num_names = 0;
- perf->summary = stdout;
-
- while (1) {
- c = _cairo_getopt (argc, argv, "fi:lrv");
- if (c == -1)
- break;
-
- switch (c) {
- case 'f':
- perf->fast_and_sloppy = TRUE;
- if (ms == NULL)
- perf->ms_per_iteration = CAIRO_PERF_ITERATION_MS_FAST;
- break;
- case 'i':
- perf->exact_iterations = TRUE;
- perf->iterations = strtoul (optarg, &end, 10);
- if (*end != '\0') {
- fprintf (stderr, "Invalid argument for -i (not an integer): %s\n",
- optarg);
- exit (1);
- }
- break;
- case 'l':
- perf->list_only = TRUE;
- break;
- case 'r':
- perf->raw = TRUE;
- perf->summary = NULL;
- break;
- case 'v':
- verbose = 1;
- break;
- default:
- fprintf (stderr, "Internal error: unhandled option: %c\n", c);
- /* fall-through */
- case '?':
- usage (argv[0]);
- exit (1);
- }
- }
-
- if (verbose && perf->summary == NULL)
- perf->summary = stderr;
-
- if (optind < argc) {
- perf->names = &argv[optind];
- perf->num_names = argc - optind;
- }
-}
-
-static int
-check_cpu_affinity (void)
-{
-#ifdef HAVE_SCHED_GETAFFINITY
-
- cpu_set_t affinity;
- int i, cpu_count;
-
- if (sched_getaffinity(0, sizeof(affinity), &affinity)) {
- perror("sched_getaffinity");
- return -1;
- }
-
- for(i = 0, cpu_count = 0; i < CPU_SETSIZE; ++i) {
- if (CPU_ISSET(i, &affinity))
- ++cpu_count;
- }
-
- if (cpu_count > 1) {
- fputs(
- "WARNING: cairo-perf has not been bound to a single CPU.\n",
- stderr);
- return -1;
- }
-
- return 0;
-#else
- fputs(
- "WARNING: Cannot check CPU affinity for this platform.\n",
- stderr);
- return -1;
-#endif
-}
-
-static void
-cairo_perf_fini (cairo_perf_t *perf)
-{
- cairo_boilerplate_free_targets (perf->targets);
- cairo_boilerplate_fini ();
-
- free (perf->times);
- cairo_debug_reset_static_data ();
-#if HAVE_FCFINI
- FcFini ();
-#endif
-}
-
-
-int
-main (int argc,
- char *argv[])
-{
- int i, j;
- cairo_perf_t perf;
- cairo_surface_t *surface;
-
- parse_options (&perf, argc, argv);
-
- if (check_cpu_affinity()) {
- fputs(
- "NOTICE: cairo-perf and the X server should be bound to CPUs (either the same\n"
- "or separate) on SMP systems. Not doing so causes random results when the X\n"
- "server is moved to or from cairo-perf's CPU during the benchmarks:\n"
- "\n"
- " $ sudo taskset -cp 0 $(pidof X)\n"
- " $ taskset -cp 1 $$\n"
- "\n"
- "See taskset(1) for information about changing CPU affinity.\n",
- stderr);
- }
-
- perf.targets = cairo_boilerplate_get_targets (&perf.num_targets, NULL);
- perf.times = xmalloc (perf.iterations * sizeof (cairo_time_t));
-
- for (i = 0; i < perf.num_targets; i++) {
- const cairo_boilerplate_target_t *target = perf.targets[i];
-
- if (! target->is_measurable)
- continue;
-
- perf.target = target;
- perf.test_number = 0;
-
- for (j = 0; perf_cases[j].run; j++) {
- const cairo_perf_case_t *perf_case = &perf_cases[j];
-
- if (! perf_case->enabled (&perf))
- continue;
-
- for (perf.size = perf_case->min_size;
- perf.size <= perf_case->max_size;
- perf.size *= 2)
- {
- void *closure;
-
- surface = (target->create_surface) (NULL,
- target->content,
- perf.size, perf.size,
- perf.size, perf.size,
- CAIRO_BOILERPLATE_MODE_PERF,
- &closure);
- if (surface == NULL) {
- fprintf (stderr,
- "Error: Failed to create target surface: %s\n",
- target->name);
- continue;
- }
-
- cairo_perf_timer_set_synchronize (target->synchronize, closure);
-
- perf.cr = cairo_create (surface);
-
- perf_case->run (&perf, perf.cr, perf.size, perf.size);
-
- if (cairo_status (perf.cr)) {
- fprintf (stderr, "Error: Test left cairo in an error state: %s\n",
- cairo_status_to_string (cairo_status (perf.cr)));
- }
-
- cairo_destroy (perf.cr);
- cairo_surface_destroy (surface);
-
- if (target->cleanup)
- target->cleanup (closure);
- }
- }
- }
-
- cairo_perf_fini (&perf);
-
- return 0;
-}
-
-#define FUNC(f) f, f##_enabled
-const cairo_perf_case_t perf_cases[] = {
- { FUNC(pixel), 1, 1 },
- { FUNC(a1_pixel), 1, 1 },
- { FUNC(paint), 64, 512},
- { FUNC(paint_with_alpha), 64, 512},
- { FUNC(fill), 64, 512},
- { FUNC(stroke), 64, 512},
- { FUNC(text), 64, 512},
- { FUNC(glyphs), 64, 512},
- { FUNC(mask), 64, 512},
- { FUNC(line), 32, 512},
- { FUNC(a1_line), 32, 512},
- { FUNC(curve), 32, 512},
- { FUNC(a1_curve), 32, 512},
- { FUNC(disjoint), 64, 512},
- { FUNC(hatching), 64, 512},
- { FUNC(tessellate), 100, 100},
- { FUNC(subimage_copy), 16, 512},
- { FUNC(hash_table), 16, 16},
- { FUNC(pattern_create_radial), 16, 16},
- { FUNC(zrusin), 415, 415},
- { FUNC(world_map), 800, 800},
- { FUNC(box_outline), 100, 100},
- { FUNC(mosaic), 800, 800 },
- { FUNC(long_lines), 100, 100},
- { FUNC(unaligned_clip), 100, 100},
- { FUNC(rectangles), 512, 512},
- { FUNC(rounded_rectangles), 512, 512},
- { FUNC(long_dashed_lines), 512, 512},
- { FUNC(composite_checker), 16, 512},
- { FUNC(twin), 800, 800},
- { FUNC(dragon), 1024, 1024 },
- { FUNC(sierpinski), 32, 1024 },
- { FUNC(pythagoras_tree), 768, 768 },
- { FUNC(intersections), 512, 512 },
- { FUNC(many_strokes), 32, 512 },
- { FUNC(wide_strokes), 32, 512 },
- { FUNC(many_fills), 32, 512 },
- { FUNC(wide_fills), 32, 512 },
- { FUNC(many_curves), 32, 512 },
- { FUNC(spiral), 512, 512 },
- { FUNC(wave), 500, 500 },
- { FUNC(fill_clip), 16, 512 },
- { FUNC(tiger), 16, 1024 },
- { NULL }
-};
diff --git a/perf/cairo-perf-print.c b/perf/cairo-perf-print.c
deleted file mode 100644
index d7ae1311e..000000000
--- a/perf/cairo-perf-print.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- * Copyright © 2009 Chris Wilson
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of the
- * copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Authors: Carl Worth <cworth@cworth.org>
- * Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "cairo-perf.h"
-#include "cairo-stats.h"
-
-#include <stdio.h>
-
-#if HAVE_UNISTD_H && HAVE_SYS_IOCTL_H
-#define USE_TERMINAL_SIZE 1
-#else
-#define USE_TERMINAL_SIZE 0
-#endif
-
-#if USE_TERMINAL_SIZE
-#include <unistd.h>
-#include <sys/ioctl.h>
-#endif
-
-static void
-report_print (const cairo_perf_report_t *report,
- int show_histogram)
-{
- const test_report_t *test;
- cairo_histogram_t h;
-
- if (show_histogram) {
- int num_rows = 23;
- int num_cols = 80;
-
-#if USE_TERMINAL_SIZE
- int fd = fileno(stdout);
- if (isatty(fd)) {
- struct winsize ws;
-
- if(ioctl(fd, TIOCGWINSZ, &ws) == 0 ) {
- num_rows = ws.ws_row - 1;
- num_cols = ws.ws_col;
- }
- }
-#endif
-
- if (!_cairo_histogram_init (&h, num_cols, num_rows))
- show_histogram = 0;
- }
-
- for (test = report->tests; test->name != NULL; test++) {
- if (test->stats.iterations == 0)
- continue;
-
- if (show_histogram) {
- const cairo_time_t *values;
- int num_values;
-
- if (show_histogram > 1) {
- values = test->stats.values;
- num_values = test->stats.iterations;
- } else {
- values = test->samples;
- num_values = test->samples_count;
- }
-
- if (_cairo_histogram_compute (&h, values, num_values))
- _cairo_histogram_printf (&h, stdout);
- }
-
- if (test->size) {
- printf ("%5s-%-4s %26s-%-3d ",
- test->backend, test->content,
- test->name, test->size);
- } else {
- printf ("%5s %26s ", test->backend, test->name);
- }
- printf("%6.2f %4.2f%% (%d/%d)\n",
- test->stats.median_ticks / test->stats.ticks_per_ms,
- test->stats.std_dev * 100,
- test->stats.iterations, test->samples_count);
- }
-
- if (show_histogram)
- _cairo_histogram_fini (&h);
-}
-
-int
-main (int argc,
- const char *argv[])
-{
- cairo_bool_t show_histogram = 0;
- int i;
-
- for (i = 1; i < argc; i++ ) {
- cairo_perf_report_t report;
-
- if (strcmp(argv[i], "--histogram") == 0) {
- show_histogram = 1;
- continue;
- }
-
- if (strcmp(argv[i], "--short-histogram") == 0) {
- show_histogram = 2;
- continue;
- }
-
- cairo_perf_report_load (&report, argv[i], i, NULL);
- report_print (&report, show_histogram);
- }
-
- return 0;
-}
diff --git a/perf/cairo-perf-report.c b/perf/cairo-perf-report.c
deleted file mode 100644
index 2325f4793..000000000
--- a/perf/cairo-perf-report.c
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of the
- * copyright holders not be used in advertising or publicity
- * pertaining to distribution of the software without specific,
- * written prior permission. The copyright holders make no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
- * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- *
- * Authors: Carl Worth <cworth@cworth.org>
- */
-
-#define _GETDELIM 1/* for getline() on AIX */
-
-#include "cairo-perf.h"
-#include "cairo-missing.h"
-#include "cairo-stats.h"
-
-/* We use _GNU_SOURCE for getline and strndup if available. */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-#include <math.h>
-#include <assert.h>
-#ifdef HAVE_LIBGEN_H
-#include <libgen.h>
-#endif
-
-#ifdef _MSC_VER
-static long long
-strtoll (const char *nptr,
- char **endptr,
- int base);
-
-static char *
-basename (char *path);
-#endif
-
-/* Ad-hoc parsing, macros with a strong dependence on the calling
- * context, and plenty of other ugliness is here. But at least it's
- * not perl... */
-#define parse_error(...) fprintf(stderr, __VA_ARGS__); return TEST_REPORT_STATUS_ERROR;
-#define skip_char(c) \
-do { \
- if (*s && *s == (c)) { \
- s++; \
- } else { \
- parse_error ("expected '%c' but found '%c'", c, *s); \
- } \
-} while (0)
-#define skip_space() while (*s && (*s == ' ' || *s == '\t')) s++;
-#define parse_int(result) \
-do { \
- (result) = strtol (s, &end, 10); \
- if (*s && end != s) { \
- s = end; \
- } else { \
- parse_error("expected integer but found %s", s); \
- } \
-} while (0)
-#define parse_long_long(result) \
-do { \
- (result) = strtoll (s, &end, 10); \
- if (*s && end != s) { \
- s = end; \
- } else { \
- parse_error("expected integer but found %s", s); \
- } \
-} while (0)
-#define parse_double(result) \
-do { \
- (result) = strtod (s, &end); \
- if (*s && end != s) { \
- s = end; \
- } else { \
- parse_error("expected floating-point value but found %s", s); \
- } \
-} while (0)
-/* Here a string is simply a sequence of non-whitespace */
-#define parse_string(result) \
-do { \
- for (end = s; *end; end++) \
- if (isspace (*end)) \
- break; \
- (result) = strndup (s, end - s); \
- if ((result) == NULL) { \
- fprintf (stderr, "Out of memory.\n"); \
- exit (1); \
- } \
- s = end; \
-} while (0)
-
-static test_report_status_t
-test_report_parse (test_report_t *report,
- int fileno,
- char *line,
- char *configuration)
-{
- char *end;
- char *s = line;
- cairo_bool_t is_raw = FALSE;
- double min_time, median_time;
-
- /* The code here looks funny unless you understand that these are
- * all macro calls, (and then the code just looks sick). */
- if (*s == '\n')
- return TEST_REPORT_STATUS_COMMENT;
-
- skip_char ('[');
- skip_space ();
- if (*s == '#')
- return TEST_REPORT_STATUS_COMMENT;
- if (*s == '*') {
- s++;
- is_raw = TRUE;
- } else {
- parse_int (report->id);
- }
- skip_char (']');
-
- skip_space ();
-
- report->fileno = fileno;
- report->configuration = configuration;
- parse_string (report->backend);
- end = strrchr (report->backend, '.');
- if (end)
- *end++ = '\0';
- report->content = end ? end : xstrdup ("???");
-
- skip_space ();
-
- parse_string (report->name);
- end = strrchr (report->name, '.');
- if (end)
- *end++ = '\0';
- report->size = end ? atoi (end) : 0;
-
- skip_space ();
-
- report->samples = NULL;
- report->samples_size = 0;
- report->samples_count = 0;
-
- if (is_raw) {
- parse_double (report->stats.ticks_per_ms);
- skip_space ();
-
- report->samples_size = 5;
- report->samples = xmalloc (report->samples_size * sizeof (cairo_time_t));
- report->stats.min_ticks = 0;
- do {
- if (report->samples_count == report->samples_size) {
- report->samples_size *= 2;
- report->samples = xrealloc (report->samples,
- report->samples_size * sizeof (cairo_time_t));
- }
- parse_long_long (report->samples[report->samples_count]);
- if (report->samples_count == 0) {
- report->stats.min_ticks =
- report->samples[report->samples_count];
- } else if (report->stats.min_ticks >
- report->samples[report->samples_count]){
- report->stats.min_ticks =
- report->samples[report->samples_count];
- }
- report->samples_count++;
- skip_space ();
- } while (*s && *s != '\n');
- report->stats.iterations = 0;
- if (*s) skip_char ('\n');
- } else {
- parse_double (report->stats.min_ticks);
- skip_space ();
-
- parse_double (min_time);
- report->stats.ticks_per_ms = report->stats.min_ticks / min_time;
-
- skip_space ();
-
- parse_double (median_time);
- report->stats.median_ticks = median_time * report->stats.ticks_per_ms;
-
- skip_space ();
-
- parse_double (report->stats.std_dev);
- report->stats.std_dev /= 100.0;
- skip_char ('%');
-
- skip_space ();
-
- parse_int (report->stats.iterations);
-
- skip_space ();
- skip_char ('\n');
- }
-
- return TEST_REPORT_STATUS_SUCCESS;
-}
-
-/* We provide hereafter a win32 implementation of the basename
- * and strtoll functions which are not available otherwise.
- * The basename function is fully compliant to its GNU specs.
- */
-#ifdef _MSC_VER
-long long
-strtoll (const char *nptr,
- char **endptr,
- int base)
-{
- return _atoi64(nptr);
-}
-
-static char *
-basename (char *path)
-{
- char *end, *s;
-
- end = (path + strlen(path) - 1);
- while (end && (end >= path + 1) && (*end == '/')) {
- *end = '\0';
- end--;
- }
-
- s = strrchr(path, '/');
- if (s) {
- if (s == end) {
- return s;
- } else {
- return s+1;
- }
- } else {
- return path;
- }
-}
-#endif /* ifndef _MSC_VER */
-
-int
-test_report_cmp_backend_then_name (const void *a,
- const void *b)
-{
- const test_report_t *a_test = a;
- const test_report_t *b_test = b;
-
- int cmp;
-
- cmp = strcmp (a_test->backend, b_test->backend);
- if (cmp)
- return cmp;
-
- cmp = strcmp (a_test->content, b_test->content);
- if (cmp)
- return cmp;
-
- /* A NULL name is a list-termination marker, so force it last. */
- if (a_test->name == NULL)
- if (b_test->name == NULL)
- return 0;
- else
- return 1;
- else if (b_test->name == NULL)
- return -1;
-
- cmp = strcmp (a_test->name, b_test->name);
- if (cmp)
- return cmp;
-
- if (a_test->size < b_test->size)
- return -1;
- if (a_test->size > b_test->size)
- return 1;
-
- return 0;
-}
-
-int
-test_report_cmp_name (const void *a,
- const void *b)
-{
- const test_report_t *a_test = a;
- const test_report_t *b_test = b;
-
- int cmp;
-
- /* A NULL name is a list-termination marker, so force it last. */
- if (a_test->name == NULL)
- if (b_test->name == NULL)
- return 0;
- else
- return 1;
- else if (b_test->name == NULL)
- return -1;
-
- cmp = strcmp (a_test->name, b_test->name);
- if (cmp)
- return cmp;
-
- if (a_test->size < b_test->size)
- return -1;
- if (a_test->size > b_test->size)
- return 1;
-
- return 0;
-}
-
-void
-cairo_perf_report_sort_and_compute_stats (cairo_perf_report_t *report,
- int (*cmp) (const void*, const void*))
-{
- test_report_t *base, *next, *last, *t;
-
- if (cmp == NULL)
- cmp = test_report_cmp_backend_then_name;
-
- /* First we sort, since the diff needs both lists in the same
- * order */
- qsort (report->tests, report->tests_count, sizeof (test_report_t), cmp);
-
- /* The sorting also brings all related raw reports together so we
- * can condense them and compute the stats.
- */
- base = &report->tests[0];
- last = &report->tests[report->tests_count - 1];
- while (base <= last) {
- next = base+1;
- if (next <= last) {
- while (next <= last &&
- test_report_cmp_backend_then_name (base, next) == 0)
- {
- next++;
- }
- if (next != base) {
- unsigned int new_samples_count = base->samples_count;
- for (t = base + 1; t < next; t++)
- new_samples_count += t->samples_count;
- if (new_samples_count > base->samples_size) {
- base->samples_size = new_samples_count;
- base->samples = xrealloc (base->samples,
- base->samples_size * sizeof (cairo_time_t));
- }
- for (t = base + 1; t < next; t++) {
- memcpy (&base->samples[base->samples_count], t->samples,
- t->samples_count * sizeof (cairo_time_t));
- base->samples_count += t->samples_count;
- }
- }
- }
- if (base->samples)
- _cairo_stats_compute (&base->stats, base->samples, base->samples_count);
- base = next;
- }
-}
-
-void
-cairo_perf_report_load (cairo_perf_report_t *report,
- const char *filename, int id,
- int (*cmp) (const void *, const void *))
-{
- FILE *file;
- test_report_status_t status;
- int line_number = 0;
- char *line = NULL;
- size_t line_size = 0;
- char *configuration;
- char *dot;
- char *baseName;
- const char *name;
-
- name = filename;
- if (name == NULL)
- name = "stdin";
-
- configuration = xstrdup (name);
- baseName = basename (configuration);
- report->configuration = xstrdup (baseName);
- free (configuration);
-
- dot = strrchr (report->configuration, '.');
- if (dot)
- *dot = '\0';
-
- report->name = name;
- report->tests_size = 16;
- report->tests = xmalloc (report->tests_size * sizeof (test_report_t));
- report->tests_count = 0;
- report->fileno = id;
-
- if (filename == NULL) {
- file = stdin;
- } else {
- file = fopen (filename, "r");
- if (file == NULL) {
- fprintf (stderr, "Failed to open %s: %s\n",
- filename, strerror (errno));
- exit (1);
- }
- }
-
- while (1) {
- if (report->tests_count == report->tests_size) {
- report->tests_size *= 2;
- report->tests = xrealloc (report->tests,
- report->tests_size * sizeof (test_report_t));
- }
-
- line_number++;
- if (getline (&line, &line_size, file) == -1)
- break;
-
- status = test_report_parse (&report->tests[report->tests_count],
- id, line, report->configuration);
- if (status == TEST_REPORT_STATUS_ERROR)
- fprintf (stderr, "Ignoring unrecognized line %d of %s:\n%s",
- line_number, filename, line);
- if (status == TEST_REPORT_STATUS_SUCCESS)
- report->tests_count++;
- /* Do nothing on TEST_REPORT_STATUS_COMMENT */
- }
-
- free (line);
-
- if (filename != NULL)
- fclose (file);
-
- cairo_perf_report_sort_and_compute_stats (report, cmp);
-
- /* Add one final report with a NULL name to terminate the list. */
- if (report->tests_count == report->tests_size) {
- report->tests_size *= 2;
- report->tests = xrealloc (report->tests,
- report->tests_size * sizeof (test_report_t));
- }
- report->tests[report->tests_count].name = NULL;
-}
diff --git a/perf/cairo-perf-trace.c b/perf/cairo-perf-trace.c
deleted file mode 100644
index 02e0e29f9..000000000
--- a/perf/cairo-perf-trace.c
+++ /dev/null
@@ -1,1067 +0,0 @@
-/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */
-/*
- * Copyright © 2006 Mozilla Corporation
- * Copyright © 2006 Red Hat, Inc.
- * Copyright © 2009 Chris Wilson
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * the authors not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. The authors make no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Authors: Vladimir Vukicevic <vladimir@pobox.com>
- * Carl Worth <cworth@cworth.org>
- * Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#define _GNU_SOURCE 1 /* for sched_getaffinity() and getline() */
-
-#include "../cairo-version.h" /* for the real version */
-
-#include "cairo-missing.h"
-#include "cairo-perf.h"
-#include "cairo-stats.h"
-
-#include "cairo-boilerplate-getopt.h"
-#include <cairo-script-interpreter.h>
-#include <cairo-types-private.h> /* for INTERNAL_SURFACE_TYPE */
-
-/* rudely reuse bits of the library... */
-#include "../src/cairo-hash-private.h"
-#include "../src/cairo-error-private.h"
-
-/* For basename */
-#ifdef HAVE_LIBGEN_H
-#include <libgen.h>
-#endif
-#include <ctype.h> /* isspace() */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#ifdef _MSC_VER
-#include "dirent-win32.h"
-
-static char *
-basename_no_ext (char *path)
-{
- static char name[_MAX_FNAME + 1];
-
- _splitpath (path, NULL, NULL, name, NULL);
-
- name[_MAX_FNAME] = '\0';
-
- return name;
-}
-
-
-#else
-#include <dirent.h>
-
-static char *
-basename_no_ext (char *path)
-{
- char *dot, *name;
-
- name = basename (path);
-
- dot = strrchr (name, '.');
- if (dot)
- *dot = '\0';
-
- return name;
-}
-
-#endif
-
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <signal.h>
-
-#if HAVE_FCFINI
-#include <fontconfig/fontconfig.h>
-#endif
-
-#define CAIRO_PERF_ITERATIONS_DEFAULT 15
-#define CAIRO_PERF_LOW_STD_DEV 0.05
-#define CAIRO_PERF_MIN_STD_DEV_COUNT 3
-#define CAIRO_PERF_STABLE_STD_DEV_COUNT 3
-
-struct trace {
- const cairo_boilerplate_target_t *target;
- void *closure;
- cairo_surface_t *surface;
- cairo_bool_t observe;
- int tile_size;
-};
-
-cairo_bool_t
-cairo_perf_can_run (cairo_perf_t *perf,
- const char *name,
- cairo_bool_t *is_explicit)
-{
- unsigned int i;
- char *copy, *dot;
- cairo_bool_t ret;
-
- if (is_explicit)
- *is_explicit = FALSE;
-
- if (perf->exact_names) {
- if (is_explicit)
- *is_explicit = TRUE;
- return TRUE;
- }
-
- if (perf->num_names == 0 && perf->num_exclude_names == 0)
- return TRUE;
-
- copy = xstrdup (name);
- dot = strrchr (copy, '.');
- if (dot != NULL)
- *dot = '\0';
-
- if (perf->num_names) {
- ret = TRUE;
- for (i = 0; i < perf->num_names; i++)
- if (strstr (copy, perf->names[i])) {
- if (is_explicit)
- *is_explicit = strcmp (copy, perf->names[i]) == 0;
- goto check_exclude;
- }
-
- ret = FALSE;
- goto done;
- }
-
-check_exclude:
- if (perf->num_exclude_names) {
- ret = FALSE;
- for (i = 0; i < perf->num_exclude_names; i++)
- if (strstr (copy, perf->exclude_names[i])) {
- if (is_explicit)
- *is_explicit = strcmp (copy, perf->exclude_names[i]) == 0;
- goto done;
- }
-
- ret = TRUE;
- goto done;
- }
-
-done:
- free (copy);
-
- return ret;
-}
-
-static void
-fill_surface (cairo_surface_t *surface)
-{
- cairo_t *cr = cairo_create (surface);
- /* This needs to be an operation that the backends can't optimise away */
- cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.5);
- cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
- cairo_paint (cr);
- cairo_destroy (cr);
-}
-
-struct scache {
- cairo_hash_entry_t entry;
- cairo_content_t content;
- int width, height;
- cairo_surface_t *surface;
-};
-
-static cairo_hash_table_t *surface_cache;
-static cairo_surface_t *surface_holdovers[16];
-
-static cairo_bool_t
-scache_equal (const void *A,
- const void *B)
-{
- const struct scache *a = A, *b = B;
- return a->entry.hash == b->entry.hash;
-}
-
-static void
-scache_mark_active (cairo_surface_t *surface)
-{
- cairo_surface_t *t0, *t1;
- unsigned n;
-
- if (surface_cache == NULL)
- return;
-
- t0 = cairo_surface_reference (surface);
- for (n = 0; n < ARRAY_LENGTH (surface_holdovers); n++) {
- if (surface_holdovers[n] == surface) {
- surface_holdovers[n] = t0;
- t0 = surface;
- break;
- }
-
- t1 = surface_holdovers[n];
- surface_holdovers[n] = t0;
- t0 = t1;
- }
- cairo_surface_destroy (t0);
-}
-
-static void
-scache_clear (void)
-{
- unsigned n;
-
- if (surface_cache == NULL)
- return;
-
- for (n = 0; n < ARRAY_LENGTH (surface_holdovers); n++) {
- cairo_surface_destroy (surface_holdovers[n]);
- surface_holdovers[n] = NULL;
- }
-}
-
-static void
-scache_remove (void *closure)
-{
- _cairo_hash_table_remove (surface_cache, closure);
- free (closure);
-}
-
-static cairo_surface_t *
-_similar_surface_create (void *closure,
- cairo_content_t content,
- double width,
- double height,
- long uid)
-{
- struct trace *args = closure;
- cairo_surface_t *surface;
- struct scache skey, *s;
-
- if (args->observe)
- return cairo_surface_create_similar (args->surface,
- content, width, height);
-
- if (uid == 0 || surface_cache == NULL)
- return args->target->create_similar (args->surface, content, width, height);
-
- skey.entry.hash = uid;
- s = _cairo_hash_table_lookup (surface_cache, &skey.entry);
- if (s != NULL) {
- if (s->content == content &&
- s->width == width &&
- s->height == height)
- {
- return cairo_surface_reference (s->surface);
- }
-
- /* The surface has been resized, allow the original entry to expire
- * as it becomes inactive.
- */
- }
-
- surface = args->target->create_similar (args->surface, content, width, height);
- s = malloc (sizeof (struct scache));
- if (s == NULL)
- return surface;
-
- s->entry.hash = uid;
- s->content = content;
- s->width = width;
- s->height = height;
- s->surface = surface;
- if (_cairo_hash_table_insert (surface_cache, &s->entry)) {
- free (s);
- } else if (cairo_surface_set_user_data
- (surface,
- (const cairo_user_data_key_t *) &surface_cache,
- s, scache_remove))
- {
- scache_remove (s);
- }
-
- return surface;
-}
-
-static cairo_surface_t *
-_source_image_create (void *closure,
- cairo_format_t format,
- int width,
- int height,
- long uid)
-{
- struct trace *args = closure;
-
- return cairo_surface_create_similar_image (args->surface,
- format, width, height);
-}
-
-static cairo_t *
-_context_create (void *closure,
- cairo_surface_t *surface)
-{
- scache_mark_active (surface);
- return cairo_create (surface);
-}
-
-static int user_interrupt;
-
-static void
-interrupt (int sig)
-{
- if (user_interrupt) {
- signal (sig, SIG_DFL);
- raise (sig);
- }
-
- user_interrupt = 1;
-}
-
-static void
-describe (cairo_perf_t *perf,
- void *closure)
-{
- char *description = NULL;
-
- if (perf->has_described_backend)
- return;
- perf->has_described_backend = TRUE;
-
- if (perf->target->describe)
- description = perf->target->describe (closure);
-
- if (description == NULL)
- return;
-
- if (perf->raw) {
- printf ("[ # ] %s: %s\n", perf->target->name, description);
- }
-
- if (perf->summary) {
- fprintf (perf->summary,
- "[ # ] %8s: %s\n",
- perf->target->name,
- description);
- }
-
- free (description);
-}
-
-static void
-usage (const char *argv0)
-{
- fprintf (stderr,
-"Usage: %s [-clrsv] [-i iterations] [-t tile-size] [-x exclude-file] [test-names ... | traces ...]\n"
-"\n"
-"Run the cairo performance test suite over the given tests (all by default)\n"
-"The command-line arguments are interpreted as follows:\n"
-"\n"
-" -c use surface cache; keep a cache of surfaces to be reused\n"
-" -i iterations; specify the number of iterations per test case\n"
-" -l list only; just list selected test case names without executing\n"
-" -r raw; display each time measurement instead of summary statistics\n"
-" -s sync; only sum the elapsed time of the indiviual operations\n"
-" -t tile size; draw to tiled surfaces\n"
-" -v verbose; in raw mode also show the summaries\n"
-" -x exclude; specify a file to read a list of traces to exclude\n"
-"\n"
-"If test names are given they are used as sub-string matches so a command\n"
-"such as \"%s firefox\" can be used to run all firefox traces.\n"
-"Alternatively, you can specify a list of filenames to execute.\n",
- argv0, argv0);
-}
-
-static cairo_bool_t
-read_excludes (cairo_perf_t *perf,
- const char *filename)
-{
- FILE *file;
- char *line = NULL;
- size_t line_size = 0;
- char *s, *t;
-
- file = fopen (filename, "r");
- if (file == NULL)
- return FALSE;
-
- while (getline (&line, &line_size, file) != -1) {
- /* terminate the line at a comment marker '#' */
- s = strchr (line, '#');
- if (s)
- *s = '\0';
-
- /* whitespace delimits */
- s = line;
- while (*s != '\0' && isspace (*s))
- s++;
-
- t = s;
- while (*t != '\0' && ! isspace (*t))
- t++;
-
- if (s != t) {
- int i = perf->num_exclude_names;
- perf->exclude_names = xrealloc (perf->exclude_names,
- sizeof (char *) * (i+1));
- perf->exclude_names[i] = strndup (s, t-s);
- perf->num_exclude_names++;
- }
- }
- free (line);
-
- fclose (file);
-
- return TRUE;
-}
-
-static void
-parse_options (cairo_perf_t *perf,
- int argc,
- char *argv[])
-{
- int c;
- const char *iters;
- char *end;
- int verbose = 0;
- int use_surface_cache = 0;
-
- if ((iters = getenv ("CAIRO_PERF_ITERATIONS")) && *iters)
- perf->iterations = strtol (iters, NULL, 0);
- else
- perf->iterations = CAIRO_PERF_ITERATIONS_DEFAULT;
- perf->exact_iterations = 0;
-
- perf->raw = FALSE;
- perf->observe = FALSE;
- perf->list_only = FALSE;
- perf->tile_size = 0;
- perf->names = NULL;
- perf->num_names = 0;
- perf->summary = stdout;
- perf->summary_continuous = FALSE;
- perf->exclude_names = NULL;
- perf->num_exclude_names = 0;
-
- while (1) {
- c = _cairo_getopt (argc, argv, "ci:lrst:vx:");
- if (c == -1)
- break;
-
- switch (c) {
- case 'c':
- use_surface_cache = 1;
- break;
- case 'i':
- perf->exact_iterations = TRUE;
- perf->iterations = strtoul (optarg, &end, 10);
- if (*end != '\0') {
- fprintf (stderr, "Invalid argument for -i (not an integer): %s\n",
- optarg);
- exit (1);
- }
- break;
- case 'l':
- perf->list_only = TRUE;
- break;
- case 'r':
- perf->raw = TRUE;
- perf->summary = NULL;
- break;
- case 's':
- perf->observe = TRUE;
- break;
- case 't':
- perf->tile_size = strtoul (optarg, &end, 10);
- if (*end != '\0') {
- fprintf (stderr, "Invalid argument for -t (not an integer): %s\n",
- optarg);
- exit (1);
- }
- break;
- case 'v':
- verbose = 1;
- break;
- case 'x':
- if (! read_excludes (perf, optarg)) {
- fprintf (stderr, "Invalid argument for -x (not readable file): %s\n",
- optarg);
- exit (1);
- }
- break;
- default:
- fprintf (stderr, "Internal error: unhandled option: %c\n", c);
- /* fall-through */
- case '?':
- usage (argv[0]);
- exit (1);
- }
- }
-
- if (perf->observe && perf->tile_size) {
- fprintf (stderr, "Can't mix observer and tiling. Sorry.\n");
- exit (1);
- }
-
- if (verbose && perf->summary == NULL)
- perf->summary = stderr;
-#if HAVE_UNISTD_H
- if (perf->summary && isatty (fileno (perf->summary)))
- perf->summary_continuous = TRUE;
-#endif
-
- if (optind < argc) {
- perf->names = &argv[optind];
- perf->num_names = argc - optind;
- }
-
- if (use_surface_cache)
- surface_cache = _cairo_hash_table_create (scache_equal);
-}
-
-static void
-cairo_perf_fini (cairo_perf_t *perf)
-{
- cairo_boilerplate_free_targets (perf->targets);
- cairo_boilerplate_fini ();
-
- free (perf->times);
- cairo_debug_reset_static_data ();
-#if HAVE_FCFINI
- FcFini ();
-#endif
-}
-
-static cairo_bool_t
-have_trace_filenames (cairo_perf_t *perf)
-{
- unsigned int i;
-
- if (perf->num_names == 0)
- return FALSE;
-
-#if HAVE_UNISTD_H
- for (i = 0; i < perf->num_names; i++)
- if (access (perf->names[i], R_OK) == 0)
- return TRUE;
-#endif
-
- return FALSE;
-}
-
-static void
-_tiling_surface_finish (cairo_surface_t *observer,
- cairo_surface_t *target,
- void *closure)
-{
- struct trace *args = closure;
- cairo_surface_t *surface;
- cairo_content_t content;
- cairo_rectangle_t r;
- int width, height;
- int x, y, w, h;
-
- cairo_recording_surface_get_extents (target, &r);
- w = r.width;
- h = r.height;
-
- content = cairo_surface_get_content (target);
-
- for (y = 0; y < h; y += args->tile_size) {
- height = args->tile_size;
- if (y + height > h)
- height = h - y;
-
- for (x = 0; x < w; x += args->tile_size) {
- cairo_t *cr;
-
- width = args->tile_size;
- if (x + width > w)
- width = w - x;
-
- /* XXX to correctly observe the playback we would need
- * to replay the target onto the observer directly.
- */
- surface = args->target->create_similar (args->surface,
- content, width, height);
-
- cr = cairo_create (surface);
- cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
- cairo_set_source_surface (cr, target, -x, -y);
- cairo_paint (cr);
- cairo_destroy (cr);
-
- cairo_surface_destroy (surface);
- }
- }
-}
-
-static cairo_surface_t *
-_tiling_surface_create (void *closure,
- cairo_content_t content,
- double width,
- double height,
- long uid)
-{
- cairo_rectangle_t r;
- cairo_surface_t *surface, *observer;
-
- r.x = r.y = 0;
- r.width = width;
- r.height = height;
-
- surface = cairo_recording_surface_create (content, &r);
- observer = cairo_surface_create_observer (surface,
- CAIRO_SURFACE_OBSERVER_NORMAL);
- cairo_surface_destroy (surface);
-
- cairo_surface_observer_add_finish_callback (observer,
- _tiling_surface_finish,
- closure);
-
- return observer;
-}
-
-static void
-cairo_perf_trace (cairo_perf_t *perf,
- const cairo_boilerplate_target_t *target,
- const char *trace)
-{
- static cairo_bool_t first_run = TRUE;
- unsigned int i;
- cairo_time_t *times, *paint, *mask, *fill, *stroke, *glyphs;
- cairo_stats_t stats = {0.0, 0.0};
- struct trace args = { target };
- int low_std_dev_count;
- char *trace_cpy, *name;
- const cairo_script_interpreter_hooks_t hooks = {
- &args,
- perf->tile_size ? _tiling_surface_create : _similar_surface_create,
- NULL, /* surface_destroy */
- _context_create,
- NULL, /* context_destroy */
- NULL, /* show_page */
- NULL, /* copy_page */
- _source_image_create,
- };
-
- args.tile_size = perf->tile_size;
- args.observe = perf->observe;
-
- trace_cpy = xstrdup (trace);
- name = basename_no_ext (trace_cpy);
-
- if (perf->list_only) {
- printf ("%s\n", name);
- free (trace_cpy);
- return;
- }
-
- if (first_run) {
- if (perf->raw) {
- printf ("[ # ] %s.%-s %s %s %s ...\n",
- "backend", "content", "test-size", "ticks-per-ms", "time(ticks)");
- }
-
- if (perf->summary) {
- if (perf->observe) {
- fprintf (perf->summary,
- "[ # ] %8s %28s %9s %9s %9s %9s %9s %9s %5s\n",
- "backend", "test",
- "total(s)", "paint(s)", "mask(s)", "fill(s)", "stroke(s)", "glyphs(s)",
- "count");
- } else {
- fprintf (perf->summary,
- "[ # ] %8s %28s %8s %5s %5s %s\n",
- "backend", "test", "min(s)", "median(s)",
- "stddev.", "count");
- }
- }
- first_run = FALSE;
- }
-
- times = perf->times;
- paint = times + perf->iterations;
- mask = paint + perf->iterations;
- stroke = mask + perf->iterations;
- fill = stroke + perf->iterations;
- glyphs = fill + perf->iterations;
-
- low_std_dev_count = 0;
- for (i = 0; i < perf->iterations && ! user_interrupt; i++) {
- cairo_script_interpreter_t *csi;
- cairo_status_t status;
- unsigned int line_no;
-
- args.surface = target->create_surface (NULL,
- CAIRO_CONTENT_COLOR_ALPHA,
- 1, 1,
- 1, 1,
- CAIRO_BOILERPLATE_MODE_PERF,
- &args.closure);
- fill_surface(args.surface); /* remove any clear flags */
-
- if (perf->observe) {
- cairo_surface_t *obs;
- obs = cairo_surface_create_observer (args.surface,
- CAIRO_SURFACE_OBSERVER_NORMAL);
- cairo_surface_destroy (args.surface);
- args.surface = obs;
- }
- if (cairo_surface_status (args.surface)) {
- fprintf (stderr,
- "Error: Failed to create target surface: %s\n",
- target->name);
- return;
- }
-
- cairo_perf_timer_set_synchronize (target->synchronize, args.closure);
-
- if (i == 0) {
- describe (perf, args.closure);
- if (perf->summary) {
- fprintf (perf->summary,
- "[%3d] %8s %28s ",
- perf->test_number,
- perf->target->name,
- name);
- fflush (perf->summary);
- }
- }
-
- csi = cairo_script_interpreter_create ();
- cairo_script_interpreter_install_hooks (csi, &hooks);
-
- if (! perf->observe) {
- cairo_perf_yield ();
- cairo_perf_timer_start ();
- }
-
- cairo_script_interpreter_run (csi, trace);
- line_no = cairo_script_interpreter_get_line_number (csi);
-
- /* Finish before querying timings in case we are using an intermediate
- * target and so need to destroy all surfaces before rendering
- * commences.
- */
- cairo_script_interpreter_finish (csi);
-
- if (perf->observe) {
- cairo_device_t *observer = cairo_surface_get_device (args.surface);
- times[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_elapsed (observer));
- paint[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_paint_elapsed (observer));
- mask[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_mask_elapsed (observer));
- stroke[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_stroke_elapsed (observer));
- fill[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_fill_elapsed (observer));
- glyphs[i] = _cairo_time_from_s (1.e-9 * cairo_device_observer_glyphs_elapsed (observer));
- } else {
- fill_surface (args.surface); /* queue a write to the sync'ed surface */
- cairo_perf_timer_stop ();
- times[i] = cairo_perf_timer_elapsed ();
- }
-
- scache_clear ();
-
- cairo_surface_destroy (args.surface);
-
- if (target->cleanup)
- target->cleanup (args.closure);
-
- status = cairo_script_interpreter_destroy (csi);
- if (status) {
- if (perf->summary) {
- fprintf (perf->summary, "Error during replay, line %d: %s\n",
- line_no,
- cairo_status_to_string (status));
- }
- goto out;
- }
-
- if (perf->raw) {
- if (i == 0)
- printf ("[*] %s.%s %s.%d %g",
- perf->target->name,
- "rgba",
- name,
- 0,
- _cairo_time_to_double (_cairo_time_from_s (1)) / 1000.);
- printf (" %lld", (long long) times[i]);
- fflush (stdout);
- } else if (! perf->exact_iterations) {
- if (i > CAIRO_PERF_MIN_STD_DEV_COUNT) {
- _cairo_stats_compute (&stats, times, i+1);
-
- if (stats.std_dev <= CAIRO_PERF_LOW_STD_DEV) {
- if (++low_std_dev_count >= CAIRO_PERF_STABLE_STD_DEV_COUNT)
- break;
- } else {
- low_std_dev_count = 0;
- }
- }
- }
-
- if (perf->summary && perf->summary_continuous) {
- _cairo_stats_compute (&stats, times, i+1);
-
- fprintf (perf->summary,
- "\r[%3d] %8s %28s ",
- perf->test_number,
- perf->target->name,
- name);
- if (perf->observe) {
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- _cairo_stats_compute (&stats, paint, i+1);
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- _cairo_stats_compute (&stats, mask, i+1);
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- _cairo_stats_compute (&stats, fill, i+1);
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- _cairo_stats_compute (&stats, stroke, i+1);
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- _cairo_stats_compute (&stats, glyphs, i+1);
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- fprintf (perf->summary,
- " %5d", i+1);
- } else {
- fprintf (perf->summary,
- "%#8.3f %#8.3f %#6.2f%% %4d/%d",
- _cairo_time_to_s (stats.min_ticks),
- _cairo_time_to_s (stats.median_ticks),
- stats.std_dev * 100.0,
- stats.iterations, i+1);
- }
- fflush (perf->summary);
- }
- }
- user_interrupt = 0;
-
- if (perf->summary) {
- _cairo_stats_compute (&stats, times, i);
- if (perf->summary_continuous) {
- fprintf (perf->summary,
- "\r[%3d] %8s %28s ",
- perf->test_number,
- perf->target->name,
- name);
- }
- if (perf->observe) {
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- _cairo_stats_compute (&stats, paint, i);
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- _cairo_stats_compute (&stats, mask, i);
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- _cairo_stats_compute (&stats, fill, i);
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- _cairo_stats_compute (&stats, stroke, i);
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- _cairo_stats_compute (&stats, glyphs, i);
- fprintf (perf->summary,
- " %#9.3f", _cairo_time_to_s (stats.median_ticks));
-
- fprintf (perf->summary,
- " %5d\n", i);
- } else {
- fprintf (perf->summary,
- "%#8.3f %#8.3f %#6.2f%% %4d/%d\n",
- _cairo_time_to_s (stats.min_ticks),
- _cairo_time_to_s (stats.median_ticks),
- stats.std_dev * 100.0,
- stats.iterations, i);
- }
- fflush (perf->summary);
- }
-
-out:
- if (perf->raw) {
- printf ("\n");
- fflush (stdout);
- }
-
- perf->test_number++;
- free (trace_cpy);
-}
-
-static void
-warn_no_traces (const char *message,
- const char *trace_dir)
-{
- fprintf (stderr,
-"Error: %s '%s'.\n"
-"Have you cloned the cairo-traces repository and uncompressed the traces?\n"
-" git clone git://anongit.freedesktop.org/cairo-traces\n"
-" cd cairo-traces && make\n"
-"Or set the env.var CAIRO_TRACE_DIR to point to your traces?\n",
- message, trace_dir);
-}
-
-static int
-cairo_perf_trace_dir (cairo_perf_t *perf,
- const cairo_boilerplate_target_t *target,
- const char *dirname)
-{
- DIR *dir;
- struct dirent *de;
- int num_traces = 0;
- cairo_bool_t force;
- cairo_bool_t is_explicit;
-
- dir = opendir (dirname);
- if (dir == NULL)
- return 0;
-
- force = FALSE;
- if (cairo_perf_can_run (perf, dirname, &is_explicit))
- force = is_explicit;
-
- while ((de = readdir (dir)) != NULL) {
- char *trace;
- struct stat st;
-
- if (de->d_name[0] == '.')
- continue;
-
- xasprintf (&trace, "%s/%s", dirname, de->d_name);
- if (stat (trace, &st) != 0)
- goto next;
-
- if (S_ISDIR(st.st_mode)) {
- num_traces += cairo_perf_trace_dir (perf, target, trace);
- } else {
- const char *dot;
-
- dot = strrchr (de->d_name, '.');
- if (dot == NULL)
- goto next;
- if (strcmp (dot, ".trace"))
- goto next;
-
- num_traces++;
- if (!force && ! cairo_perf_can_run (perf, de->d_name, NULL))
- goto next;
-
- cairo_perf_trace (perf, target, trace);
- }
-next:
- free (trace);
-
- }
- closedir (dir);
-
- return num_traces;
-}
-
-int
-main (int argc,
- char *argv[])
-{
- cairo_perf_t perf;
- const char *trace_dir = "cairo-traces:/usr/src/cairo-traces:/usr/share/cairo-traces";
- unsigned int n;
- int i;
-
- parse_options (&perf, argc, argv);
-
- signal (SIGINT, interrupt);
-
- if (getenv ("CAIRO_TRACE_DIR") != NULL)
- trace_dir = getenv ("CAIRO_TRACE_DIR");
-
- perf.targets = cairo_boilerplate_get_targets (&perf.num_targets, NULL);
- perf.times = xmalloc (6 * perf.iterations * sizeof (cairo_time_t));
-
- /* do we have a list of filenames? */
- perf.exact_names = have_trace_filenames (&perf);
-
- for (i = 0; i < perf.num_targets; i++) {
- const cairo_boilerplate_target_t *target = perf.targets[i];
-
- if (! perf.list_only && ! target->is_measurable)
- continue;
-
- perf.target = target;
- perf.test_number = 0;
- perf.has_described_backend = FALSE;
-
- if (perf.exact_names) {
- for (n = 0; n < perf.num_names; n++) {
- struct stat st;
-
- if (stat (perf.names[n], &st) == 0) {
- if (S_ISDIR (st.st_mode)) {
- cairo_perf_trace_dir (&perf, target, perf.names[n]);
- } else
- cairo_perf_trace (&perf, target, perf.names[n]);
- }
- }
- } else {
- int num_traces = 0;
- const char *dir;
-
- dir = trace_dir;
- do {
- char buf[1024];
- const char *end = strchr (dir, ':');
- if (end != NULL) {
- memcpy (buf, dir, end-dir);
- buf[end-dir] = '\0';
- end++;
-
- dir = buf;
- }
-
- num_traces += cairo_perf_trace_dir (&perf, target, dir);
- dir = end;
- } while (dir != NULL);
-
- if (num_traces == 0) {
- warn_no_traces ("Found no traces in", trace_dir);
- return 1;
- }
- }
-
- if (perf.list_only)
- break;
- }
-
- cairo_perf_fini (&perf);
-
- return 0;
-}
diff --git a/perf/cairo-perf.c b/perf/cairo-perf.c
deleted file mode 100644
index 18db0c544..000000000
--- a/perf/cairo-perf.c
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2007 Netlabs
- * Copyright (c) 2006 Mozilla Corporation
- * Copyright (c) 2006 Red Hat, Inc.
- * Copyright (c) 2011 Andrea Canciani
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * the authors not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. The authors make no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Authors: Peter Weilbacher <mozilla@weilbacher.org>
- * Vladimir Vukicevic <vladimir@pobox.com> (win32/linux code)
- * Carl Worth <cworth@cworth.org> (win32/linux code)
- * Andrea Canciani <ranma42@gmail.com>
- */
-
-#include "cairo-perf.h"
-#include "../src/cairo-time-private.h"
-
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#if defined(__OS2__)
-#define INCL_BASE
-#include <os2.h>
-#elif defined(_WIN32)
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#elif defined(_POSIX_PRIORITY_SCHEDULING)
-#include <sched.h>
-#endif
-
-
-/* timers */
-static cairo_time_t timer;
-static cairo_perf_timer_synchronize_t cairo_perf_timer_synchronize = NULL;
-static void *cairo_perf_timer_synchronize_closure = NULL;
-
-void
-cairo_perf_timer_set_synchronize (cairo_perf_timer_synchronize_t synchronize,
- void *closure)
-{
- cairo_perf_timer_synchronize = synchronize;
- cairo_perf_timer_synchronize_closure = closure;
-}
-
-void
-cairo_perf_timer_start (void)
-{
- timer = _cairo_time_get ();
-}
-
-void
-cairo_perf_timer_stop (void)
-{
- if (cairo_perf_timer_synchronize)
- cairo_perf_timer_synchronize (cairo_perf_timer_synchronize_closure);
-
- timer = _cairo_time_get_delta (timer);
-}
-
-cairo_time_t
-cairo_perf_timer_elapsed (void)
-{
- return timer;
-}
-
-void
-cairo_perf_yield (void)
-{
- /* try to deactivate this thread until the scheduler calls it again */
-
-#if defined(__OS2__)
- DosSleep (0);
-#elif defined(_WIN32)
- SleepEx(0, TRUE);
-#elif defined(_POSIX_PRIORITY_SCHEDULING)
- sched_yield ();
-#else
- sleep (0);
-#endif
-}
diff --git a/perf/cairo-perf.h b/perf/cairo-perf.h
deleted file mode 100644
index eb53d13c2..000000000
--- a/perf/cairo-perf.h
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright © 2006 Mozilla Corporation
- * Copyright © 2006 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * the authors not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. The authors make no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Authors: Vladimir Vukicevic <vladimir@pobox.com>
- * Carl Worth <cworth@cworth.org>
- */
-
-#ifndef _CAIRO_PERF_H_
-#define _CAIRO_PERF_H_
-
-#include "cairo-boilerplate.h"
-#include "../src/cairo-time-private.h"
-#include <stdio.h>
-
-typedef struct _cairo_stats {
- cairo_time_t min_ticks;
- cairo_time_t median_ticks;
- double ticks_per_ms;
- double std_dev;
- int iterations;
- cairo_time_t *values;
-} cairo_stats_t;
-
-typedef struct _cairo_histogram {
- int width, height, max_count;
- int num_columns, num_rows;
- cairo_time_t min_value, max_value;
- int *columns;
-} cairo_histogram_t;
-
-
-/* timers */
-
-void
-cairo_perf_timer_start (void);
-
-void
-cairo_perf_timer_stop (void);
-
-typedef void
-(*cairo_perf_timer_synchronize_t) (void *closure);
-
-void
-cairo_perf_timer_set_synchronize (cairo_perf_timer_synchronize_t synchronize,
- void *closure);
-
-cairo_time_t
-cairo_perf_timer_elapsed (void);
-
-/* yield */
-
-void
-cairo_perf_yield (void);
-
-/* running a test case */
-typedef struct _cairo_perf {
- FILE *summary;
- cairo_bool_t summary_continuous;
-
- /* Options from command-line */
- unsigned int iterations;
- cairo_bool_t exact_iterations;
- cairo_bool_t raw;
- cairo_bool_t list_only;
- cairo_bool_t observe;
- char **names;
- unsigned int num_names;
- char **exclude_names;
- unsigned int num_exclude_names;
- cairo_bool_t exact_names;
-
- double ms_per_iteration;
- cairo_bool_t fast_and_sloppy;
-
- unsigned int tile_size;
-
- /* Stuff used internally */
- cairo_time_t *times;
- const cairo_boilerplate_target_t **targets;
- int num_targets;
- const cairo_boilerplate_target_t *target;
- cairo_bool_t has_described_backend;
- unsigned int test_number;
- unsigned int size;
- cairo_t *cr;
-} cairo_perf_t;
-
-typedef cairo_time_t
-(*cairo_perf_func_t) (cairo_t *cr, int width, int height, int loops);
-
-typedef double
-(*cairo_count_func_t) (cairo_t *cr, int width, int height);
-
-cairo_bool_t
-cairo_perf_can_run (cairo_perf_t *perf,
- const char *name,
- cairo_bool_t *is_explicit);
-
-void
-cairo_perf_run (cairo_perf_t *perf,
- const char *name,
- cairo_perf_func_t perf_func,
- cairo_count_func_t count_func);
-
-void
-cairo_perf_cover_sources_and_operators (cairo_perf_t *perf,
- const char *name,
- cairo_perf_func_t perf_func,
- cairo_count_func_t count_func);
-
-/* reporter convenience routines */
-
-typedef struct _test_report {
- int id;
- int fileno;
- const char *configuration;
- char *backend;
- char *content;
- char *name;
- int size;
-
- /* The samples only exists for "raw" reports */
- cairo_time_t *samples;
- unsigned int samples_size;
- unsigned int samples_count;
-
- /* The stats are either read directly or computed from samples.
- * If the stats have not yet been computed from samples, then
- * iterations will be 0. */
- cairo_stats_t stats;
-} test_report_t;
-
-typedef struct _test_diff {
- test_report_t **tests;
- int num_tests;
- double min;
- double max;
- double change;
-} test_diff_t;
-
-typedef struct _cairo_perf_report {
- char *configuration;
- const char *name;
- int fileno;
- test_report_t *tests;
- int tests_size;
- int tests_count;
-} cairo_perf_report_t;
-
-typedef enum {
- TEST_REPORT_STATUS_SUCCESS,
- TEST_REPORT_STATUS_COMMENT,
- TEST_REPORT_STATUS_ERROR
-} test_report_status_t;
-
-void
-cairo_perf_report_load (cairo_perf_report_t *report,
- const char *filename, int id,
- int (*cmp) (const void *, const void *));
-
-void
-cairo_perf_report_sort_and_compute_stats (cairo_perf_report_t *report,
- int (*cmp) (const void *, const void *));
-
-int
-test_report_cmp_backend_then_name (const void *a,
- const void *b);
-
-int
-test_report_cmp_name (const void *a,
- const void *b);
-
-#define CAIRO_PERF_ENABLED_DECL(func) cairo_bool_t (func ## _enabled) (cairo_perf_t *perf)
-#define CAIRO_PERF_RUN_DECL(func) void (func) (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-
-#define CAIRO_PERF_DECL(func) CAIRO_PERF_RUN_DECL(func); CAIRO_PERF_ENABLED_DECL(func)
-
-#ifndef MIN
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif
-
-#ifndef MAX
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-#endif
-
-CAIRO_PERF_DECL (fill);
-CAIRO_PERF_DECL (paint);
-CAIRO_PERF_DECL (paint_with_alpha);
-CAIRO_PERF_DECL (mask);
-CAIRO_PERF_DECL (stroke);
-CAIRO_PERF_DECL (subimage_copy);
-CAIRO_PERF_DECL (disjoint);
-CAIRO_PERF_DECL (hatching);
-CAIRO_PERF_DECL (tessellate);
-CAIRO_PERF_DECL (text);
-CAIRO_PERF_DECL (glyphs);
-CAIRO_PERF_DECL (hash_table);
-CAIRO_PERF_DECL (pattern_create_radial);
-CAIRO_PERF_DECL (zrusin);
-CAIRO_PERF_DECL (world_map);
-CAIRO_PERF_DECL (box_outline);
-CAIRO_PERF_DECL (mosaic);
-CAIRO_PERF_DECL (long_lines);
-CAIRO_PERF_DECL (unaligned_clip);
-CAIRO_PERF_DECL (rectangles);
-CAIRO_PERF_DECL (rounded_rectangles);
-CAIRO_PERF_DECL (long_dashed_lines);
-CAIRO_PERF_DECL (composite_checker);
-CAIRO_PERF_DECL (twin);
-CAIRO_PERF_DECL (dragon);
-CAIRO_PERF_DECL (pythagoras_tree);
-CAIRO_PERF_DECL (intersections);
-CAIRO_PERF_DECL (spiral);
-CAIRO_PERF_DECL (wave);
-CAIRO_PERF_DECL (many_strokes);
-CAIRO_PERF_DECL (wide_strokes);
-CAIRO_PERF_DECL (many_fills);
-CAIRO_PERF_DECL (wide_fills);
-CAIRO_PERF_DECL (many_curves);
-CAIRO_PERF_DECL (curve);
-CAIRO_PERF_DECL (a1_curve);
-CAIRO_PERF_DECL (line);
-CAIRO_PERF_DECL (a1_line);
-CAIRO_PERF_DECL (pixel);
-CAIRO_PERF_DECL (a1_pixel);
-CAIRO_PERF_DECL (sierpinski);
-CAIRO_PERF_DECL (fill_clip);
-CAIRO_PERF_DECL (tiger);
-
-#endif
diff --git a/perf/cairo-stats.c b/perf/cairo-stats.c
deleted file mode 100644
index aee9fe8b5..000000000
--- a/perf/cairo-stats.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * the authors not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. The authors make no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Authors: Carl Worth <cworth@cworth.org>
- */
-
-#include "cairo-stats.h"
-
-#include <assert.h>
-
-void
-_cairo_stats_compute (cairo_stats_t *stats,
- cairo_time_t *values,
- int num_values)
-{
- cairo_time_t sum, mean, q1, q3, iqr;
- cairo_time_t outlier_min, outlier_max;
- int i, min_valid, num_valid;
- double s;
-
- assert (num_values > 0);
-
- if (num_values == 1) {
- stats->min_ticks = stats->median_ticks = values[0];
- stats->std_dev = 0;
- stats->iterations = 1;
- stats->values = values;
- return;
- }
-
- /* First, identify any outliers, using the definition of "mild
- * outliers" from:
- *
- * http://en.wikipedia.org/wiki/Outliers
- *
- * Which is that outliers are any values less than Q1 - 1.5 * IQR
- * or greater than Q3 + 1.5 * IQR where Q1 and Q3 are the first
- * and third quartiles and IQR is the inter-quartile range (Q3 -
- * Q1).
- */
- num_valid = num_values;
- do {
- num_values = num_valid;
- qsort (values, num_values, sizeof (cairo_time_t), _cairo_time_cmp);
-
- q1 = values[1*num_values/4];
- q3 = values[3*num_values/4];
-
- /* XXX assumes we have native uint64_t */
- iqr = q3 - q1;
- outlier_min = q1 - 3 * iqr / 2;
- outlier_max = q3 + 3 * iqr / 2;
-
- for (i = 0; i < num_values && values[i] < outlier_min; i++)
- ;
- min_valid = i;
-
- for (i = 0; i < num_values && values[i] <= outlier_max; i++)
- ;
- num_valid = i - min_valid;
- assert(num_valid);
- values += min_valid;
- } while (num_valid != num_values);
-
- stats->values = values;
- stats->iterations = num_valid;
- stats->min_ticks = values[0];
- stats->median_ticks = values[num_valid / 2];
-
- sum = 0;
- for (i = 0; i < num_valid; i++)
- sum = _cairo_time_add (sum, values[i]);
- mean = sum / num_valid;
-
- /* Let's use a normalized std. deviation for easier comparison. */
- s = 0;
- for (i = 0; i < num_valid; i++) {
- double delta = (values[i] - mean) / (double)mean;
- s += delta * delta;
- }
- stats->std_dev = sqrt(s / num_valid);
-}
-
-cairo_bool_t
-_cairo_histogram_init (cairo_histogram_t *h,
- int width, int height)
-{
- h->width = width;
- h->height = height;
- if (h->width < 2 || h->height < 1)
- return FALSE;
-
- h->num_columns = width - 2;
- h->num_rows = height - 1;
- h->columns = malloc (sizeof(int)*h->num_columns);
- return h->columns != NULL;
-}
-
-cairo_bool_t
-_cairo_histogram_compute (cairo_histogram_t *h,
- const cairo_time_t *values,
- int num_values)
-{
- cairo_time_t delta;
- int i;
-
- if (num_values == 0)
- return FALSE;
-
- h->min_value = values[0];
- h->max_value = values[0];
-
- for (i = 1; i < num_values; i++) {
- if (values[i] < h->min_value)
- h->min_value = values[i];
- if (values[i] > h->max_value)
- h->max_value = values[i];
- }
-
- delta = h->max_value - h->min_value;
- if (delta == 0)
- return FALSE;
-
- memset(h->columns, 0, sizeof(int)*h->num_columns);
- h->max_count = 0;
-
- for (i = 0; i < num_values; i++) {
- int count = h->columns[(values[i] - h->min_value) * (h->num_columns - 1) / delta]++;
- if (count > h->max_count)
- h->max_count = count;
- }
-
- return TRUE;
-}
-
-void
-_cairo_histogram_printf (cairo_histogram_t *h,
- FILE *file)
-{
- int x, y, num_rows;
-
- num_rows = h->num_rows;
- if (h->max_count < num_rows)
- num_rows = h->max_count;
- for (y = 0; y < num_rows; y++) {
- int min_count = ((num_rows - y - 1) * h->max_count) / num_rows + h->max_count / (2*num_rows);
- fprintf (file, "|");
- for (x = 0; x < h->num_columns; x++)
- fprintf (file, "%c", h->columns[x] > min_count ? 'x' : ' ');
- fprintf (file, "|\n");
- }
-
- fprintf(file, ".");
- for (x = 0; x < h->num_columns; x++)
- fprintf (file, "-");
- fprintf (file, ".\n");
-}
-
-void
-_cairo_histogram_fini (cairo_histogram_t *h)
-{
- free(h->columns);
-}
diff --git a/perf/cairo-stats.h b/perf/cairo-stats.h
deleted file mode 100644
index 2b32d67ae..000000000
--- a/perf/cairo-stats.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * the authors not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. The authors make no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Authors: Carl Worth <cworth@cworth.org>
- */
-
-#ifndef _CAIRO_STATS_H_
-#define _CAIRO_STATS_H_
-
-#include "cairo-perf.h"
-
-void
-_cairo_stats_compute (cairo_stats_t *stats,
- cairo_time_t *values,
- int num_values);
-
-cairo_bool_t
-_cairo_histogram_init (cairo_histogram_t *h,
- int width, int height);
-
-cairo_bool_t
-_cairo_histogram_compute (cairo_histogram_t *h,
- const cairo_time_t *values,
- int num_values);
-
-void
-_cairo_histogram_printf (cairo_histogram_t *h,
- FILE *file);
-
-void
-_cairo_histogram_fini (cairo_histogram_t *h);
-
-#endif /* _CAIRO_STATS_H_ */
diff --git a/perf/dirent-win32.h b/perf/dirent-win32.h
deleted file mode 100644
index 0f2ed05e5..000000000
--- a/perf/dirent-win32.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */
-/*
- * Copyright 2011 Andrea Canciani
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * the authors not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. The authors make no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Authors: Andrea Canciani <ranma42@gmail.com>
- */
-
-#include "cairo-compiler-private.h"
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-
-#define stat _stat
-
-#define S_ISDIR(s) ((s) & _S_IFDIR)
-
-struct dirent {
- ino_t d_ino;
- char d_name[FILENAME_MAX + 1];
-};
-
-typedef struct _DIR {
- HANDLE handle;
- cairo_bool_t has_next;
- WIN32_FIND_DATA data;
- struct dirent de;
-} DIR;
-
-static DIR *
-opendir(const char *dirname)
-{
- DIR *dirp;
-
- dirp = malloc (sizeof (*dirp));
- if (unlikely (dirp == NULL))
- return NULL;
-
- dirp->handle = FindFirstFile(dirname, &dirp->data);
-
- if (unlikely (dirp->handle == INVALID_HANDLE_VALUE)) {
- free (dirp);
- return NULL;
- }
-
- memcpy (dirp->de.d_name, dirp->data.cFileName,
- sizeof (dirp->data.cFileName));
- dirp->de.d_name[FILENAME_MAX] = '\0';
-
- dirp->has_next = TRUE;
-
- return dirp;
-}
-
-static int
-closedir(DIR *dirp)
-{
- int ret;
-
- ret = ! FindClose (dirp->handle);
-
- free (dirp);
-
- /* TODO: set errno */
-
- return ret;
-}
-
-static struct dirent *
-readdir(DIR *dirp)
-{
- if (! dirp->has_next)
- return NULL;
-
- /* COMPILE_TIME_ASSERT (FILENAME_MAX == sizeof (dirp->data.cFileName)); */
-
- memcpy (dirp->de.d_name, dirp->data.cFileName,
- sizeof (dirp->data.cFileName));
- dirp->de.d_name[FILENAME_MAX] = '\0';
-
- dirp->has_next = FindNextFile (dirp->handle, &dirp->data);
-
- return &dirp->de;
-}
diff --git a/perf/make-html.py b/perf/make-html.py
deleted file mode 100755
index 0b4533581..000000000
--- a/perf/make-html.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/python
-
-from string import strip
-from sys import stdin
-
-targets = {}
-smilies = {'slowdown': '&#9785;' , 'speedup': '&#9786;'}
-
-for line in stdin:
- line = map(strip, filter(None, line.split(' ')))
-
- if 9 == len(line):
- target, name = line[0:2]
- factor, dir = line[-2:]
-
- name = name.split('-')
- name, size = '-'.join(name[:-1]), name[-1]
-
- target_tests = targets.get(target, {})
- name_tests = target_tests.get(name, {})
-
- name_tests[int(size)] = (factor, dir)
- target_tests[name] = name_tests
- targets[target] = target_tests
-
-print '''\
-<html><head>
-<title>Performance Changes</title>
-<style type="text/css">/*<![CDATA[*/
- body { background: white; color: black; }
- table { border-collapse: collapse; }
-
- th, td { border: 1px solid silver; padding: 0.2em; }
- td { text-align: center; }
- th:first-child { text-align: left; }
- th { background: #eee; }
-
- /* those colors also should work for color blinds */
- td.slowdown { background: #f93; }
- td.speedup { background: #6f9; }
-/*]]>*/</style>
-</head><body>
-<h1>Performance Changes</h1>'''
-
-targets = targets.items()
-targets.sort(lambda a, b: cmp(a[0], b[0]))
-
-for target, names in targets:
- sizes = {}
-
- for tests in names.values():
- for size in tests.keys():
- sizes[size] = True
-
- sizes = sizes.keys()
- sizes.sort()
-
- names = names.items()
- names.sort(lambda a, b: cmp(a[0], b[0]))
-
- print '<h2><a name="%s">%s</a></h2>' % (target, target)
- print '<table><thead><tr><th>&nbsp;</th>'
-
- for size in sizes:
- print '<th>%s</th>' % size
-
- print '</tr></thead><tbody>'
-
- for name, tests in names:
- print '<tr><th>%s</th>' % name
-
- for size in sizes:
- result = tests.get(size)
-
- if result:
- factor, dir = result
- print '<td class="%s">%s %s</td>' % (
- dir, factor, smilies[dir])
-
- else:
- print '<td>&nbsp;</td>'
-
- print '</tr>'
-
-
- print '</tbody></table>'
-
-print '</body></html>'
diff --git a/perf/micro/Makefile.am b/perf/micro/Makefile.am
deleted file mode 100644
index 3edbf531c..000000000
--- a/perf/micro/Makefile.am
+++ /dev/null
@@ -1,16 +0,0 @@
-include $(top_srcdir)/build/Makefile.am.common
-
-include $(top_srcdir)/perf/micro/Makefile.sources
-
-noinst_LTLIBRARIES = libcairo-perf-micro.la
-libcairo_perf_micro_la_SOURCES = \
- $(libcairo_perf_micro_sources) \
- $(libcairo_perf_micro_headers)
-
-AM_CPPFLAGS = \
- -I$(srcdir) \
- -I$(top_srcdir)/boilerplate \
- -I$(top_srcdir)/src \
- -I$(top_srcdir)/perf \
- -I$(top_builddir)/src \
- $(CAIRO_CFLAGS)
diff --git a/perf/micro/Makefile.sources b/perf/micro/Makefile.sources
deleted file mode 100644
index 19ead179d..000000000
--- a/perf/micro/Makefile.sources
+++ /dev/null
@@ -1,51 +0,0 @@
-libcairo_perf_micro_sources = \
- cairo-perf-cover.c \
- box-outline.c \
- composite-checker.c \
- disjoint.c \
- fill.c \
- hatching.c \
- hash-table.c \
- line.c \
- a1-line.c \
- long-lines.c \
- mosaic.c \
- paint.c \
- paint-with-alpha.c \
- mask.c \
- pattern_create_radial.c \
- rectangles.c \
- rounded-rectangles.c \
- stroke.c \
- subimage_copy.c \
- tessellate.c \
- text.c \
- tiger.c \
- glyphs.c \
- twin.c \
- unaligned-clip.c \
- wave.c \
- world-map.c \
- zrusin.c \
- long-dashed-lines.c \
- dragon.c \
- pythagoras-tree.c \
- intersections.c \
- many-strokes.c \
- wide-strokes.c \
- many-fills.c \
- wide-fills.c \
- many-curves.c \
- curve.c \
- a1-curve.c \
- spiral.c \
- pixel.c \
- sierpinski.c \
- fill-clip.c \
- $(NULL)
-
-libcairo_perf_micro_headers = \
- mosaic.h \
- world-map.h \
- zrusin-another.h \
- $(NULL)
diff --git a/perf/micro/Makefile.win32 b/perf/micro/Makefile.win32
deleted file mode 100644
index f41f781d7..000000000
--- a/perf/micro/Makefile.win32
+++ /dev/null
@@ -1,12 +0,0 @@
-top_srcdir = ../..
-include $(top_srcdir)/build/Makefile.win32.common
-include $(top_srcdir)/perf/micro/Makefile.sources
-
-CFLAGS += -I$(top_srcdir)/perf -I$(top_srcdir)/boilerplate/
-
-OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(libcairo_perf_micro_sources))
-
-all: inform $(CFG)/libcairo-perf-micro.lib
-
-$(CFG)/libcairo-perf-micro.lib: $(OBJECTS)
- @$(AR) $(CAIRO_ARFLAGS) -OUT:$@ $(OBJECTS)
diff --git a/perf/micro/a1-curve.c b/perf/micro/a1-curve.c
deleted file mode 100644
index 594c46d5c..000000000
--- a/perf/micro/a1-curve.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright © 2011 Intel Corporation
- *
- * 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.
- *
- * Author: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-
-static uint32_t state;
-
-static double
-uniform_random (double minval, double maxval)
-{
- static uint32_t const poly = 0x9a795537U;
- uint32_t n = 32;
- while (n-->0)
- state = 2*state < state ? (2*state ^ poly) : 2*state;
- return minval + state * (maxval - minval) / 4294967296.0;
-}
-
-static cairo_time_t
-do_curve_stroke (cairo_t *cr, int width, int height, int loops)
-{
- state = 0xc0ffee;
- cairo_set_line_width (cr, 2.);
- cairo_perf_timer_start ();
-
- while (loops--) {
- double x1 = uniform_random (0, width);
- double x2 = uniform_random (0, width);
- double x3 = uniform_random (0, width);
- double y1 = uniform_random (0, height);
- double y2 = uniform_random (0, height);
- double y3 = uniform_random (0, height);
- cairo_move_to (cr, uniform_random (0, width), uniform_random (0, height));
- cairo_curve_to (cr, x1, y1, x2, y2, x3, y3);
- cairo_stroke(cr);
- }
-
- cairo_perf_timer_stop ();
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_curve_fill (cairo_t *cr, int width, int height, int loops)
-{
- state = 0xc0ffee;
- cairo_perf_timer_start ();
-
- while (loops--) {
- double x0 = uniform_random (0, width);
- double x1 = uniform_random (0, width);
- double x2 = uniform_random (0, width);
- double x3 = uniform_random (0, width);
- double xm = uniform_random (0, width);
- double xn = uniform_random (0, width);
- double y0 = uniform_random (0, height);
- double y1 = uniform_random (0, height);
- double y2 = uniform_random (0, height);
- double y3 = uniform_random (0, height);
- double ym = uniform_random (0, height);
- double yn = uniform_random (0, height);
-
- cairo_move_to (cr, xm, ym);
- cairo_curve_to (cr, x1, y1, x2, y2, xn, yn);
- cairo_curve_to (cr, x3, y3, x0, y0, xm, ym);
- cairo_close_path (cr);
-
- cairo_fill(cr);
- }
-
- cairo_perf_timer_stop ();
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-a1_curve_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "a1-curve", NULL);
-}
-
-void
-a1_curve (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_set_source_rgb (cr, 1., 1., 1.);
- cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
-
- cairo_perf_run (perf, "a1-curve-stroked", do_curve_stroke, NULL);
- cairo_perf_run (perf, "a1-curve-filled", do_curve_fill, NULL);
-}
diff --git a/perf/micro/a1-line.c b/perf/micro/a1-line.c
deleted file mode 100644
index ae8660212..000000000
--- a/perf/micro/a1-line.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright © 2011 Intel Corporation
- *
- * 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.
- *
- * Author: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-
-static cairo_time_t
-horizontal (cairo_t *cr, int width, int height, int loops)
-{
- double h = height/2 + .5;
-
- cairo_move_to (cr, 0, h);
- cairo_line_to (cr, width, h);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-horizontal_hair (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return horizontal (cr, width, height, loops);
-}
-
-static cairo_time_t
-horizontal_wide (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return horizontal (cr, width, height, loops);
-}
-
-static cairo_time_t
-nearly_horizontal (cairo_t *cr, int width, int height, int loops)
-{
- double h = height/2;
-
- cairo_move_to (cr, 0, h);
- cairo_line_to (cr, width, h+1);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-nearly_horizontal_hair (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return nearly_horizontal (cr, width, height, loops);
-}
-
-static cairo_time_t
-nearly_horizontal_wide (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return nearly_horizontal (cr, width, height, loops);
-}
-
-
-static cairo_time_t
-vertical (cairo_t *cr, int width, int height, int loops)
-{
- double w = width/2 + .5;
-
- cairo_move_to (cr, w, 0);
- cairo_line_to (cr, w, height);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-vertical_hair (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return vertical (cr, width, height, loops);
-}
-
-static cairo_time_t
-vertical_wide (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return vertical (cr, width, height, loops);
-}
-
-static cairo_time_t
-nearly_vertical (cairo_t *cr, int width, int height, int loops)
-{
- double w = width/2;
-
- cairo_move_to (cr, w, 0);
- cairo_line_to (cr, w+1, height);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-nearly_vertical_hair (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return nearly_vertical (cr, width, height, loops);
-}
-
-static cairo_time_t
-nearly_vertical_wide (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return nearly_vertical (cr, width, height, loops);
-}
-
-
-static cairo_time_t
-diagonal (cairo_t *cr, int width, int height, int loops)
-{
- cairo_move_to (cr, 0, 0);
- cairo_line_to (cr, width, height);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-diagonal_hair (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return diagonal (cr, width, height, loops);
-}
-
-static cairo_time_t
-diagonal_wide (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return diagonal (cr, width, height, loops);
-}
-
-cairo_bool_t
-a1_line_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "a1-line", NULL);
-}
-
-void
-a1_line (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_set_source_rgb (cr, 1., 1., 1.);
- cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
-
- cairo_perf_run (perf, "a1-line-hh", horizontal_hair, NULL);
- cairo_perf_run (perf, "a1-line-hw", horizontal_wide, NULL);
- cairo_perf_run (perf, "a1-line-nhh", nearly_horizontal_hair, NULL);
- cairo_perf_run (perf, "a1-line-nhw", nearly_horizontal_wide, NULL);
-
- cairo_perf_run (perf, "a1-line-vh", vertical_hair, NULL);
- cairo_perf_run (perf, "a1-line-vw", vertical_wide, NULL);
- cairo_perf_run (perf, "a1-line-nvh", nearly_vertical_hair, NULL);
- cairo_perf_run (perf, "a1-line-nvw", nearly_vertical_wide, NULL);
-
- cairo_perf_run (perf, "a1-line-dh", diagonal_hair, NULL);
- cairo_perf_run (perf, "a1-line-dw", diagonal_wide, NULL);
-}
diff --git a/perf/micro/box-outline.c b/perf/micro/box-outline.c
deleted file mode 100644
index 1e654eb95..000000000
--- a/perf/micro/box-outline.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- *
- *
- * 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.
- *
- * Author: Carl D. Worth <cworth@cworth.org>
- */
-
-#include "cairo-perf.h"
-
-/* This test case is designed to illustrate a performance bug that
- * exists in cairo in which using cairo_stroke is much slower than
- * cairo_fill to draw an identical figure, (and in particular a figure
- * that is much more natural to draw with cairo_stroke). The figure is
- * a 100x100 square outline 1-pixel wide, nicely pixel aligned.
- *
- * The performance bug should affect any path whose resulting contour
- * consists only of pixel-aligned horizontal and vertical elements.
- *
- * Initial testing on on machine shows stroke as 5x slower than fill
- * for the xlib backend and 16x slower for the image backend.
- */
-
-static cairo_time_t
-box_outline_stroke (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_source_rgb (cr, 0, 0, 1); /* blue */
- cairo_paint (cr);
-
- cairo_rectangle (cr,
- 1.5, 1.5,
- width - 3, height - 3);
- cairo_set_line_width (cr, 1.0);
- cairo_set_source_rgb (cr, 1, 0, 0); /* red */
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-box_outline_alpha_stroke (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_source_rgb (cr, 0, 0, 1); /* blue */
- cairo_paint (cr);
-
- cairo_rectangle (cr,
- 1.5, 1.5,
- width - 3, height - 3);
- cairo_set_line_width (cr, 1.0);
- cairo_set_source_rgba (cr, 1, 0, 0, .5); /* red */
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-box_outline_aa_stroke (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_source_rgb (cr, 0, 0, 1); /* blue */
- cairo_paint (cr);
-
- cairo_translate (cr, .5, .5);
- cairo_rectangle (cr,
- 1.5, 1.5,
- width - 3, height - 3);
- cairo_set_line_width (cr, 1.0);
- cairo_set_source_rgb (cr, 1, 0, 0); /* red */
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-box_outline_fill (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_source_rgb (cr, 0, 0, 1); /* blue */
- cairo_paint (cr);
-
- cairo_rectangle (cr,
- 1.0, 1.0,
- width - 2, height - 2);
- cairo_rectangle (cr,
- 2.0, 2.0,
- width - 4, height - 4);
- cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
- cairo_set_source_rgb (cr, 0, 1, 0); /* green */
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-box_outline_alpha_fill (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_source_rgb (cr, 0, 0, 1); /* blue */
- cairo_paint (cr);
-
- cairo_rectangle (cr,
- 1.0, 1.0,
- width - 2, height - 2);
- cairo_rectangle (cr,
- 2.0, 2.0,
- width - 4, height - 4);
- cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
- cairo_set_source_rgba (cr, 0, 1, 0, .5); /* green */
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-box_outline_aa_fill (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_source_rgb (cr, 0, 0, 1); /* blue */
- cairo_paint (cr);
-
- cairo_translate (cr, .5, .5);
- cairo_rectangle (cr,
- 1.0, 1.0,
- width - 2, height - 2);
- cairo_rectangle (cr,
- 2.0, 2.0,
- width - 4, height - 4);
- cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
- cairo_set_source_rgb (cr, 0, 1, 0); /* green */
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-box_outline_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "box-outline", NULL);
-}
-
-void
-box_outline (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_run (perf, "box-outline-stroke", box_outline_stroke, NULL);
- cairo_perf_run (perf, "box-outline-fill", box_outline_fill, NULL);
-
- cairo_perf_run (perf, "box-outline-alpha-stroke", box_outline_alpha_stroke, NULL);
- cairo_perf_run (perf, "box-outline-alpha-fill", box_outline_alpha_fill, NULL);
-
- cairo_perf_run (perf, "box-outline-aa-stroke", box_outline_aa_stroke, NULL);
- cairo_perf_run (perf, "box-outline-aa-fill", box_outline_aa_fill, NULL);
-}
diff --git a/perf/micro/cairo-perf-cover.c b/perf/micro/cairo-perf-cover.c
deleted file mode 100644
index c2499021f..000000000
--- a/perf/micro/cairo-perf-cover.c
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * Red Hat, Inc. not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. Red Hat, Inc. makes no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Carl D. Worth <cworth@cworth.org>
- */
-
-#include "cairo-perf.h"
-
-static void
-init_and_set_source_surface (cairo_t *cr,
- cairo_surface_t *source,
- int width,
- int height)
-{
- cairo_t *cr2;
-
- /* Fill it with something known */
- cr2 = cairo_create (source);
- cairo_set_operator (cr2, CAIRO_OPERATOR_SOURCE);
- cairo_set_source_rgb (cr2, 0, 0, 1); /* blue */
- cairo_paint (cr2);
-
- cairo_set_source_rgba (cr2, 1, 0, 0, 0.5); /* 50% red */
- cairo_new_path (cr2);
- cairo_rectangle (cr2, 0, 0, width/2.0, height/2.0);
- cairo_rectangle (cr2, width/2.0, height/2.0, width/2.0, height/2.0);
- cairo_fill (cr2);
-
- cairo_set_source_surface (cr, cairo_get_target (cr2), 0, 0);
- cairo_destroy (cr2);
-}
-
-static void
-set_source_solid_rgb (cairo_t *cr,
- int width,
- int height)
-{
- cairo_set_source_rgb (cr, 0.2, 0.6, 0.9);
-}
-
-static void
-set_source_solid_rgba (cairo_t *cr,
- int width,
- int height)
-{
- cairo_set_source_rgba (cr, 0.2, 0.6, 0.9, 0.7);
-}
-
-static void
-set_source_image_surface_rgb (cairo_t *cr,
- int width,
- int height)
-{
- cairo_surface_t *source;
-
- source = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
- width, height);
- init_and_set_source_surface (cr, source, width, height);
-
- cairo_surface_destroy (source);
-}
-
-static void
-set_source_image_surface_rgba (cairo_t *cr,
- int width,
- int height)
-{
- cairo_surface_t *source;
-
- source = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- width, height);
- init_and_set_source_surface (cr, source, width, height);
-
- cairo_surface_destroy (source);
-}
-
-static void
-set_source_image_surface_rgba_mag (cairo_t *cr,
- int width,
- int height)
-{
- cairo_surface_t *source;
-
- source = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- width/2, height/2);
- cairo_scale(cr, 2.1, 2.1);
- init_and_set_source_surface (cr, source, width/2, height/2);
- cairo_scale(cr, 1/2.1, 1/2.1);
-
- cairo_surface_destroy (source);
-}
-
-static void
-set_source_image_surface_rgba_min (cairo_t *cr,
- int width,
- int height)
-{
- cairo_surface_t *source;
-
- source = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- width*2, height*2);
- cairo_scale(cr, 1/1.9, 1/1.9);
- init_and_set_source_surface (cr, source, width*2, height*2);
- cairo_scale(cr, 1.9, 1.9);
-
- cairo_surface_destroy (source);
-}
-
-static void
-set_source_similar_surface_rgb (cairo_t *cr,
- int width,
- int height)
-{
- cairo_surface_t *source;
-
- source = cairo_surface_create_similar (cairo_get_group_target (cr),
- CAIRO_CONTENT_COLOR,
- width, height);
- init_and_set_source_surface (cr, source, width, height);
-
- cairo_surface_destroy (source);
-}
-
-static void
-set_source_similar_surface_rgba (cairo_t *cr,
- int width,
- int height)
-{
- cairo_surface_t *source;
-
- source = cairo_surface_create_similar (cairo_get_group_target (cr),
- CAIRO_CONTENT_COLOR_ALPHA,
- width, height);
- init_and_set_source_surface (cr, source, width, height);
-
- cairo_surface_destroy (source);
-}
-
-static void
-set_source_similar_surface_rgba_mag (cairo_t *cr,
- int width,
- int height)
-{
- cairo_surface_t *source;
-
- source = cairo_surface_create_similar (cairo_get_group_target (cr),
- CAIRO_CONTENT_COLOR_ALPHA,
- width/2, height/2);
- cairo_scale(cr, 2.1, 2.1);
- init_and_set_source_surface (cr, source, width/2, height/2);
- cairo_scale(cr, 1/2.1, 1/2.1);
-
- cairo_surface_destroy (source);
-}
-
-static void
-set_source_similar_surface_rgba_min (cairo_t *cr,
- int width,
- int height)
-{
- cairo_surface_t *source;
-
- source = cairo_surface_create_similar (cairo_get_group_target (cr),
- CAIRO_CONTENT_COLOR_ALPHA,
- width*2, height*2);
- cairo_scale(cr, 1/1.9, 1/1.9);
- init_and_set_source_surface (cr, source, width*2, height*2);
- cairo_scale(cr, 1.9, 1.9);
-
- cairo_surface_destroy (source);
-}
-
-static void
-set_source_linear_rgb (cairo_t *cr,
- int width,
- int height)
-{
- cairo_pattern_t *linear;
-
- linear = cairo_pattern_create_linear (0.0, 0.0, width, height);
- cairo_pattern_add_color_stop_rgb (linear, 0.0, 1, 0, 0); /* red */
- cairo_pattern_add_color_stop_rgb (linear, 1.0, 0, 0, 1); /* blue */
-
- cairo_set_source (cr, linear);
-
- cairo_pattern_destroy (linear);
-}
-
-static void
-set_source_linear_rgba (cairo_t *cr,
- int width,
- int height)
-{
- cairo_pattern_t *linear;
-
- linear = cairo_pattern_create_linear (0.0, 0.0, width, height);
- cairo_pattern_add_color_stop_rgba (linear, 0.0, 1, 0, 0, 0.5); /* 50% red */
- cairo_pattern_add_color_stop_rgba (linear, 1.0, 0, 0, 1, 0.0); /* 0% blue */
-
- cairo_set_source (cr, linear);
-
- cairo_pattern_destroy (linear);
-}
-
-static void
-set_source_linear3_rgb (cairo_t *cr,
- int width,
- int height)
-{
- cairo_pattern_t *linear;
-
- linear = cairo_pattern_create_linear (0.0, 0.0, width, height);
- cairo_pattern_add_color_stop_rgb (linear, 0.0, 1, 0, 0); /* red */
- cairo_pattern_add_color_stop_rgb (linear, 0.5, 0, 1, 0); /* green */
- cairo_pattern_add_color_stop_rgb (linear, 1.0, 0, 0, 1); /* blue */
-
- cairo_set_source (cr, linear);
-
- cairo_pattern_destroy (linear);
-}
-
-static void
-set_source_linear3_rgba (cairo_t *cr,
- int width,
- int height)
-{
- cairo_pattern_t *linear;
-
- linear = cairo_pattern_create_linear (0.0, 0.0, width, height);
- cairo_pattern_add_color_stop_rgba (linear, 0.0, 1, 0, 0, 0.5); /* 50% red */
- cairo_pattern_add_color_stop_rgba (linear, 0.5, 0, 1, 0, 0.0); /* 0% green */
- cairo_pattern_add_color_stop_rgba (linear, 1.0, 0, 0, 1, 0.5); /* 50% blue */
-
- cairo_set_source (cr, linear);
-
- cairo_pattern_destroy (linear);
-}
-
-static void
-set_source_radial_rgb (cairo_t *cr,
- int width,
- int height)
-{
- cairo_pattern_t *radial;
-
- radial = cairo_pattern_create_radial (width/2.0, height/2.0, 0.0,
- width/2.0, height/2.0, width/2.0);
- cairo_pattern_add_color_stop_rgb (radial, 0.0, 1, 0, 0); /* red */
- cairo_pattern_add_color_stop_rgb (radial, 1.0, 0, 0, 1); /* blue */
-
- cairo_set_source (cr, radial);
-
- cairo_pattern_destroy (radial);
-}
-
-static void
-set_source_radial_rgba (cairo_t *cr,
- int width,
- int height)
-{
- cairo_pattern_t *radial;
-
- radial = cairo_pattern_create_radial (width/2.0, height/2.0, 0.0,
- width/2.0, height/2.0, width/2.0);
- cairo_pattern_add_color_stop_rgba (radial, 0.0, 1, 0, 0, 0.5); /* 50% red */
- cairo_pattern_add_color_stop_rgba (radial, 1.0, 0, 0, 1, 0.0); /* 0% blue */
-
- cairo_set_source (cr, radial);
-
- cairo_pattern_destroy (radial);
-}
-
-typedef void (*set_source_func_t) (cairo_t *cr, int width, int height);
-
-void
-cairo_perf_cover_sources_and_operators (cairo_perf_t *perf,
- const char *name,
- cairo_perf_func_t perf_func,
- cairo_count_func_t count_func)
-{
- unsigned int i, j;
- char *expanded_name;
-
- struct { set_source_func_t set_source; const char *name; } sources[] = {
- { set_source_solid_rgb, "solid-rgb" },
- { set_source_solid_rgba, "solid-rgba" },
- { set_source_image_surface_rgb, "image-rgb" },
- { set_source_image_surface_rgba, "image-rgba" },
- { set_source_image_surface_rgba_mag, "image-rgba-mag" },
- { set_source_image_surface_rgba_min, "image-rgba-min" },
- { set_source_similar_surface_rgb, "similar-rgb" },
- { set_source_similar_surface_rgba, "similar-rgba" },
- { set_source_similar_surface_rgba_mag, "similar-rgba-mag" },
- { set_source_similar_surface_rgba_min, "similar-rgba-min" },
- { set_source_linear_rgb, "linear-rgb" },
- { set_source_linear_rgba, "linear-rgba" },
- { set_source_linear3_rgb, "linear3-rgb" },
- { set_source_linear3_rgba, "linear3-rgba" },
- { set_source_radial_rgb, "radial-rgb" },
- { set_source_radial_rgba, "radial-rgba" }
- };
-
- struct { cairo_operator_t op; const char *name; } operators[] = {
- { CAIRO_OPERATOR_OVER, "over" },
- { CAIRO_OPERATOR_SOURCE, "source" }
- };
-
- for (i = 0; i < ARRAY_LENGTH (sources); i++) {
- (sources[i].set_source) (perf->cr, perf->size, perf->size);
-
- for (j = 0; j < ARRAY_LENGTH (operators); j++) {
- cairo_set_operator (perf->cr, operators[j].op);
-
- xasprintf (&expanded_name, "%s_%s_%s",
- name, sources[i].name, operators[j].name);
- cairo_perf_run (perf, expanded_name, perf_func, count_func);
- free (expanded_name);
- }
- }
-}
diff --git a/perf/micro/composite-checker.c b/perf/micro/composite-checker.c
deleted file mode 100644
index d6d17ab63..000000000
--- a/perf/micro/composite-checker.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright © 2007 Björn Lindqvist
- *
- * 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.
- *
- * Author: Björn Lindqvist <bjourne@gmail.com>
- */
-
-#include "cairo-perf.h"
-
-/* This test case measures how much time cairo takes to render the
- * equivalent of the following gdk-pixbuf operation:
- *
- * gdk_pixbuf_composite_color(dest,
- * 0, 0, DST_SIZE, DST_SIZE,
- * 0, 0,
- * SCALE, SCALE,
- * gdk.INTERP_NEAREST,
- * 255,
- * 0, 0,
- * 8, 0x33333333, 0x88888888);
- *
- * Cairo is (at the time of writing) about 2-3 times as slow as
- * gdk-pixbuf.
- */
-#define PAT_SIZE 16
-#define SRC_SIZE 64
-
-static cairo_pattern_t *checkerboard = NULL;
-static cairo_pattern_t *src_pattern = NULL;
-
-static cairo_time_t
-do_composite_checker (cairo_t *cr,
- int width,
- int height,
- int loops)
-{
- /* Compute zoom so that the src_pattern covers the whole output image. */
- double xscale = width / (double) SRC_SIZE;
- double yscale = height / (double) SRC_SIZE;
-
- cairo_perf_timer_start ();
-
- while (loops--) {
- /* Fill the surface with our background. */
- cairo_identity_matrix (cr);
- cairo_set_source (cr, checkerboard);
- cairo_paint (cr);
-
- /* Draw the scaled image on top. */
- cairo_scale (cr, xscale, yscale);
- cairo_set_source (cr, src_pattern);
- cairo_paint (cr);
- }
-
- cairo_perf_timer_stop ();
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-composite_checker_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "composite-checker", NULL);
-}
-
-void
-composite_checker (cairo_perf_t *perf,
- cairo_t *cr,
- int width,
- int height)
-{
- cairo_surface_t *image;
-
- /* Create the checker pattern. We don't actually need to draw
- * anything on it since that wouldn't affect performance.
- */
- image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- PAT_SIZE,
- PAT_SIZE);
- checkerboard = cairo_pattern_create_for_surface (image);
- cairo_pattern_set_filter (checkerboard, CAIRO_FILTER_NEAREST);
- cairo_pattern_set_extend (checkerboard, CAIRO_EXTEND_REPEAT);
- cairo_surface_destroy (image);
-
- /* Create the image source pattern. Again we use the NEAREST
- * filtering which should be fastest.
- */
- image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- SRC_SIZE,
- SRC_SIZE);
- src_pattern = cairo_pattern_create_for_surface (image);
- cairo_pattern_set_filter (src_pattern, CAIRO_FILTER_NEAREST);
- cairo_surface_destroy (image);
-
- cairo_perf_run (perf, "composite-checker", do_composite_checker, NULL);
-
- cairo_pattern_destroy (checkerboard);
- cairo_pattern_destroy (src_pattern);
-}
diff --git a/perf/micro/curve.c b/perf/micro/curve.c
deleted file mode 100644
index 3b5a16342..000000000
--- a/perf/micro/curve.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright © 2011 Intel Corporation
- *
- * 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.
- *
- * Author: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-
-static uint32_t state;
-
-static double
-uniform_random (double minval, double maxval)
-{
- static uint32_t const poly = 0x9a795537U;
- uint32_t n = 32;
- while (n-->0)
- state = 2*state < state ? (2*state ^ poly) : 2*state;
- return minval + state * (maxval - minval) / 4294967296.0;
-}
-
-static cairo_time_t
-do_curve_stroke (cairo_t *cr, int width, int height, int loops)
-{
- state = 0xc0ffee;
- cairo_set_line_width (cr, 2.);
- cairo_perf_timer_start ();
-
- while (loops--) {
- double x1 = uniform_random (0, width);
- double x2 = uniform_random (0, width);
- double x3 = uniform_random (0, width);
- double y1 = uniform_random (0, height);
- double y2 = uniform_random (0, height);
- double y3 = uniform_random (0, height);
- cairo_move_to (cr, uniform_random (0, width), uniform_random (0, height));
- cairo_curve_to (cr, x1, y1, x2, y2, x3, y3);
- cairo_stroke(cr);
- }
-
- cairo_perf_timer_stop ();
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_curve_fill (cairo_t *cr, int width, int height, int loops)
-{
- state = 0xc0ffee;
- cairo_perf_timer_start ();
-
- while (loops--) {
- double x0 = uniform_random (0, width);
- double x1 = uniform_random (0, width);
- double x2 = uniform_random (0, width);
- double x3 = uniform_random (0, width);
- double xm = uniform_random (0, width);
- double xn = uniform_random (0, width);
- double y0 = uniform_random (0, height);
- double y1 = uniform_random (0, height);
- double y2 = uniform_random (0, height);
- double y3 = uniform_random (0, height);
- double ym = uniform_random (0, height);
- double yn = uniform_random (0, height);
-
- cairo_move_to (cr, xm, ym);
- cairo_curve_to (cr, x1, y1, x2, y2, xn, yn);
- cairo_curve_to (cr, x3, y3, x0, y0, xm, ym);
- cairo_close_path (cr);
-
- cairo_fill(cr);
- }
-
- cairo_perf_timer_stop ();
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-curve_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "curve", NULL);
-}
-
-void
-curve (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_set_source_rgb (cr, 1., 1., 1.);
-
- cairo_perf_run (perf, "curve-stroked", do_curve_stroke, NULL);
- cairo_perf_run (perf, "curve-filled", do_curve_fill, NULL);
-}
diff --git a/perf/micro/disjoint.c b/perf/micro/disjoint.c
deleted file mode 100644
index 847860c7e..000000000
--- a/perf/micro/disjoint.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */
-/* cairo - a vector graphics library with display and print output
- *
- * Copyright (c) 2011 Intel Corporation
- *
- * 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.
- */
-#include "cairo-perf.h"
-#include <assert.h>
-
-#define STEP 5
-
-static void path (cairo_t *cr, int width, int height)
-{
- int i;
-
- cairo_rectangle (cr, 0, 0, width, height);
- cairo_clip (cr);
-
- cairo_translate (cr, width/2, height/2);
- cairo_rotate (cr, M_PI/4);
- cairo_translate (cr, -width/2, -height/2);
-
- for (i = 0; i < width; i += STEP) {
- cairo_rectangle (cr, i, -2, 1, height+4);
- cairo_rectangle (cr, -2, i, width+4, 1);
- }
-}
-
-static void clip (cairo_t *cr, int width, int height)
-{
- int i, j;
-
- for (j = 0; j < height; j += 2*STEP) {
- for (i = 0; i < width; i += 2*STEP)
- cairo_rectangle (cr, i, j, STEP, STEP);
-
- j += 2*STEP;
- for (i = 0; i < width; i += 2*STEP)
- cairo_rectangle (cr, i+STEP/2, j, STEP, STEP);
- }
-
- cairo_clip (cr);
-}
-
-static cairo_time_t
-draw (cairo_t *cr, int width, int height, int loops)
-{
- cairo_save (cr);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_paint (cr);
- cairo_set_source_rgb (cr, 1, 0, 0);
-
- cairo_perf_timer_start ();
- while (loops--) {
- cairo_save (cr);
- clip (cr, width, height);
- path (cr, width, height);
- cairo_fill (cr);
- cairo_restore (cr);
- }
- cairo_perf_timer_stop ();
-
- cairo_restore (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-disjoint_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "disjoint", NULL);
-}
-
-void
-disjoint (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- if (! cairo_perf_can_run (perf, "disjoint", NULL))
- return;
-
- cairo_perf_run (perf, "disjoint", draw, NULL);
-}
diff --git a/perf/micro/dragon.c b/perf/micro/dragon.c
deleted file mode 100644
index aa5daf534..000000000
--- a/perf/micro/dragon.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright © 2007 Chris Wilson
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * Chris Wilson not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. Chris Wilson makes no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Chris Wilson <chris@chris-wilson.co.uk>
- *
- * Inspiration (and path!) taken from
- * http://labs.trolltech.com/blogs/2007/08/31/rasterizing-dragons/
- */
-
-#include "cairo-perf.h"
-
-static inline int
-next_pot (int v)
-{
- v--;
- v |= v >> 1;
- v |= v >> 2;
- v |= v >> 4;
- v |= v >> 8;
- v |= v >> 16;
- v++;
- return v;
-}
-
-static cairo_bool_t
-direction (int i)
-{
- int pivot, np2;
-
- if (i < 2)
- return TRUE;
-
- np2 = next_pot (i + 1);
- if (np2 == i + 1)
- return TRUE;
-
- pivot = np2 / 2 - 1;
- return ! direction (2 * pivot - i);
-}
-
-static void
-path (cairo_t *cr, int step, int dir, int iterations)
-{
- double dx, dy;
- int i;
-
- switch (dir) {
- default:
- case 0: dx = step; dy = 0; break;
- case 1: dx = -step; dy = 0; break;
- case 2: dx = 0; dy = step; break;
- case 3: dx = 0; dy = -step; break;
- }
-
- for (i = 0; i < iterations; i++) {
- cairo_rel_line_to (cr, dx, dy);
-
- if (direction (i)) {
- double t = dx;
- dx = dy;
- dy = -t;
- } else {
- double t = dx;
- dx = -dy;
- dy = t;
- }
- }
-}
-
-static cairo_time_t
-do_dragon (cairo_t *cr, int width, int height, int loops)
-{
- cairo_pattern_t *pattern;
- double cx, cy, r;
-
- cx = cy = .5 * MAX (width, height);
- r = .5 * MIN (width, height);
-
- cairo_perf_timer_start ();
-
- while (loops--) {
- pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r);
- cairo_pattern_add_color_stop_rgb (pattern, 0., .0, .0, .0);
- cairo_pattern_add_color_stop_rgb (pattern, 0.25, .5, .4, .4);
- cairo_pattern_add_color_stop_rgb (pattern, .5, .8, .8, .9);
- cairo_pattern_add_color_stop_rgb (pattern, 1., .9, .9, 1.);
- cairo_set_source (cr, pattern);
- cairo_pattern_destroy (pattern);
- cairo_paint (cr);
-
- cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
- cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
- cairo_set_line_width (cr, 4.);
-
- cairo_move_to (cr, cx, cy);
- path (cr, 12, 0, 2048);
- pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r);
- cairo_pattern_add_color_stop_rgb (pattern, 0., 1., 1., 1.);
- cairo_pattern_add_color_stop_rgb (pattern, 1., 0., 0., 0.);
- cairo_set_source (cr, pattern);
- cairo_pattern_destroy (pattern);
- cairo_stroke(cr);
-
- cairo_move_to (cr, cx, cy);
- path (cr, 12, 1, 2048);
- pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r);
- cairo_pattern_add_color_stop_rgb (pattern, 1., 1., 1., 0.);
- cairo_pattern_add_color_stop_rgb (pattern, 0., 1., 0., 0.);
- cairo_set_source (cr, pattern);
- cairo_pattern_destroy (pattern);
- cairo_stroke(cr);
-
- cairo_move_to (cr, cx, cy);
- path (cr, 12, 2, 2048);
- pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r);
- cairo_pattern_add_color_stop_rgb (pattern, 1., 0., 1., 1.);
- cairo_pattern_add_color_stop_rgb (pattern, 0., 0., 1., 0.);
- cairo_set_source (cr, pattern);
- cairo_pattern_destroy (pattern);
- cairo_stroke(cr);
-
- cairo_move_to (cr, cx, cy);
- path (cr, 12, 3, 2048);
- pattern = cairo_pattern_create_radial (cx, cy, 0., cx, cy, r);
- cairo_pattern_add_color_stop_rgb (pattern, 1., 1., 0., 1.);
- cairo_pattern_add_color_stop_rgb (pattern, 0., 0., 0., 1.);
- cairo_set_source (cr, pattern);
- cairo_pattern_destroy (pattern);
- cairo_stroke(cr);
- }
-
- cairo_perf_timer_stop ();
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_dragon_solid (cairo_t *cr, int width, int height, int loops)
-{
- double cx, cy;
-
- cx = cy = .5 * MAX (width, height);
-
- cairo_perf_timer_start ();
-
- while (loops--) {
- cairo_set_source_rgb (cr, 0, 0, 0);
- cairo_paint (cr);
-
- cairo_set_line_width (cr, 4.);
-
- cairo_move_to (cr, cx, cy);
- path (cr, 12, 0, 2048);
- cairo_set_source_rgb (cr, 1, 0, 0);
- cairo_stroke(cr);
-
- cairo_move_to (cr, cx, cy);
- path (cr, 12, 1, 2048);
- cairo_set_source_rgb (cr, 0, 1, 0);
- cairo_stroke(cr);
-
- cairo_move_to (cr, cx, cy);
- path (cr, 12, 2, 2048);
- cairo_set_source_rgb (cr, 0, 0, 1);
- cairo_stroke(cr);
-
- cairo_move_to (cr, cx, cy);
- path (cr, 12, 3, 2048);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_stroke(cr);
- }
-
- cairo_perf_timer_stop ();
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_dragon_solid_unaligned (cairo_t *cr, int width, int height, int loops)
-{
- cairo_translate (cr, 0.01, 0.01);
- return do_dragon_solid (cr, width, height, loops);
-}
-
-static cairo_time_t
-do_dragon_solid_aligned_clip (cairo_t *cr, int width, int height, int loops)
-{
- cairo_reset_clip (cr);
- cairo_rectangle (cr, 10, 10, width/2 + 10, height/2 + 10);
- cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 10, height/2 + 10);
- cairo_clip (cr);
-
- return do_dragon_solid (cr, width, height, loops);
-}
-
-static cairo_time_t
-do_dragon_unaligned_solid_aligned_clip (cairo_t *cr, int width, int height, int loops)
-{
- cairo_translate (cr, 0.01, 0.01);
- cairo_reset_clip (cr);
- cairo_rectangle (cr, 10, 10, width/2 + 10, height/2 + 10);
- cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 10, height/2 + 10);
- cairo_clip (cr);
-
- return do_dragon_solid (cr, width, height, loops);
-}
-
-static cairo_time_t
-do_dragon_solid_unaligned_clip (cairo_t *cr, int width, int height, int loops)
-{
- cairo_reset_clip (cr);
- cairo_rectangle (cr, 10.5, 10.5, width/2 + 10, height/2 + 10);
- cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 9.5, height/2 + 9.5);
- cairo_clip (cr);
-
- return do_dragon_solid (cr, width, height, loops);
-}
-
-static cairo_time_t
-do_dragon_unaligned_solid_unaligned_clip (cairo_t *cr, int width, int height, int loops)
-{
- cairo_translate (cr, 0.01, 0.01);
- cairo_reset_clip (cr);
- cairo_rectangle (cr, 10.5, 10.5, width/2 + 10, height/2 + 10);
- cairo_rectangle (cr, width/2-20, height/2-20, width/2 + 9.5, height/2 + 9.5);
- cairo_clip (cr);
-
- return do_dragon_solid (cr, width, height, loops);
-}
-
-static cairo_time_t
-do_dragon_solid_circle_clip (cairo_t *cr, int width, int height, int loops)
-{
- cairo_reset_clip (cr);
- cairo_arc (cr, width/2., height/2., MIN (width, height)/2. - 10, 0, 2 * M_PI);
- cairo_clip (cr);
-
- return do_dragon_solid (cr, width, height, loops);
-}
-
-cairo_bool_t
-dragon_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "dragon", NULL);
-}
-
-void
-dragon (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_run (perf, "dragon-solid", do_dragon_solid, NULL);
- cairo_perf_run (perf, "dragon-unaligned-solid", do_dragon_solid_unaligned, NULL);
- cairo_perf_run (perf, "dragon-solid-aligned-clip", do_dragon_solid_aligned_clip, NULL);
- cairo_perf_run (perf, "dragon-unaligned-solid-aligned-clip", do_dragon_unaligned_solid_aligned_clip, NULL);
- cairo_perf_run (perf, "dragon-solid-unaligned-clip", do_dragon_solid_unaligned_clip, NULL);
- cairo_perf_run (perf, "dragon-unaligned-solid-unaligned-clip", do_dragon_unaligned_solid_unaligned_clip, NULL);
- cairo_perf_run (perf, "dragon-solid-circle-clip", do_dragon_solid_circle_clip, NULL);
- cairo_perf_run (perf, "dragon", do_dragon, NULL);
-}
diff --git a/perf/micro/fill-clip.c b/perf/micro/fill-clip.c
deleted file mode 100644
index 2d014aca8..000000000
--- a/perf/micro/fill-clip.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright © 2011 Intel Corporation
- *
- * 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.
- *
- * Author: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-/* Compares the overhead for WebKit's drawRect() */
-
-#include "cairo-perf.h"
-
-#include <pixman.h>
-
-static cairo_time_t
-clip_paint (cairo_t *cr, int width, int height, int loops)
-{
- int x = width/4, w = width/2;
- int y = height/4, h = height/2;
-
- cairo_perf_timer_start ();
-
- while (loops--) {
- cairo_reset_clip (cr);
- cairo_rectangle (cr, x, y, w, h);
- cairo_clip (cr);
- cairo_paint (cr);
- }
-
- cairo_perf_timer_stop ();
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-rect_fill (cairo_t *cr, int width, int height, int loops)
-{
- int x = width/4, w = width/2;
- int y = height/4, h = height/2;
-
- cairo_perf_timer_start ();
-
- while (loops--) {
- cairo_rectangle (cr, x, y, w, h);
- cairo_fill (cr);
- }
-
- cairo_perf_timer_stop ();
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-direct (cairo_t *cr, int width, int height, int loops)
-{
- int x = width/4, w = width/2;
- int y = height/4, h = height/2;
- cairo_surface_t *surface, *image;
- uint8_t *data;
- int stride, bpp;
-
-
- surface = cairo_get_target (cr);
- image = cairo_surface_map_to_image (surface, NULL);
- data = cairo_image_surface_get_data (image);
- stride = cairo_image_surface_get_stride (image);
-
- switch (cairo_image_surface_get_format (image)) {
- default:
- case CAIRO_FORMAT_INVALID:
- case CAIRO_FORMAT_A1: bpp = 0; break;
- case CAIRO_FORMAT_A8: bpp = 8; break;
- case CAIRO_FORMAT_RGB16_565: bpp = 16; break;
- case CAIRO_FORMAT_RGB24:
- case CAIRO_FORMAT_RGB30:
- case CAIRO_FORMAT_ARGB32: bpp = 32; break;
- }
-
- cairo_perf_timer_start ();
-
- while (loops--) {
- pixman_fill ((uint32_t *)data, stride / sizeof(uint32_t), bpp,
- x, y, w, h,
- -1);
- }
-
- cairo_perf_timer_stop ();
-
- cairo_surface_unmap_image (surface, image);
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-fill_clip_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "fillclip", NULL);
-}
-
-void
-fill_clip (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_set_source_rgb (cr, 1., 1., 1.);
-
- cairo_perf_run (perf, "fillclip-clip", clip_paint, NULL);
- cairo_perf_run (perf, "fillclip-fill", rect_fill, NULL);
- cairo_perf_run (perf, "fillclip-direct", direct, NULL);
-}
diff --git a/perf/micro/fill.c b/perf/micro/fill.c
deleted file mode 100644
index d356c26d5..000000000
--- a/perf/micro/fill.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * Red Hat, Inc. not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. Red Hat, Inc. makes no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Carl D. Worth <cworth@cworth.org>
- */
-
-#include "cairo-perf.h"
-
-static cairo_time_t
-do_fill (cairo_t *cr, int width, int height, int loops)
-{
- cairo_arc (cr,
- width/2.0, height/2.0,
- width/3.0,
- 0, 2 * M_PI);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_fill_annuli (cairo_t *cr, int width, int height, int loops)
-{
- cairo_new_sub_path (cr);
- cairo_arc (cr,
- width/2.0, height/2.0,
- width/3.0,
- 0, 2 * M_PI);
-
- cairo_new_sub_path (cr);
- cairo_arc_negative (cr,
- width/2.0, height/2.0,
- width/4.0,
- 2 * M_PI, 0);
-
- cairo_new_sub_path (cr);
- cairo_arc (cr,
- width/2.0, height/2.0,
- width/6.0,
- 0, 2 * M_PI);
-
- cairo_new_sub_path (cr);
- cairo_arc_negative (cr,
- width/2.0, height/2.0,
- width/8.0,
- 2 * M_PI, 0);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_fill_eo_noaa (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
- cairo_set_fill_rule (cr, CAIRO_FILL_RULE_EVEN_ODD);
-
- cairo_arc (cr,
- width/2.0, height/2.0,
- width/3.0,
- 0, 2 * M_PI);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-fill_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "fill", NULL);
-}
-
-void
-fill (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_cover_sources_and_operators (perf, "fill", do_fill, NULL);
- cairo_perf_cover_sources_and_operators (perf, "fill-annuli", do_fill_annuli, NULL);
- cairo_perf_cover_sources_and_operators (perf, "fill-eo-noaa", do_fill_eo_noaa, NULL);
-}
diff --git a/perf/micro/glyphs.c b/perf/micro/glyphs.c
deleted file mode 100644
index 5f088b29e..000000000
--- a/perf/micro/glyphs.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- * Copyright © 2009 Chris Wilson
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * Red Hat, Inc. not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. Red Hat, Inc. makes no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Carl D. Worth <cworth@cworth.org>
- * Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-
-static cairo_time_t
-do_glyphs (double font_size,
- cairo_antialias_t antialias,
- cairo_t *cr, int width, int height, int loops)
-{
- const char text[] = "the jay, pig, fox, zebra and my wolves quack";
- cairo_scaled_font_t *scaled_font;
- cairo_glyph_t *glyphs = NULL, *glyphs_copy;
- cairo_text_extents_t extents;
- cairo_font_options_t *options;
- cairo_status_t status;
- double x, y;
- int num_glyphs, n;
-
- options = cairo_font_options_create ();
- cairo_font_options_set_antialias (options, antialias);
- cairo_set_font_options (cr, options);
- cairo_font_options_destroy (options);
-
- cairo_select_font_face (cr,
- "@cairo:",
- CAIRO_FONT_SLANT_NORMAL,
- CAIRO_FONT_WEIGHT_NORMAL);
- cairo_set_font_size (cr, font_size);
- scaled_font = cairo_get_scaled_font (cr);
- status = cairo_scaled_font_text_to_glyphs (scaled_font, 0., 0.,
- text, -1,
- &glyphs, &num_glyphs,
- NULL, NULL,
- NULL);
- if (status)
- return 0;
-
- glyphs_copy = cairo_glyph_allocate (num_glyphs);
- if (glyphs_copy == NULL) {
- cairo_glyph_free (glyphs);
- return 0;
- }
-
- cairo_scaled_font_glyph_extents (scaled_font,
- glyphs, num_glyphs,
- &extents);
-
- cairo_perf_timer_start ();
-
- while (loops--) {
- y = 0;
- do {
- x = 0;
- do {
- for (n = 0; n < num_glyphs; n++) {
- glyphs_copy[n] = glyphs[n];
- glyphs_copy[n].x += x;
- glyphs_copy[n].y += y;
- }
- cairo_show_glyphs (cr, glyphs_copy, num_glyphs);
-
- x += extents.width;
- } while (x < width);
- y += extents.height;
- } while (y < height);
- }
-
- cairo_perf_timer_stop ();
-
- cairo_glyph_free (glyphs);
- cairo_glyph_free (glyphs_copy);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static double
-count_glyphs (double font_size,
- cairo_antialias_t antialias,
- cairo_t *cr, int width, int height)
-{
- const char text[] = "the jay, pig, fox, zebra and my wolves quack";
- cairo_scaled_font_t *scaled_font;
- cairo_glyph_t *glyphs = NULL;
- cairo_text_extents_t extents;
- cairo_font_options_t *options;
- cairo_status_t status;
- int num_glyphs;
- int glyphs_per_line, lines_per_loop;
-
- options = cairo_font_options_create ();
- cairo_font_options_set_antialias (options, antialias);
- cairo_set_font_options (cr, options);
- cairo_font_options_destroy (options);
-
- cairo_select_font_face (cr,
- "@cairo:",
- CAIRO_FONT_SLANT_NORMAL,
- CAIRO_FONT_WEIGHT_NORMAL);
- cairo_set_font_size (cr, font_size);
- scaled_font = cairo_get_scaled_font (cr);
- status = cairo_scaled_font_text_to_glyphs (scaled_font, 0., 0.,
- text, -1,
- &glyphs, &num_glyphs,
- NULL, NULL,
- NULL);
- if (status)
- return 0;
-
- cairo_scaled_font_glyph_extents (scaled_font,
- glyphs, num_glyphs,
- &extents);
- cairo_glyph_free (glyphs);
-
- glyphs_per_line = num_glyphs * width / extents.width + 1;
- lines_per_loop = height / extents.height + 1;
- return glyphs_per_line * lines_per_loop / 1000.; /* kiloglyphs */
-}
-
-#define DECL(name,size, aa) \
-static cairo_time_t \
-do_glyphs##name (cairo_t *cr, int width, int height, int loops) \
-{ \
- return do_glyphs (size, aa, cr, width, height, loops); \
-} \
-\
-static double \
-count_glyphs##name (cairo_t *cr, int width, int height) \
-{ \
- return count_glyphs (size, aa, cr, width, height); \
-}
-
-DECL(8, 8, CAIRO_ANTIALIAS_GRAY)
-DECL(10, 10, CAIRO_ANTIALIAS_GRAY)
-DECL(12, 12, CAIRO_ANTIALIAS_GRAY)
-DECL(16, 16, CAIRO_ANTIALIAS_GRAY)
-DECL(20, 20, CAIRO_ANTIALIAS_GRAY)
-DECL(24, 24, CAIRO_ANTIALIAS_GRAY)
-DECL(32, 32, CAIRO_ANTIALIAS_GRAY)
-DECL(40, 40, CAIRO_ANTIALIAS_GRAY)
-DECL(48, 48, CAIRO_ANTIALIAS_GRAY)
-
-DECL(8ca, 8, CAIRO_ANTIALIAS_SUBPIXEL)
-DECL(48ca, 48, CAIRO_ANTIALIAS_SUBPIXEL)
-
-DECL(8mono, 8, CAIRO_ANTIALIAS_NONE)
-DECL(48mono, 48, CAIRO_ANTIALIAS_NONE)
-
-cairo_bool_t
-glyphs_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "glyphs", NULL);
-}
-
-void
-glyphs (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_cover_sources_and_operators (perf, "glyphs8mono", do_glyphs8mono, count_glyphs8mono);
- cairo_perf_cover_sources_and_operators (perf, "glyphs8", do_glyphs8, count_glyphs8);
- cairo_perf_cover_sources_and_operators (perf, "glyphs8ca", do_glyphs8ca, count_glyphs8ca);
-
- cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
- cairo_set_source_rgb (cr, 0, 0, 0);
-
- cairo_perf_run (perf, "glyphs8", do_glyphs8, count_glyphs8);
- cairo_perf_run (perf, "glyphs10", do_glyphs10, count_glyphs10);
- cairo_perf_run (perf, "glyphs12", do_glyphs12, count_glyphs12);
- cairo_perf_run (perf, "glyphs16", do_glyphs16, count_glyphs16);
- cairo_perf_run (perf, "glyphs20", do_glyphs20, count_glyphs20);
- cairo_perf_run (perf, "glyphs24", do_glyphs24, count_glyphs24);
- cairo_perf_run (perf, "glyphs32", do_glyphs32, count_glyphs32);
- cairo_perf_run (perf, "glyphs40", do_glyphs40, count_glyphs40);
- cairo_perf_run (perf, "glyphs48", do_glyphs48, count_glyphs48);
-
- cairo_perf_cover_sources_and_operators (perf, "glyphs48mono", do_glyphs48mono, count_glyphs48mono);
- cairo_perf_cover_sources_and_operators (perf, "glyphs48", do_glyphs48, count_glyphs48);
- cairo_perf_cover_sources_and_operators (perf, "glyphs48ca", do_glyphs48ca, count_glyphs48ca);
-}
diff --git a/perf/micro/hash-table.c b/perf/micro/hash-table.c
deleted file mode 100644
index d16291770..000000000
--- a/perf/micro/hash-table.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright © 2011 Andrea Canciani
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * Red Hat, Inc. not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. Red Hat, Inc. makes no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Andrea Canciani <ranma42@gmail.com>
- */
-
-#include "cairo-perf.h"
-
-#define ITER 1000
-#define HOLDOVERS 256
-#define LIVE_ENTRIES 257
-#define ACTIVE_FONTS (LIVE_ENTRIES - HOLDOVERS - 1)
-
-/*
- * The original implementation of hash tables was very inefficient, as
- * pointed out in https://bugs.freedesktop.org/show_bug.cgi?id=17399
- *
- * This benchmark tries to fill up the scaled_font_map hash table to
- * show the O(n) behavior.
- */
-
-static cairo_time_t
-do_hash_table (cairo_t *cr, int width, int height, int loops)
-{
- /*
- * Microsoft C Compiler complains that:
- * error C2466: cannot allocate an array of constant size 0
- * so we add an unused element to make it happy
- */
- cairo_scaled_font_t *active_fonts[ACTIVE_FONTS + 1];
- cairo_matrix_t m;
- int i;
-
- cairo_matrix_init_identity (&m);
-
- /* Touch HOLDOVERS scaled fonts to fill up the holdover list. */
- for (i = 0; i < HOLDOVERS; i++) {
- m.yy = m.xx * (i + 1);
- cairo_set_font_matrix (cr, &m);
- cairo_get_scaled_font (cr);
- }
-
- /*
- * Reference some scaled fonts so that they will be kept in the
- * scaled fonts map. We want LIVE_ENTRIES elements in the font
- * map, but cairo keeps HOLDOVERS recently used fonts in it and we
- * will be activating a new font in the cr context, so we just
- * keep references to ACTIVE_FONTS fonts.
- *
- * Note: setting LIVE_ENTRIES == HOLDOVERS+1 means that we keep no
- * font in active_fonts and the slowness is caused by the holdover
- * fonts only.
- */
- for (i = 0; i < ACTIVE_FONTS; i++) {
- cairo_scaled_font_t *scaled_font;
-
- m.yy = m.xx * (i + 1);
- cairo_set_font_matrix (cr, &m);
-
- scaled_font = cairo_get_scaled_font (cr);
- active_fonts[i] = cairo_scaled_font_reference (scaled_font);
- }
-
- cairo_perf_timer_start ();
-
- while (loops--) {
- m.xx += 1.0;
-
- /* Generate ITER new scaled fonts per loop */
- for (i = 0; i < ITER; i++) {
- m.yy = m.xx * (i + 1);
- cairo_set_font_matrix (cr, &m);
- cairo_get_scaled_font (cr);
- }
- }
-
- cairo_perf_timer_stop ();
-
- for (i = 0; i < ACTIVE_FONTS; i++)
- cairo_scaled_font_destroy (active_fonts[i]);
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-hash_table_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "hash-table", NULL);
-}
-
-void
-hash_table (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_cover_sources_and_operators (perf, "hash-table",
- do_hash_table, NULL);
-}
diff --git a/perf/micro/hatching.c b/perf/micro/hatching.c
deleted file mode 100644
index d1d9fb8a6..000000000
--- a/perf/micro/hatching.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */
-/* cairo - a vector graphics library with display and print output
- *
- * Copyright (c) 2011 Intel Corporation
- *
- * 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.
- */
-#include "cairo-perf.h"
-#include <assert.h>
-
-
-#define STEP 5
-#define WIDTH 100
-#define HEIGHT 100
-
-static void path (cairo_t *cr, unsigned int width, unsigned int height)
-{
- unsigned int i;
-
- for (i = 0; i < width+1; i += STEP) {
- cairo_rectangle (cr, i-1, -1, 2, height+2);
- cairo_rectangle (cr, -1, i-1, width+2, 2);
- }
-}
-
-static void aa (cairo_t *cr)
-{
- cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT);
-}
-
-static void mono (cairo_t *cr)
-{
- cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
-}
-
-static void aligned (cairo_t *cr, int width, int height)
-{
-}
-
-static void misaligned (cairo_t *cr, int width, int height)
-{
- cairo_translate (cr, 0.25, 0.25);
-}
-
-static void rotated (cairo_t *cr, int width, int height)
-{
- cairo_translate (cr, width/2, height/2);
- cairo_rotate (cr, M_PI/4);
- cairo_translate (cr, -width/2, -height/2);
-}
-
-static void clip (cairo_t *cr)
-{
- cairo_clip (cr);
- cairo_paint (cr);
-}
-
-static void clip_alpha (cairo_t *cr)
-{
- cairo_clip (cr);
- cairo_paint_with_alpha (cr, .5);
-}
-
-static cairo_time_t
-draw (cairo_t *cr,
- void (*prepare) (cairo_t *cr),
- void (*transform) (cairo_t *cr, int width, int height),
- void (*op) (cairo_t *cr),
- int width, int height, int loops)
-{
- cairo_save (cr);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_paint (cr);
- cairo_set_source_rgb (cr, 1, 0, 0);
-
- prepare (cr);
-
- cairo_perf_timer_start ();
- while (loops--) {
- cairo_save (cr);
- transform (cr, width, height);
- path (cr, width, height);
- op (cr);
- cairo_restore (cr);
- }
- cairo_perf_timer_stop ();
-
- cairo_restore (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-draw_aligned_aa (cairo_t *cr, int width, int height, int loops)
-{
- return draw(cr, aa, aligned, cairo_fill,
- width, height, loops);
-}
-
-static cairo_time_t
-draw_misaligned_aa (cairo_t *cr, int width, int height, int loops)
-{
- return draw(cr, aa, misaligned, cairo_fill,
- width, height, loops);
-}
-
-static cairo_time_t
-draw_rotated_aa (cairo_t *cr, int width, int height, int loops)
-{
- return draw(cr, aa, rotated, cairo_fill,
- width, height, loops);
-}
-
-static cairo_time_t
-draw_aligned_mono (cairo_t *cr, int width, int height, int loops)
-{
- return draw(cr, mono, aligned, cairo_fill,
- width, height, loops);
-}
-
-static cairo_time_t
-draw_misaligned_mono (cairo_t *cr, int width, int height, int loops)
-{
- return draw(cr, mono, misaligned, cairo_fill,
- width, height, loops);
-}
-
-static cairo_time_t
-draw_rotated_mono (cairo_t *cr, int width, int height, int loops)
-{
- return draw(cr, mono, rotated, cairo_fill,
- width, height, loops);
-}
-
-#define F(name, op,transform,aa) \
-static cairo_time_t \
-draw_##name (cairo_t *cr, int width, int height, int loops) \
-{ return draw(cr, (aa), (transform), (op), width, height, loops); }
-
-F(clip_aligned, clip, aligned, aa)
-F(clip_misaligned, clip, misaligned, aa)
-F(clip_rotated, clip, rotated, aa)
-F(clip_aligned_mono, clip, aligned, mono)
-F(clip_misaligned_mono, clip, misaligned, mono)
-F(clip_rotated_mono, clip, rotated, mono)
-
-F(clip_alpha_aligned, clip_alpha, aligned, aa)
-F(clip_alpha_misaligned, clip_alpha, misaligned, aa)
-F(clip_alpha_rotated, clip_alpha, rotated, aa)
-F(clip_alpha_aligned_mono, clip_alpha, aligned, mono)
-F(clip_alpha_misaligned_mono, clip_alpha, misaligned, mono)
-F(clip_alpha_rotated_mono, clip_alpha, rotated, mono)
-
-cairo_bool_t
-hatching_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "hatching", NULL);
-}
-
-void
-hatching (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_run (perf, "hatching-aligned-aa", draw_aligned_aa, NULL);
- cairo_perf_run (perf, "hatching-misaligned-aa", draw_misaligned_aa, NULL);
- cairo_perf_run (perf, "hatching-rotated-aa", draw_rotated_aa, NULL);
- cairo_perf_run (perf, "hatching-aligned-mono", draw_aligned_mono, NULL);
- cairo_perf_run (perf, "hatching-misaligned-mono", draw_misaligned_mono, NULL);
- cairo_perf_run (perf, "hatching-rotated-mono", draw_rotated_mono, NULL);
-
- cairo_perf_run (perf, "hatching-clip-aligned-aa", draw_clip_aligned, NULL);
- cairo_perf_run (perf, "hatching-clip-misaligned-aa", draw_clip_misaligned, NULL);
- cairo_perf_run (perf, "hatching-clip-rotated-aa", draw_clip_rotated, NULL);
- cairo_perf_run (perf, "hatching-clip-aligned-mono", draw_clip_aligned_mono, NULL);
- cairo_perf_run (perf, "hatching-clip-misaligned-mono", draw_clip_misaligned_mono, NULL);
- cairo_perf_run (perf, "hatching-clip-rotated-mono", draw_clip_rotated_mono, NULL);
-
- cairo_perf_run (perf, "hatching-clip-alpha-aligned-aa", draw_clip_alpha_aligned, NULL);
- cairo_perf_run (perf, "hatching-clip-alpha-misaligned-aa", draw_clip_alpha_misaligned, NULL);
- cairo_perf_run (perf, "hatching-clip-alpha-rotated-aa", draw_clip_alpha_rotated, NULL);
- cairo_perf_run (perf, "hatching-clip-alpha-aligned-mono", draw_clip_alpha_aligned_mono, NULL);
- cairo_perf_run (perf, "hatching-clip-alpha-misaligned-mono", draw_clip_alpha_misaligned_mono, NULL);
- cairo_perf_run (perf, "hatching-clip-alpha-rotated-mono", draw_clip_alpha_rotated_mono, NULL);
-}
diff --git a/perf/micro/intersections.c b/perf/micro/intersections.c
deleted file mode 100644
index 57931faf8..000000000
--- a/perf/micro/intersections.c
+++ /dev/null
@@ -1,160 +0,0 @@
-/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */
-/* cairo - a vector graphics library with display and print output
- *
- * Copyright (c) 2008 M Joonas Pihlaja
- *
- * 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.
- */
-#include "cairo-perf.h"
-
-#define NUM_SEGMENTS 256
-
-static unsigned state;
-static double
-uniform_random (double minval, double maxval)
-{
- static unsigned const poly = 0x9a795537U;
- unsigned n = 32;
- while (n-->0)
- state = 2*state < state ? (2*state ^ poly) : 2*state;
- return minval + state * (maxval - minval) / 4294967296.0;
-}
-
-static cairo_time_t
-draw_random (cairo_t *cr, cairo_fill_rule_t fill_rule,
- int width, int height, int loops)
-{
- double x[NUM_SEGMENTS];
- double y[NUM_SEGMENTS];
- int i;
-
- cairo_save (cr);
- cairo_set_source_rgb (cr, 0, 0, 0);
- cairo_paint (cr);
-
- for (i = 0; i < NUM_SEGMENTS; i++) {
- x[i] = uniform_random (0, width);
- y[i] = uniform_random (0, height);
- }
-
- state = 0x12345678;
- cairo_translate (cr, 1, 1);
- cairo_set_fill_rule (cr, fill_rule);
- cairo_set_source_rgb (cr, 1, 0, 0);
-
- cairo_new_path (cr);
- cairo_move_to (cr, 0, 0);
- for (i = 0; i < NUM_SEGMENTS; i++)
- cairo_line_to (cr, x[i], y[i]);
- cairo_close_path (cr);
-
- cairo_perf_timer_start ();
- while (loops--)
- cairo_fill_preserve (cr);
- cairo_perf_timer_stop ();
-
- cairo_restore (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-draw_random_curve (cairo_t *cr, cairo_fill_rule_t fill_rule,
- int width, int height, int loops)
-{
- double x[3*NUM_SEGMENTS];
- double y[3*NUM_SEGMENTS];
- int i;
-
- cairo_save (cr);
- cairo_set_source_rgb (cr, 0, 0, 0);
- cairo_paint (cr);
-
- for (i = 0; i < 3*NUM_SEGMENTS; i++) {
- x[i] = uniform_random (0, width);
- y[i] = uniform_random (0, height);
- }
-
- state = 0x12345678;
- cairo_translate (cr, 1, 1);
- cairo_set_fill_rule (cr, fill_rule);
- cairo_set_source_rgb (cr, 1, 0, 0);
-
- cairo_new_path (cr);
- cairo_move_to (cr, 0, 0);
- for (i = 0; i < NUM_SEGMENTS; i++) {
- cairo_curve_to (cr,
- x[3*i+0], y[3*i+0],
- x[3*i+1], y[3*i+1],
- x[3*i+2], y[3*i+2]);
- }
- cairo_close_path (cr);
-
- cairo_perf_timer_start ();
- while (loops--)
- cairo_fill_preserve (cr);
- cairo_perf_timer_stop ();
-
- cairo_restore (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-random_eo (cairo_t *cr, int width, int height, int loops)
-{
- return draw_random (cr, CAIRO_FILL_RULE_EVEN_ODD, width, height, loops);
-}
-
-static cairo_time_t
-random_nz (cairo_t *cr, int width, int height, int loops)
-{
- return draw_random (cr, CAIRO_FILL_RULE_WINDING, width, height, loops);
-}
-
-static cairo_time_t
-random_curve_eo (cairo_t *cr, int width, int height, int loops)
-{
- return draw_random_curve (cr, CAIRO_FILL_RULE_EVEN_ODD, width, height, loops);
-}
-
-static cairo_time_t
-random_curve_nz (cairo_t *cr, int width, int height, int loops)
-{
- return draw_random_curve (cr, CAIRO_FILL_RULE_WINDING, width, height, loops);
-}
-
-cairo_bool_t
-intersections_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "intersections", NULL);
-}
-
-void
-intersections (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_run (perf, "intersections-nz-fill", random_nz, NULL);
- cairo_perf_run (perf, "intersections-eo-fill", random_eo, NULL);
-
- cairo_perf_run (perf, "intersections-nz-curve-fill", random_curve_nz, NULL);
- cairo_perf_run (perf, "intersections-eo-curve-fill", random_curve_eo, NULL);
-}
diff --git a/perf/micro/line.c b/perf/micro/line.c
deleted file mode 100644
index 3ed5f8dac..000000000
--- a/perf/micro/line.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Copyright © 2011 Intel Corporation
- *
- * 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.
- *
- * Author: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-
-static cairo_time_t
-horizontal (cairo_t *cr, int width, int height, int loops)
-{
- double h = height/2 + .5;
-
- cairo_move_to (cr, 0, h);
- cairo_line_to (cr, width, h);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-horizontal_hair (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return horizontal (cr, width, height, loops);
-}
-
-static cairo_time_t
-horizontal_wide (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return horizontal (cr, width, height, loops);
-}
-
-static cairo_time_t
-nearly_horizontal (cairo_t *cr, int width, int height, int loops)
-{
- double h = height/2;
-
- cairo_move_to (cr, 0, h);
- cairo_line_to (cr, width, h+1);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-nearly_horizontal_hair (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return nearly_horizontal (cr, width, height, loops);
-}
-
-static cairo_time_t
-nearly_horizontal_wide (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return nearly_horizontal (cr, width, height, loops);
-}
-
-
-static cairo_time_t
-vertical (cairo_t *cr, int width, int height, int loops)
-{
- double w = width/2 + .5;
-
- cairo_move_to (cr, w, 0);
- cairo_line_to (cr, w, height);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-vertical_hair (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return vertical (cr, width, height, loops);
-}
-
-static cairo_time_t
-vertical_wide (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return vertical (cr, width, height, loops);
-}
-
-static cairo_time_t
-nearly_vertical (cairo_t *cr, int width, int height, int loops)
-{
- double w = width/2;
-
- cairo_move_to (cr, w, 0);
- cairo_line_to (cr, w+1, height);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-nearly_vertical_hair (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return nearly_vertical (cr, width, height, loops);
-}
-
-static cairo_time_t
-nearly_vertical_wide (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return nearly_vertical (cr, width, height, loops);
-}
-
-
-static cairo_time_t
-diagonal (cairo_t *cr, int width, int height, int loops)
-{
- cairo_move_to (cr, 0, 0);
- cairo_line_to (cr, width, height);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-diagonal_hair (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return diagonal (cr, width, height, loops);
-}
-
-static cairo_time_t
-diagonal_wide (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return diagonal (cr, width, height, loops);
-}
-
-cairo_bool_t
-line_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "line", NULL);
-}
-
-void
-line (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_set_source_rgb (cr, 1., 1., 1.);
-
- cairo_perf_run (perf, "line-hh", horizontal_hair, NULL);
- cairo_perf_run (perf, "line-hw", horizontal_wide, NULL);
- cairo_perf_run (perf, "line-nhh", nearly_horizontal_hair, NULL);
- cairo_perf_run (perf, "line-nhw", nearly_horizontal_wide, NULL);
-
- cairo_perf_run (perf, "line-vh", vertical_hair, NULL);
- cairo_perf_run (perf, "line-vw", vertical_wide, NULL);
- cairo_perf_run (perf, "line-nvh", nearly_vertical_hair, NULL);
- cairo_perf_run (perf, "line-nvw", nearly_vertical_wide, NULL);
-
- cairo_perf_run (perf, "line-dh", diagonal_hair, NULL);
- cairo_perf_run (perf, "line-dw", diagonal_wide, NULL);
-}
diff --git a/perf/micro/long-dashed-lines.c b/perf/micro/long-dashed-lines.c
deleted file mode 100644
index ba66a4af4..000000000
--- a/perf/micro/long-dashed-lines.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */
-/*
- * Copyright © 2007 Mozilla Corporation
- *
- * 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.
- *
- * Author: Vladimir Vukicevic <vladimir@pobox.com>
- */
-
-#include "cairo-perf.h"
-
-static cairo_time_t
-do_long_dashed_lines (cairo_t *cr, int width, int height, int loops)
-{
- double dash[2] = { 2.0, 2.0 };
- int i;
-
- cairo_save (cr);
- cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
- cairo_paint (cr);
-
- cairo_set_source_rgb (cr, 1.0, 0.0, 0.0);
- cairo_set_dash (cr, dash, 2, 0.0);
-
- cairo_new_path (cr);
- cairo_set_line_width (cr, 1.0);
-
- for (i = 0; i < height-1; i++) {
- double y0 = (double) i + 0.5;
- cairo_move_to (cr, 0.0, y0);
- cairo_line_to (cr, width, y0);
- }
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_restore (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-long_dashed_lines_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "long-dashed-lines", NULL);
-}
-
-void
-long_dashed_lines (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_run (perf, "long-dashed-lines", do_long_dashed_lines, NULL);
-}
diff --git a/perf/micro/long-lines.c b/perf/micro/long-lines.c
deleted file mode 100644
index a0d134c2d..000000000
--- a/perf/micro/long-lines.c
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- *
- * 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.
- *
- * Author: Carl D. Worth <cworth@cworth.org>
- */
-
-#include "cairo-perf.h"
-
-/* This test case is designed to illustrate a performance bug in
- * drawing very long lines, where most of the line is out of bounds of
- * the destination surface, (but some portion of the line is
- * visibile). These results are in the "long-lines-uncropped" report.
- *
- * For comparison, this test also renders the visible portions of the
- * same lines, (this is the "long-lines-cropped" report).
- */
-
-typedef enum {
- LONG_LINES_CROPPED = 0x1,
- LONG_LINES_ONCE = 0x2,
-} long_lines_crop_t;
-#define NUM_LINES 20
-#define LONG_FACTOR 50.0
-
-static cairo_time_t
-do_long_lines (cairo_t *cr, int width, int height, int loops, long_lines_crop_t crop)
-{
- int i;
- double x, y, dx, dy, min_x, min_y, max_x, max_y;
- double outer_width, outer_height;
-
- cairo_save (cr);
-
- cairo_translate (cr, width / 2, height / 2);
-
- if (crop & LONG_LINES_CROPPED) {
- outer_width = width;
- outer_height = height;
- cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); /* green */
- } else {
- outer_width = LONG_FACTOR * width;
- outer_height = LONG_FACTOR * height;
- cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); /* red */
- }
-
- min_x = x = - outer_width / 2.0;
- min_y = y = - outer_height / 2.0;
- max_x = outer_width / 2.0;
- max_y = outer_height / 2.0;
- dx = outer_width / NUM_LINES;
- dy = outer_height / NUM_LINES;
-
- cairo_perf_timer_start ();
-
- while (loops--) {
- for (i = 0; i <= NUM_LINES; i++) {
- cairo_move_to (cr, 0, 0);
- cairo_line_to (cr, x, min_y);
- if ((crop & LONG_LINES_ONCE) == 0)
- cairo_stroke (cr);
-
- cairo_move_to (cr, 0, 0);
- cairo_line_to (cr, x, max_y);
- if ((crop & LONG_LINES_ONCE) == 0)
- cairo_stroke (cr);
-
- cairo_move_to (cr, 0, 0);
- cairo_line_to (cr, min_x, y);
- if ((crop & LONG_LINES_ONCE) == 0)
- cairo_stroke (cr);
-
- cairo_move_to (cr, 0, 0);
- cairo_line_to (cr, max_x, y);
- if ((crop & LONG_LINES_ONCE) == 0)
- cairo_stroke (cr);
-
- x += dx;
- y += dy;
- }
- if (crop & LONG_LINES_ONCE)
- cairo_stroke (cr);
- }
-
- cairo_perf_timer_stop ();
-
- cairo_restore (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-long_lines_uncropped (cairo_t *cr, int width, int height, int loops)
-{
- return do_long_lines (cr, width, height, loops, 0);
-}
-
-static cairo_time_t
-long_lines_uncropped_once (cairo_t *cr, int width, int height, int loops)
-{
- return do_long_lines (cr, width, height, loops, LONG_LINES_ONCE);
-}
-
-static cairo_time_t
-long_lines_cropped (cairo_t *cr, int width, int height, int loops)
-{
- return do_long_lines (cr, width, height, loops, LONG_LINES_CROPPED);
-}
-
-static cairo_time_t
-long_lines_cropped_once (cairo_t *cr, int width, int height, int loops)
-{
- return do_long_lines (cr, width, height, loops, LONG_LINES_CROPPED | LONG_LINES_ONCE);
-}
-
-cairo_bool_t
-long_lines_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "long-lines", NULL);
-}
-
-void
-long_lines (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_run (perf, "long-lines-uncropped", long_lines_uncropped, NULL);
- cairo_perf_run (perf, "long-lines-uncropped-once", long_lines_uncropped_once, NULL);
- cairo_perf_run (perf, "long-lines-cropped", long_lines_cropped, NULL);
- cairo_perf_run (perf, "long-lines-cropped-once", long_lines_cropped_once, NULL);
-}
diff --git a/perf/micro/many-curves.c b/perf/micro/many-curves.c
deleted file mode 100644
index f985d349a..000000000
--- a/perf/micro/many-curves.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright © 2011 Intel Corporation
- *
- * 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.
- *
- * Author: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-
-static uint32_t state;
-
-static double
-uniform_random (double minval, double maxval)
-{
- static uint32_t const poly = 0x9a795537U;
- uint32_t n = 32;
- while (n-->0)
- state = 2*state < state ? (2*state ^ poly) : 2*state;
- return minval + state * (maxval - minval) / 4294967296.0;
-}
-
-static cairo_time_t
-do_many_curves_stroked (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- state = 0xc0ffee;
- cairo_move_to (cr, uniform_random (0, width), uniform_random (0, height));
- for (count = 0; count < 1000; count++) {
- double x1 = uniform_random (0, width);
- double x2 = uniform_random (0, width);
- double x3 = uniform_random (0, width);
- double y1 = uniform_random (0, height);
- double y2 = uniform_random (0, height);
- double y3 = uniform_random (0, height);
- cairo_curve_to (cr, x1, y1, x2, y2, x3, y3);
- }
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_many_curves_hair_stroked (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 1.);
- return do_many_curves_stroked (cr, width, height, loops);
-}
-
-static cairo_time_t
-do_many_curves_wide_stroked (cairo_t *cr, int width, int height, int loops)
-{
- cairo_set_line_width (cr, 5.);
- return do_many_curves_stroked (cr, width, height, loops);
-}
-
-static cairo_time_t
-do_many_curves_filled (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- double x0 = uniform_random (0, width);
- double x1 = uniform_random (0, width);
- double x2 = uniform_random (0, width);
- double x3 = uniform_random (0, width);
- double xm = uniform_random (0, width);
- double xn = uniform_random (0, width);
- double y0 = uniform_random (0, height);
- double y1 = uniform_random (0, height);
- double y2 = uniform_random (0, height);
- double y3 = uniform_random (0, height);
- double ym = uniform_random (0, height);
- double yn = uniform_random (0, height);
- cairo_move_to (cr, xm, ym);
- cairo_curve_to (cr, x1, y1, x2, y2, xn, yn);
- cairo_curve_to (cr, x3, y3, x0, y0, xm, ym);
- cairo_close_path (cr);
- }
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-many_curves_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "many-curves", NULL);
-}
-
-void
-many_curves (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_set_source_rgb (cr, 1., 1., 1.);
-
- cairo_perf_run (perf, "many-curves-hair-stroked", do_many_curves_hair_stroked, NULL);
- cairo_perf_run (perf, "many-curves-wide-stroked", do_many_curves_wide_stroked, NULL);
- cairo_perf_run (perf, "many-curves-filled", do_many_curves_filled, NULL);
-}
diff --git a/perf/micro/many-fills.c b/perf/micro/many-fills.c
deleted file mode 100644
index 9d3fd6435..000000000
--- a/perf/micro/many-fills.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright © 2011 Intel Corporation
- *
- * 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.
- *
- * Author: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-
-/* This is a variant on many strokes where we precompute
- * a simplified stroke-to-path.
- * When we have a real stroke-to-path, it would useful to compare the cost
- * of stroking vs filling the "identical" paths.
- */
-
-#include "cairo-perf.h"
-
-static uint32_t state;
-
-static double
-uniform_random (double minval, double maxval)
-{
- static uint32_t const poly = 0x9a795537U;
- uint32_t n = 32;
- while (n-->0)
- state = 2*state < state ? (2*state ^ poly) : 2*state;
- return minval + state * (maxval - minval) / 4294967296.0;
-}
-
-static cairo_time_t
-do_many_fills_ha (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- double y = floor (uniform_random (0, height));
- double x = floor (uniform_random (0, width));
- cairo_rectangle (cr, x, y, ceil (uniform_random (0, width)) - x, 1);
- }
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_many_fills_h (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- double y = uniform_random (0, height);
- double x = uniform_random (0, width);
- cairo_rectangle (cr, x, y, uniform_random (0, width) - x, 1);
- }
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_many_fills_va (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- double x = floor (uniform_random (0, width));
- double y = floor (uniform_random (0, height));
- cairo_rectangle (cr, x, y, 1, ceil (uniform_random (0, height) - y));
- }
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_many_fills_v (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- double x = uniform_random (0, width);
- double y = uniform_random (0, height);
- cairo_rectangle (cr, x, y, 1, uniform_random (0, height) - y);
- }
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_many_fills (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- /* lots and lots of overlapping stroke-like fills */
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- cairo_save (cr);
- cairo_translate (cr,
- uniform_random (0, width),
- uniform_random (0, height));
- cairo_rotate (cr, uniform_random (-M_PI,M_PI));
- cairo_rectangle (cr, 0, 0, uniform_random (0, width), 1);
- cairo_restore (cr);
- }
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_fill_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-many_fills_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "many-fills", NULL);
-}
-
-void
-many_fills (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_run (perf, "many-fills-halign", do_many_fills_ha, NULL);
- cairo_perf_run (perf, "many-fills-valign", do_many_fills_va, NULL);
- cairo_perf_run (perf, "many-fills-horizontal", do_many_fills_h, NULL);
- cairo_perf_run (perf, "many-fills-vertical", do_many_fills_v, NULL);
- cairo_perf_run (perf, "many-fills-random", do_many_fills, NULL);
-}
diff --git a/perf/micro/many-strokes.c b/perf/micro/many-strokes.c
deleted file mode 100644
index 9aeb393de..000000000
--- a/perf/micro/many-strokes.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright © 2011 Intel Corporation
- *
- * 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.
- *
- * Author: Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-
-static uint32_t state;
-
-static double
-uniform_random (double minval, double maxval)
-{
- static uint32_t const poly = 0x9a795537U;
- uint32_t n = 32;
- while (n-->0)
- state = 2*state < state ? (2*state ^ poly) : 2*state;
- return minval + state * (maxval - minval) / 4294967296.0;
-}
-
-static cairo_time_t
-do_many_strokes_ha (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- double h = floor (uniform_random (0, height)) + .5;
- cairo_move_to (cr, floor (uniform_random (0, width)), h);
- cairo_line_to (cr, ceil (uniform_random (0, width)), h);
- }
-
- cairo_set_line_width (cr, 1.);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_many_strokes_h (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- double h = uniform_random (0, height);
- cairo_move_to (cr, uniform_random (0, width), h);
- cairo_line_to (cr, uniform_random (0, width), h);
- }
-
- cairo_set_line_width (cr, 1.);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_many_strokes_va (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- double v = floor (uniform_random (0, width)) + .5;
- cairo_move_to (cr, v, floor (uniform_random (0, height)));
- cairo_line_to (cr, v, ceil (uniform_random (0, height)));
- }
-
- cairo_set_line_width (cr, 1.);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_many_strokes_v (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- double v = uniform_random (0, width);
- cairo_move_to (cr, v, uniform_random (0, height));
- cairo_line_to (cr, v, uniform_random (0, height));
- }
-
- cairo_set_line_width (cr, 1.);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_many_strokes (cairo_t *cr, int width, int height, int loops)
-{
- int count;
-
- /* lots and lots of overlapping strokes */
- state = 0xc0ffee;
- for (count = 0; count < 1000; count++) {
- cairo_line_to (cr,
- uniform_random (0, width),
- uniform_random (0, height));
- }
-
- cairo_set_line_width (cr, 1.);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_stroke_preserve (cr);
-
- cairo_perf_timer_stop ();
-
- cairo_new_path (cr);
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-many_strokes_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "many-strokes", NULL);
-}
-
-void
-many_strokes (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_run (perf, "many-strokes-halign", do_many_strokes_ha, NULL);
- cairo_perf_run (perf, "many-strokes-valign", do_many_strokes_va, NULL);
- cairo_perf_run (perf, "many-strokes-horizontal", do_many_strokes_h, NULL);
- cairo_perf_run (perf, "many-strokes-vertical", do_many_strokes_v, NULL);
- cairo_perf_run (perf, "many-strokes-random", do_many_strokes, NULL);
-}
diff --git a/perf/micro/mask.c b/perf/micro/mask.c
deleted file mode 100644
index 11a3ba730..000000000
--- a/perf/micro/mask.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright © 2006 Red Hat, Inc.
- * Copyright © 2009 Chris Wilson
- *
- * Permission to use, copy, modify, distribute, and sell this software
- * and its documentation for any purpose is hereby granted without
- * fee, provided that the above copyright notice appear in all copies
- * and that both that copyright notice and this permission notice
- * appear in supporting documentation, and that the name of
- * Red Hat, Inc. not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior
- * permission. Red Hat, Inc. makes no representations about the
- * suitability of this software for any purpose. It is provided "as
- * is" without express or implied warranty.
- *
- * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
- * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * Author: Carl D. Worth <cworth@cworth.org>
- * Chris Wilson <chris@chris-wilson.co.uk>
- */
-
-#include "cairo-perf.h"
-
-static cairo_time_t
-do_mask_solid (cairo_t *cr, int width, int height, int loops)
-{
- cairo_pattern_t *mask;
-
- mask = cairo_pattern_create_rgba (0, 0, 0, .5);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_mask (cr, mask);
-
- cairo_perf_timer_stop ();
-
- cairo_pattern_destroy (mask);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_surface_t *
-init_surface (cairo_surface_t *surface, int width, int height)
-{
- cairo_t *cr;
-
- cr = cairo_create (surface);
- cairo_surface_destroy (surface);
-
- cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
- cairo_set_source_rgb (cr, 0, 0, 0); /* back */
- cairo_paint (cr);
-
- cairo_set_source_rgba (cr, 1, 1, 1, 0.5); /* 50% */
- cairo_new_path (cr);
- cairo_rectangle (cr, 0, 0, width/2.0, height/2.0);
- cairo_rectangle (cr, width/2.0, height/2.0, width/2.0, height/2.0);
- cairo_fill (cr);
-
- surface = cairo_surface_reference (cairo_get_target (cr));
- cairo_destroy (cr);
-
- return surface;
-}
-
-static cairo_time_t
-do_mask_image (cairo_t *cr, int width, int height, int loops)
-{
- cairo_surface_t *surface;
- cairo_pattern_t *mask;
-
- surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height);
- mask = cairo_pattern_create_for_surface (init_surface (surface,
- width,
- height));
- cairo_surface_destroy (surface);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_mask (cr, mask);
-
- cairo_perf_timer_stop ();
-
- cairo_pattern_destroy (mask);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_mask_image_half (cairo_t *cr, int width, int height, int loops)
-{
- cairo_surface_t *surface;
- cairo_pattern_t *mask;
- cairo_matrix_t matrix;
-
- surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height);
- mask = cairo_pattern_create_for_surface (init_surface (surface,
- width,
- height));
- cairo_surface_destroy (surface);
- cairo_matrix_init_scale (&matrix, .5, .5);
- cairo_pattern_set_matrix (mask, &matrix);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_mask (cr, mask);
-
- cairo_perf_timer_stop ();
-
- cairo_pattern_destroy (mask);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_mask_image_double (cairo_t *cr, int width, int height, int loops)
-{
- cairo_surface_t *surface;
- cairo_pattern_t *mask;
- cairo_matrix_t matrix;
-
- surface = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height);
- mask = cairo_pattern_create_for_surface (init_surface (surface,
- width,
- height));
- cairo_surface_destroy (surface);
- cairo_matrix_init_scale (&matrix, 2., 2.);
- cairo_pattern_set_matrix (mask, &matrix);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_mask (cr, mask);
-
- cairo_perf_timer_stop ();
-
- cairo_pattern_destroy (mask);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_mask_similar (cairo_t *cr, int width, int height, int loops)
-{
- cairo_surface_t *surface;
- cairo_pattern_t *mask;
-
- surface = cairo_surface_create_similar (cairo_get_group_target (cr),
- CAIRO_CONTENT_ALPHA, width, height);
- mask = cairo_pattern_create_for_surface (init_surface (surface,
- width,
- height));
- cairo_surface_destroy (surface);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_mask (cr, mask);
-
- cairo_perf_timer_stop ();
-
- cairo_pattern_destroy (mask);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_mask_similar_half (cairo_t *cr, int width, int height, int loops)
-{
- cairo_surface_t *surface;
- cairo_pattern_t *mask;
- cairo_matrix_t matrix;
-
- surface = cairo_surface_create_similar (cairo_get_group_target (cr),
- CAIRO_CONTENT_ALPHA, width, height);
- mask = cairo_pattern_create_for_surface (init_surface (surface,
- width,
- height));
- cairo_surface_destroy (surface);
- cairo_matrix_init_scale (&matrix, .5, .5);
- cairo_pattern_set_matrix (mask, &matrix);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_mask (cr, mask);
-
- cairo_perf_timer_stop ();
-
- cairo_pattern_destroy (mask);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_mask_similar_double (cairo_t *cr, int width, int height, int loops)
-{
- cairo_surface_t *surface;
- cairo_pattern_t *mask;
- cairo_matrix_t matrix;
-
- surface = cairo_surface_create_similar (cairo_get_group_target (cr),
- CAIRO_CONTENT_ALPHA, width, height);
- mask = cairo_pattern_create_for_surface (init_surface (surface,
- width,
- height));
- cairo_surface_destroy (surface);
- cairo_matrix_init_scale (&matrix, 2., 2.);
- cairo_pattern_set_matrix (mask, &matrix);
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_mask (cr, mask);
-
- cairo_perf_timer_stop ();
-
- cairo_pattern_destroy (mask);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_mask_linear (cairo_t *cr, int width, int height, int loops)
-{
- cairo_pattern_t *mask;
-
- mask = cairo_pattern_create_linear (0.0, 0.0, width, height);
- cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 0.5); /* 50% */
- cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 1.0); /* 100% */
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_mask (cr, mask);
-
- cairo_perf_timer_stop ();
-
- cairo_pattern_destroy (mask);
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-do_mask_radial (cairo_t *cr, int width, int height, int loops)
-{
- cairo_pattern_t *mask;
-
- mask = cairo_pattern_create_radial (width/2.0, height/2.0, 0.0,
- width/2.0, height/2.0, width/2.0);
- cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 0.5); /* 50% */
- cairo_pattern_add_color_stop_rgba (mask, 0.0, 0, 0, 0, 1.0); /* 100% */
-
- cairo_perf_timer_start ();
-
- while (loops--)
- cairo_mask (cr, mask);
-
- cairo_perf_timer_stop ();
-
- cairo_pattern_destroy (mask);
-
- return cairo_perf_timer_elapsed ();
-}
-
-cairo_bool_t
-mask_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "mask", NULL);
-}
-
-void
-mask (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- if (! cairo_perf_can_run (perf, "mask", NULL))
- return;
-
- cairo_perf_cover_sources_and_operators (perf, "mask-solid",
- do_mask_solid, NULL);
- cairo_perf_cover_sources_and_operators (perf, "mask-image",
- do_mask_image, NULL);
- cairo_perf_cover_sources_and_operators (perf, "mask-image-half",
- do_mask_image_half, NULL);
- cairo_perf_cover_sources_and_operators (perf, "mask-image-double",
- do_mask_image_double, NULL);
- cairo_perf_cover_sources_and_operators (perf, "mask-similar",
- do_mask_similar, NULL);
- cairo_perf_cover_sources_and_operators (perf, "mask-similar-half",
- do_mask_similar_half, NULL);
- cairo_perf_cover_sources_and_operators (perf, "mask-similar-double",
- do_mask_similar_double, NULL);
- cairo_perf_cover_sources_and_operators (perf, "mask-linear",
- do_mask_linear, NULL);
- cairo_perf_cover_sources_and_operators (perf, "mask-radial",
- do_mask_radial, NULL);
-}
diff --git a/perf/micro/mosaic.c b/perf/micro/mosaic.c
deleted file mode 100644
index ed30ae555..000000000
--- a/perf/micro/mosaic.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright © 2006 Joonas Pihlaja
- *
- * 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.
- *
- * Author: Joonas Pihlaja <jpihlaja@cc.helsinki.fi>
- */
-#include "cairo-perf.h"
-
-/* Options passed in flags to mosaic_perform(): */
-#define MOSAIC_FILL 1 /* do rasterise */
-#define MOSAIC_TESSELLATE 0 /* just tessellate */
-#define MOSAIC_CURVE_TO 2 /* use curve bounded regions */
-#define MOSAIC_LINE_TO 0 /* use line bounded regions */
-
-struct mosaic_region {
- unsigned rgb; /* colour of this region in 0xRRGGBB format */
- unsigned ncurves; /* number of boundary curves. */
-};
-
-struct mosaic_region_iter {
- int do_curves;
- struct mosaic_region const *region;
- double const *points;
-};
-
-#include "mosaic.h"
-
-static void
-mosaic_region_iter_init (struct mosaic_region_iter *iter, int do_curves)
-{
- iter->region = mosaic_regions;
- iter->points = mosaic_curve_points;
- iter->do_curves = do_curves;
-}
-
-/* Create the next closed region as a path. */
-static int
-mosaic_next_path (cairo_t *cr, struct mosaic_region_iter *iter)
-{
- double const *points = iter->points;
- unsigned i;
- unsigned ncurves = iter->region->ncurves;
- if (0 == ncurves) {
- return 0;
- }
-
- cairo_new_path (cr);
- cairo_move_to (cr, points[0], points[1]);
- points += 2;
- for (i=0; i < ncurves; i++, points += 6) {
- if (iter->do_curves) {
- cairo_curve_to (cr,
- points[0], points[1],
- points[2], points[3],
- points[4], points[5]);
- }
- else {
- cairo_line_to (cr,
- points[4], points[5]);
- }
- }
- cairo_close_path (cr);
- {
- unsigned rgb = iter->region->rgb;
- double r = ((rgb >> 16) & 255) / 255.0;
- double g = ((rgb >> 8) & 255) / 255.0;
- double b = ((rgb >> 0) & 255) / 255.0;
- cairo_set_source_rgb (cr, r, g, b);
- }
-
- iter->points = iter->points + 2*(1 + 3*iter->region->ncurves);
- iter->region++;
- return 1;
-}
-
-static cairo_time_t
-mosaic_perform(cairo_t *cr, unsigned flags, int width, int height, int loops)
-{
- struct mosaic_region_iter iter;
-
- /* Scale to fit the window.*/
- double minx = -40.7;
- double maxx = 955.1;
- double miny = -88.4;
- double maxy = 884.5;
-
- cairo_identity_matrix (cr);
-
- if (flags & MOSAIC_FILL) {
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_rectangle (cr, 0, 0, width, height);
- cairo_fill (cr);
- }
-
- cairo_scale (cr, width / (maxx - minx) , height / (maxy - miny));
- cairo_translate (cr, -minx, -miny);
-
- /* Iterate over all closed regions in the mosaic filling or
- * tessellating them as dictated by the flags. */
-
- cairo_perf_timer_start ();
- while (loops--) {
- mosaic_region_iter_init (&iter, flags & MOSAIC_CURVE_TO);
- while (mosaic_next_path (cr, &iter)) {
- if (flags & MOSAIC_FILL) {
- cairo_fill (cr);
- }
- else {
- double x, y;
- cairo_get_current_point (cr, &x, &y);
- cairo_in_fill (cr, x, y);
- }
- }
- }
- cairo_perf_timer_stop ();
-
- return cairo_perf_timer_elapsed ();
-}
-
-static cairo_time_t
-mosaic_fill_curves (cairo_t *cr, int width, int height, int loops)
-{
- return mosaic_perform (cr, MOSAIC_FILL | MOSAIC_CURVE_TO, width, height, loops);
-}
-
-static cairo_time_t
-mosaic_fill_lines (cairo_t *cr, int width, int height, int loops)
-{
- return mosaic_perform (cr, MOSAIC_FILL | MOSAIC_LINE_TO, width, height, loops);
-}
-
-static cairo_time_t
-mosaic_tessellate_lines (cairo_t *cr, int width, int height, int loops)
-{
- return mosaic_perform (cr, MOSAIC_TESSELLATE | MOSAIC_LINE_TO, width, height, loops);
-}
-
-static cairo_time_t
-mosaic_tessellate_curves (cairo_t *cr, int width, int height, int loops)
-{
- return mosaic_perform (cr, MOSAIC_TESSELLATE | MOSAIC_CURVE_TO, width, height, loops);
-}
-
-cairo_bool_t
-mosaic_enabled (cairo_perf_t *perf)
-{
- return cairo_perf_can_run (perf, "mosaic", NULL);
-}
-
-void
-mosaic (cairo_perf_t *perf, cairo_t *cr, int width, int height)
-{
- cairo_perf_run (perf, "mosaic-fill-curves", mosaic_fill_curves, NULL);
- cairo_perf_run (perf, "mosaic-fill-lines", mosaic_fill_lines, NULL);
- cairo_perf_run (perf, "mosaic-tessellate-curves", mosaic_tessellate_curves, NULL);
- cairo_perf_run (perf, "mosaic-tessellate-lines", mosaic_tessellate_lines, NULL);
-}
diff --git a/perf/micro/mosaic.h b/perf/micro/mosaic.h
deleted file mode 100644
index e106864a3..000000000
--- a/perf/micro/mosaic.h
+++ /dev/null
@@ -1,4387 +0,0 @@
-/* Synthesised data. */
-static struct mosaic_region const mosaic_regions[] = {
-{0xef55b4,7},{0xf93bc6,11},{0xf28085,5},{0x92acbc,7},
-{0x85c3b1,7},{0xc3bc79,5},{0xd09d8d,5},{0xa788cb,8},
-{0xeff90f,14},{0x976ef2,4},{0xf230d8,5},{0xe226ef,6},
-{0xf49571,9},{0xcb6cc1,4},{0xc8af80,5},{0xf71ce7,8},
-{0xd38b9a,6},{0xf70ff2,8},{0xec907e,4},{0xf44abc,5},
-{0xf42bd8,7},{0xcbbc71,5},{0xf7a45f,5},{0xb15aec,3},
-{0xfc6995,9},{0x42bef9,7},{0x83afc6,5},{0xbe9f9a,6},
-{0x95ef76,6},{0xfcc33b,20},{0xbc5ae2,5},{0x69f997,7},
-{0x9f69f2,7},{0x79bec3,7},{0xda3de2,6},{0x76dda7,6},
-{0xc888aa,7},{0xd871b1,9},{0xda29f7,14},{0xe03dda,9},
-{0xec29e2,5},{0xd82bf4,6},{0x8b8de2,6},{0xf7af52,3},
-{0x9f69f2,7},{0xf46c9a,9},{0xf74fb1,5},{0x21eaef,9},
-{0xea769a,8},{0x0feffc,5},{0xdada45,8},{0xafce7b,6},
-{0x48bef4,6},{0x9a79e5,3},{0xe2fc1c,7},{0xc3be76,9},
-{0xb9c37e,5},{0xc6b183,10},{0xa2acac,3},{0xc395a2,4},
-{0xbc88b4,7},{0xeaf41c,5},{0xea24ea,4},{0xd038f2,5},
-{0x5ae2bc,9},{0xdac15f,8},{0x5fe5b4,6},{0xce5ad3,15},
-{0xf419ec,4},{0xa7bc97,11},{0xea4ac3,6},{0xd02ef9,5},
-{0xb995aa,5},{0xef808b,6},{0xe22bea,34},{0xe24fc6,4},
-{0xef12f9,7},{0x7b9de0,8},{0x85ec85,4},{0xfc7e80,12},
-{0x9a85d8,5},{0xfc00fc,7},{0x9d90ce,5},{0xf4be45,9},
-{0xe5e52e,3},{0xfc0cef,7},{0xd83be5,8},{0x4dc6e5,5},
-{0xacda73,9},{0x4fc8e0,6},{0xbc88b6,4},{0xb4bc8b,6},
-{0xec45c6,8},{0x71d3b6,4},{0xe73dd5,5},{0x21fcda,4},
-{0xe055c6,9},{0x3becd0,8},{0x57e0c1,5},{0x71bec8,9},
-{0x8be28b,4},{0x4dddd0,9},{0xda9a85,6},{0xaa6ce2,4},
-{0x5ad5cb,9},{0x67f49d,12},{0xfc07f7,9},{0x42c8ec,16},
-{0xefc148,4},{0xda6eb1,7},{0x55bee7,4},{0xd33bea,6},
-{0x809fd8,14},{0xd82ef2,4},{0x21ddfc,5},{0x83e097,7},
-{0x8bcba2,9},{0xd864bc,8},{0xa7d87b,6},{0xc3a78d,6},
-{0xb9a79a,8},{0xd59590,3},{0xfc0af2,6},{0xe52be7,7},
-{0xce52d8,5},{0xe22bea,4},{0xe719f7,5},{0x909fcb,3},
-{0xa7da76,6},{0xdd38e5,4},{0xfc55aa,6},{0x19f2ef,6},
-{0x83da9d,5},{0x9fc892,6},{0xe51ef4,9},{0xce3dec,5},
-{0xea3dd0,7},{0x4ad3dd,6},{0x6ea2e7,5},{0xf92bd3,4},
-{0xc34aea,8},{0x2eddef,4},{0xe7799a,8},{0xe5799a,11},
-{0xe224f2,3},{0xf90af7,6},{0x61a2f4,6},{0xb67ec6,13},
-{0xe75cb4,7},{0xfcb945,16},{0xd3b173,7},{0xfc00fc,6},
-{0xd5ef33,5},{0x699df4,9},{0xf707f9,4},{0xdaea33,6},
-{0xe2dd38,3},{0xf2d036,5},{0xf248c1,6},{0xeaf21c,5},
-{0xec40cb,7},{0xf24abc,5},{0xf42bd8,4},{0xa757f9,5},
-{0xd02ef9,6},{0xfc0cf2,7},{0xb16cda,5},{0xea36d8,8},
-{0xd036f4,7},{0xb648fc,3},{0xea4dc1,4},{0x64c8cb,7},
-{0xfc05f7,3},{0xfc00fc,4},{0xf4a75f,6},{0xc85ad5,5},
-{0xd873ac,5},{0xd5a77b,11},{0xe7c84a,4},{0xec19f4,7},
-{0xc864ce,7},{0xcece5c,5},{0xe08b8d,5},{0xd84dd3,3},
-{0x07f9f7,9},{0x5cefac,3},{0xfc02f9,4},{0xd048e0,8},
-{0xef55b6,4},{0xa269ec,7},{0xec12f9,3},{0xd380a4,11},
-{0x5fcbd0,6},{0x90c1a7,5},{0x95dd85,5},{0xceda4f,9},
-{0x4fb9f2,14},{0xb65aea,7},{0xea838d,5},{0xf917ea,4},
-{0xc833fc,9},{0xe252c3,9},{0xef0ffc,7},{0x1cf2ec,9},
-{0x9f6cef,4},{0xf73dc6,12},{0x90b6b4,5},{0xb44ff7,7},
-{0xea2be2,12},{0xd02efc,17},{0xa276e2,4},{0x79c1c1,3},
-{0xc855dd,9},{0xb1d571,8},{0xb645fc,6},{0xd03bef,6},
-{0x42eccb,9},{0xea67aa,5},{0x9079ef,6},{0x9de773,7},
-{0xe55abc,6},{0xf421e5,3},{0x5cf9a4,6},{0xc373c1,5},
-{0x5fe2b6,4},{0xea24ec,6},{0x9af967,4},{0xf7be45,5},
-{0xd333f4,5},{0xc6d061,8},{0xb96cd3,8},{0xda64b9,6},
-{0xe79779,4},{0xac67e7,6},{0xcb67c8,4},{0xa45cf7,3},
-{0xd3859f,3},{0xd857c8,4},{0x42c1f7,8},{0xaf61e7,6},
-{0xea14fc,6},{0xda33ea,10},{0x5af2af,5},{0xbe40f9,3},
-{0x9de773,3},{0xe72be5,4},{0x4ae7c6,5},{0xaa88c8,8},
-{0x36f9cb,3},{0xc1a790,8},{0xf905fc,5},{0xbcaa95,6},
-{0x839dda,3},{0xfc00fc,6},{0xb6d86c,3},{0xdd40da,6},
-{0xb46cda,7},{0x839fd5,4},{0xc167d3,13},{0xf20ff7,9},
-{0xe024f4,9},{0xf41ee5,4},{0x909ad0,10},{0xb1d376,8},
-{0xce2efc,5},{0x29d5f9,7},{0xd0b96e,6},{0xdd69b4,5},
-{0xfc05f7,5},{0xdd26f7,4},{0xea1eef,6},{0xb64df7,9},
-{0x21e5f2,3},{0x4fd8d0,6},{0xd345e0,7},{0xfc00fc,3},
-{0xe569ac,5},{0xecb655,11},{0xfc5aa2,9},{0xb4d571,7},
-{0xaa57f7,6},{0xfc00fc,7},{0xe729ea,10},{0xea24ea,11},
-{0xb14df9,5},{0xf707fc,7},{0x5cd8c3,5},{0xea17f9,9},
-{0xc3d364,6},{0xa77ed3,4},{0x9569f9,8},{0x0ff4f4,4},
-{0xbc9aa4,7},{0xc140f7,10},{0xf705fc,8},{0xb44df9,4},
-{0xa479dd,5},{0xf705fc,5},{0xce8d9d,5},{0xf905f9,5},
-{0xdd2bef,7},{0xea14f9,5},{0xddbc61,5},{0xc13dfc,8},
-{0x79c8b6,10},{0xf79a67,6},{0xb4a79f,12},{0x97a7bc,7},
-{0xb9c17e,4},{0xf430d5,3},{0x2ee0ea,7},{0xf919e7,4},
-{0xeada33,9},{0xa2da7e,7},{0x8bec80,6},{0xf412f4,5},
-{0xa767ec,3},{0xd824fc,7},{0xe224f2,3},{0xfc07f7,4},
-{0xfc00fc,3},{0xe55cb6,8},{0xf9768b,7},{0xe5b45f,3},
-{0xd5978b,4},{0xf917e7,5},{0xf70ff4,7},{0x95e283,6},
-{0xb4b98d,5},{0xc83bf4,8},{0x9f88d3,7},{0xa473e0,9},
-{0x9569fc,10},{0x926cf9,7},{0xef14f4,7},{0xf7679a,4},
-{0xaa80ce,9},{0x45f9b9,5},{0xb4a2a2,10},{0xac88c6,5},
-{0xe75ab6,6},{0xa2fc5a,3},{0xc65cd8,7},{0x64e0b6,5},
-{0xfc6992,7},{0xf717ec,4},{0xf438ce,10},{0xf755ac,4},
-{0xf7aa57,6},{0xb9b688,3},{0xcb4de2,4},{0xf9f70a,9},
-{0x92d392,8},{0xef2be0,7},{0x92a7be,4},{0xa276e2,4},
-{0xc34fe5,5},{0xd5c164,9},{0xf219ec,4},{0xef5aaf,8},
-{0xa7c68d,6},{0xd369bc,7},{0xf912ef,4},{0xb9b48b,6},
-{0x3bc6f9,6},{0xe54ac8,5},{0xf71ce7,9},{0xbc4def,8},
-{0xe271a7,3},{0xcbc16e,5},{0x3dfcc1,3},{0x97bea2,7},
-{0xaaa4aa,13},{0x73ef95,5},{0xf74fb1,4},{0xc148ef,17},
-{0xfc26d8,4},{0xfc02fc,6},{0xb1da6c,6},{0xd5d84d,7},
-{0xf96c95,5},{0xf90fef,3},{0xea7b92,7},{0xbc4def,4},
-{0xf2a264,8},{0x40dadd,12},{0xf214f4,4},{0x38c3fc,3},
-{0xf705fc,7},{0xa29db9,3},{0xaaf25f,4},{0xdd9a83,12},
-{0xc188b1,6},{0xa27bda,9},{0x36dde5,4},{0x85bcb9,7},
-{0xfc00fc,5},{0xe76ca4,4},{0x95b6ac,6},{0xb6d071,7},
-{0xc857d8,3},{0xfc2bd3,4},{0xfc5aa4,4},{0xf417ec,5},
-{0xb471d3,7},{0x92b1b6,4},{0x6c90fc,7},{0x5abce2,7},
-{0xcb55d8,3},{0xce30f9,5},{0xea7b95,3},{0xec17f7,6},
-{0xf70ff4,3},{0xaa73dd,9},{0x9d69f4,3},{0xb457ef,6},
-{0xf236d0,6},{0x64e0b4,7},{0xddcb52,4},{0xd0d355,7},
-{0x5fd5c3,6},{0xf42bd8,12},{0x55e2c1,4},{0xb1b492,4},
-{0xdd4dd0,4},{0xbc88b6,3},{0xea21ec,4},{0xf7649d,8},
-{0xb16cda,3},{0x9fa4b6,8},{0xea17f9,4},{0x1efce0,3},
-{0xbec179,7},{0xbeb18b,6},{0x9da4b6,6},{0x48b4fc,4},
-{0x7bfc83,14},{0xacf25c,10},{0xe0d842,4},{0xf9768b,5},
-{0xf90ff2,7},{0xfc00fc,8},{0xf20ff7,5},{0xec7e90,7},
-{0xbc42f9,3},{0xf712ef,5},{0xf902fc,6},{0xf77e83,7},
-{0xb1b197,5},{0xda6cb4,7},{0xf4a264,7},{0xa78dc6,6},
-{0xf21cea,4},{0xa48dc8,6},{0x6997f9,5},{0x67d3be,5},
-{0x4ad0e0,6},{0xcbbe6e,6},{0xcb76b6,10},{0xd030f9,6},
-{0xa29fb6,6},{0xda24fc,5},{0xf4bc48,3},{0xd0909a,6},
-{0xf252b6,8},{0x6cb4da,4},{0xdd40dd,11},{0x8b71fc,9},
-{0x80c8af,7},{0xb15fe7,4},{0x79ef90,6},{0x71b1d8,7},
-{0x61a4f2,9},{0x42dadd,6},{0xaf4ffc,3},{0x9a79e7,5},
-{0xea17f7,6},{0xc89f92,4},{0xb6d869,12},{0xda2eef,4},
-{0xf72ed5,6},{0xe057c3,6},{0xb6b190,6},{0xda48d5,5},
-{0xe0a476,3},{0xfce01c,6},{0x9dbe9f,13},{0xafce7e,4},
-{0xf905fc,6},{0xfc0cef,5},{0x9facaf,6},{0xb6af95,6},
-{0x52ced8,6},{0xd373b4,3},{0xce5cd0,8},{0xe752c1,5},
-{0xf7ac55,8},{0x7bbec1,6},{0xb4d571,4},{0xf90af7,5},
-{0xc833fc,7},{0xbe4dec,8},{0x92beaa,8},{0xfcb945,7},
-{0xc1d067,3},{0xdd45d8,7},{0xceb971,3},{0xf44ab9,4},
-{0xbeac8d,4},{0xf2af5a,15},{0xe05ac1,11},{0xd38b9d,4},
-{0xec0ffc,4},{0x80ec8d,7},{0xd0af7b,6},{0xef5cac,5},
-{0xdaa776,4},{0xd052d8,5},{0xb461e5,8},{0xef8388,7},
-{0xbea297,8},{0xce83a7,5},{0xda2ef2,3},{0x73b6ce,5},
-{0x83ec8b,9},{0xc840f2,7},{0xfc4faf,8},{0xfc14e7,4},
-{0xe742d0,9},{0x52aff7,4},{0xf214f4,4},{0x26f7da,5},
-{0xf2b94d,6},{0xe02eea,6},{0x76fc85,3},{0x858de7,4},
-{0xbc97a4,6},{0xd8aa79,4},{0x9d73ea,4},{0xdda279,5},
-{0xafc385,7},{0x33dde7,6},{0x64acea,8},{0xacce80,7},
-{0xef26e2,7},{0xb957e7,4},{0xdad548,4},{0xaf57f4,5},
-{0x9f73e5,3},{0xeae02e,7},{0xf70af7,8},{0xfc00fc,4},
-{0xea6ca4,6},{0x8885ec,3},{0xe23dda,4},{0xb461e5,10},
-{0xdd928b,6},{0x76cbb6,7},{0xfc00fc,5},{0xce8d9d,8},
-{0xafb692,12},{0xe79083,7},{0xfc0af2,3},{0xf926d8,8},
-{0xe219fc,5},{0xe7bc55,5},{0xcebc6e,3},{0xda73aa,4},
-{0xfc00fc,4},{0x52dace,5},{0xbcd864,6},{0x67e7ac,4},
-{0x33f9cb,3},{0x8bafc1,11},{0xd871af,6},{0xe78390,10},
-{0xb688bc,8},{0x5addc1,6},{0xf2d036,4},{0xf70ff2,9},
-{0xf4ea19,9},{0xfc02f9,6},{0x839fd8,3},{0xdd4dce,5},
-{0xec3dce,6},{0xcea783,6},{0xcbe745,5},{0xc1b483,7},
-{0x799fe0,5},{0xd340e7,7},{0x29ddf2,3},{0x73daac,6},
-{0xea33da,5},{0xe224f2,3},{0xd34fd5,5},{0xe245d3,8},
-{0xfc1edd,10},{0x3bf2cb,4},{0xdd9f7e,26},{0xe02eec,5},
-{0xf47195,4},{0xa461f4,5},{0x3ddae0,3},{0xaf5fea,6},
-{0xbccb73,6},{0xea26ea,8},{0xd82bf7,6},{0xac6ce0,7},
-{0xe524ef,4},{0xb6da69,6},{0xf224e2,5},{0xb95ce5,7},
-{0x73a4e0,7},{0xa4e076,7},{0xfc02f9,8},{0xec1eec,4},
-{0xf7da29,6},{0xc369ce,6},{0xd5c65c,9},{0xe51ef4,4},
-{0xf2a264,4},{0x809ddd,5},{0xd045e2,7},{0xaac888,6},
-{0xb44af9,3},{0xd84ad8,7},{0xf4ef14,5},{0x3bf7c8,5},
-{0xe730e0,4},{0x97b6ac,7},{0x8bda95,5},{0x88ec83,8},
-{0xece529,8},{0x9a80dd,10},{0xf412f4,7},{0x36efd5,6},
-{0xf95ca4,9},{0xd838e7,6},{0x9a69f7,7},{0xf730d3,4},
-{0xd526fc,5},{0x9f76e2,6},{0xe28395,8},{0xecaa61,6},
-{0x4ff4b4,7},{0xd079af,7},{0xa469ea,10},{0xfc21da,7},
-{0xb471d5,6},{0x7b88f7,4},{0xfc6797,4},{0x9daab4,5},
-{0x29f2dd,7},{0x8388ec,7},{0x4df9b1,4},{0xeaf21e,5},
-{0xf4c340,10},{0xf212f7,3},{0xf407fc,5},{0x4fb9ef,9},
-{0xd3b471,6},{0xef4dbe,12},{0x4af4bc,7},{0xe224f2,6},
-{0x36d0f2,8},{0xf707fc,4},{0xfc8d71,9},{0x95bea4,6},
-{0x90ef7b,4},{0x5adac6,5},{0x97b9a7,4},{0xc3c671,6},
-{0xfc12ec,5},{0xea1ef2,5},{0x8dd09d,4},{0xd82bf7,7},
-{0xb18dbc,7},{0xbc64da,6},{0xf28d7b,4},{0xef19ef,5},
-{0xc1e555,6},{0xfc3bc3,6},{0x9f88d3,5},{0xc3ec48,9},
-{0xc8979a,5},{0x5cc6d8,4},{0xf78080,6},{0xb17bcb,8},
-{0xea12fc,6},{0xc195a2,7},{0xef33d8,3},{0xa783ce,3},
-{0xf40af9,5},{0xa288d0,6},{0xf248be,4},{0x14e7fc,5},
-{0x83d3a4,8},{0xb4cb79,6},{0xbc7ebe,3},{0xfc8873,6},
-{0xe038e0,6},{0xc3ef48,6},{0xa25afc,10},{0xc1a792,6},
-{0x8d90dd,9},{0xc1be7b,5},{0x8bec80,5},{0xa4ef64,5},
-{0x38f7c8,11},{0xaf6eda,4},{0xd073b4,5},{0x79ceb4,7},
-{0xd5e540,6},{0xfc0fec,5},{0xf917ea,7},{0x64c8cb,4},
-{0x69e7a7,6},{0xa77ed3,5},{0xe52be7,6},{0x5aaaf4,7},
-{0xcb85a7,5},{0x8392e2,4},{0x5cb4ea,6},{0xe729e7,6},
-{0xc873bc,5},{0xeabc52,7},{0xf438ce,7},{0xea48c8,5},
-{0xef17f4,4},{0xfc00fc,6},{0xf97b85,14},{0x67ace7,3},
-{0xf452b1,7},{0xe2e038,4},{0xa4a7af,5},{0xddb469,3},
-{0xf21cec,7},{0x7bbec1,3},{0xda38e5,8},{0xc6a292,9},
-{0x6ecebc,9},{0x8dda90,4},{0xf921e0,8},{0xc88da4,5},
-{0x92aabc,4},{0x9a9dc3,5},{0x8dd895,4},{0x64d3c3,9},
-{0xa2f95f,7},{0xdd36e5,8},{0x83e790,11},{0xef26e2,5},
-{0xef55b4,9},{0x5fc3d8,6},{0xfc57a4,7},{0x9785dd,5},
-{0x809ddd,4},{0xc66cc8,8},{0xf236d3,5},{0xd338ef,6},
-{0xd8839f,4},{0xef30d8,3},{0x9a9ac6,5},{0xfc05f9,11},
-{0x958bda,11},{0xf902fc,8},{0xbe42f9,4},{0xbce557,6},
-{0xef4fb9,6},{0xf9af52,5},{0x97d38d,5},{0xf902fc,7},
-{0xf4a261,4},{0xd88897,7},{0x92e77e,7},{0x6c9df2,6},
-{0xce85a4,4},{0x9ae07e,8},{0xb1f255,8},{0xc6929f,6},
-{0xf2af5a,10},{0xe2977e,5},{0xe5cb4a,5},{0xfc14e7,3},
-{0xc14aef,3},{0xaff257,3},{0xe21cf9,11},{0xd05ccb,5},
-{0xf2ec1c,8},{0xb4b98b,9},{0xc183b6,3},{0xb455f2,7},
-{0x83aace,4},{0xe51cf9,4},{0xdd4fce,4},{0xb47ec8,3},
-{0x92da8b,4},{0xecb952,4},{0xf70af7,6},{0x7bbcc1,6},
-{0xf40cf9,5},{0xe2ce48,5},{0xf7b14f,5},{0xdd40da,4},
-{0x4fb9f2,7},{0x6eb1da,5},{0x9d90ce,6},{0xcb55d8,5},
-{0xd02efc,8},{0xd36eb9,6},{0xfc0cef,5},{0xe071aa,9},
-{0xe7ac67,3},{0xf4f40f,6},{0xe267af,4},{0xc3da5c,5},
-{0xb945fc,4},{0xeada33,6},{0x7197f2,7},{0xfc00fc,8},
-{0xd09d8d,5},{0x6e9fea,8},{0xd3a77e,4},{0xaa5ff2,6},
-{0xe269ac,5},{0xf426e0,6},{0xfc00fc,5},{0xec6ca2,10},
-{0xc638fc,7},{0xe54fc6,5},{0x5ac6da,3},{0xce67c6,6},
-{0xbe42f9,5},{0xce38f2,5},{0xbe5ae2,3},{0xd3ec38,8},
-{0x8b76f7,8},{0xb180c8,4},{0xd538ec,4},{0xddef2b,9},
-{0xf9c838,5},{0xf457ac,4},{0xf95aa7,7},{0xaf69e0,9},
-{0x67efa2,5},{0xa280d8,4},{0xa7d57b,7},{0xcbaf7e,4},
-{0x837bf9,4},{0xddc15c,6},{0xe221f4,3},{0xc6b480,5},
-{0xbc90af,10},{0x4dd3da,4},{0xbcb983,4},{0xe77997,7},
-{0xe05fb9,9},{0xc1b980,8},{0xdd55c6,7},{0xaf97b1,9},
-{0xec838b,4},{0xc39d9a,9},{0x6c97f7,5},{0xf7b44f,3},
-{0xb69fa4,7},{0x90ea7e,7},{0xe067b1,5},{0xd5cb5a,4},
-{0xc19a9f,8},{0xac67e7,8},{0xcee745,4},{0xf436d0,4},
-{0x73b1d5,7},{0xd3d84f,5},{0xdd42d8,5},{0xea907e,6},
-{0xc83bf4,7},{0xd84fd3,6},{0xe28890,3},{0x38e2e0,8},
-{0xec67a7,6},{0xcbc16e,8},{0x4ab1fc,7},{0x92d590,3},
-{0xaad876,4},{0xb683c1,4},{0xaa55f9,5},{0xea24ea,6},
-{0xf90fef,6},{0xf738c8,3},{0xcb5ad5,7},{0xec21ec,5},
-{0xce61c8,3},{0xa76ce7,3},{0xf41ee5,7},{0xcebe6c,3},
-{0x57dac6,9},{0xf46e97,3},{0x8be08d,7},{0xc148ef,9},
-{0xf926da,8},{0xe029ef,6},{0xfc00fc,5},{0x3dcbf2,4},
-{0xef0ffc,5},{0x95b6ac,9},{0x7be59a,5},{0xda2ef2,8},
-{0xda30ef,5},{0xfc24d8,3},{0x73d3b4,3},{0xddf229,4},
-{0x8883ef,5},{0x5aefaf,6},{0x9797cb,6},{0xcbc16c,5},
-{0xef19f2,5},{0xd3bc6c,3},{0xda5cc3,8},{0x52f9ac,7},
-{0xa7c888,4},{0x69d8b6,7},{0xbc45f7,7},{0xfc02fc,4},
-{0xb4b195,6},{0xe58d85,4},{0x9776ea,6},{0xf255b1,6},
-{0x76dda7,3},{0xe55ab9,8},{0xe230e7,5},{0x3bd0ec,5},
-{0xe219fc,6},{0xcbac83,5},{0xe548ce,7},{0xdd5cbe,3},
-{0xf412f4,5},{0xf9738d,9},{0xdd40da,4},{0x90c6a2,10},
-{0xe038e2,4},{0x6eddaf,8},{0xf23dcb,12},{0xec4fbc,6},
-{0xc8d35c,6},{0xf238d0,6},{0x90cb9f,6},{0xa46ee5,5},
-{0xaf8bbe,5},{0xc1a495,5},{0xc679b9,4},{0xec29e2,6},
-{0xf9649d,6},{0xf924da,6},{0xe224f2,5},{0x8d71f9,7},
-{0xf2cb3d,5},{0xb6cb79,4},{0xa4dd76,6},{0xe52ee5,3},
-{0xaa8bc3,3},{0x838dea,7},{0xf9ea17,5},{0x88c8aa,6},
-{0x73e0a7,5},{0xd09595,6},{0xf7d82b,10},{0xec7397,4},
-{0xfc02fc,7},{0xf72ed3,5},{0xd03dec,4},{0x80cbaf,5},
-{0xf921dd,7},{0x9fcb90,8},{0xbe95a7,4},{0x69eaa4,8},
-{0xf20ff7,5},{0x69e7a7,9},{0xf924da,3},{0xecdd30,6},
-{0xc1d861,4},{0xb967d8,5},{0xb157ef,6},{0xb9bc85,5},
-{0xb192b4,8},{0xda38e5,3},{0xea1eef,6},{0x12f7ef,4},
-{0x6e90f9,6},{0xd573b1,6},{0xdd24f7,5},{0xd5d055,7},
-{0xc86ec1,4},{0xf21ee7,7},{0xa261f4,6},{0xe555c1,4},
-{0xf78b79,6},{0xf78080,5},{0x80b4c3,7},{0xf414ef,4},
-{0xf70ff2,6},{0xea52bc,6},{0xd04ddd,7},{0xf90af4,5},
-{0xe78b88,4},{0xf29f67,6},{0x79b6c8,4},{0xa48dc8,5},
-{0x5fa4f4,4},{0xea14fc,3},{0xf23bcb,7},{0xf738cb,5},
-{0x4fb1f9,3},{0x5ae2bc,7},{0xfcac4f,5},{0xa283d3,7},
-{0xef24e7,7},{0xe5e52e,4},{0x929ace,4},{0xcb36f9,8},
-{0xea21ef,5},{0xf2d038,6},{0x48d8d8,4},{0xec40ce,6},
-{0xf90af7,5},{0xf921dd,7},{0xd8e042,5},{0x21ddf9,4},
-{0x5fb9e2,8},{0xf72ed3,4},{0xfc2ed0,5},{0xf712ef,6},
-{0x57d8cb,5},{0x19fce2,9},{0xe7f71c,9},{0x7be59a,4},
-{0x6cfc90,5},{0xec3bd0,5},{0xea26e7,8},{0x36d5ec,5},
-{0xac76d8,3},{0xa4a4b1,3},{0xef12f7,4},{0x6eb9d3,6},
-{0xe714fc,5},{0xe224f2,5},{0x3bead5,4},{0x8de783,9},
-{0x40d5e2,8},{0x9764fc,7},{0xf705fc,3},{0x8d88e2,8},
-{0xe269ac,6},{0xda33ec,7},{0xd03bec,3},{0xbe6cd0,6},
-{0x8bf479,5},{0xf912ec,8},{0xe5b461,7},{0xaf5aef,6},
-{0xc34fe5,7},{0xd038ef,6},{0x38f9c8,7},{0xf43dc6,3},
-{0xceb973,5},{0xe526ec,4},{0xf902fc,7},{0xbc48f7,4},
-{0,0}
-};
-
-static double const mosaic_curve_points[] = {
-20.3, 216.5, 27.0, 209.8, 17.4, 200.0, 14.5, 183.5, 14.2, 181.8,
-13.5, 181.6, 13.9, 180.0, 28.3, 126.1, 29.2, 126.3, 44.2, 72.5,
-44.4, 71.7, 44.2, 70.8, 44.2, 70.8, 44.2, 70.8, 44.4, 71.7,
-44.2, 72.5, 36.1, 121.4, 36.0, 121.3, 27.9, 170.2, 24.1, 193.3,
-33.8, 203.1, 20.3, 216.5, 82.6, 583.9, 82.5, 583.6, 84.3, 583.3,
-84.2, 583.1, 88.1, 600.0, 87.2, 600.2, 90.2, 617.3, 92.4, 630.1,
-92.4, 630.1, 94.7, 642.9, 96.8, 655.3, 96.8, 655.3, 99.0, 667.8,
-100.0, 673.7, 100.1, 673.7, 101.1, 679.7, 107.4, 716.3, 107.3, 716.3,
-113.7, 752.9, 115.3, 762.1, 117.1, 771.4, 117.1, 771.4, 117.1, 771.4,
-115.3, 762.1, 113.7, 752.9, 108.9, 726.8, 108.9, 726.8, 104.1, 700.7,
-97.1, 662.7, 97.1, 662.7, 90.1, 624.8, 86.3, 604.3, 85.5, 604.5,
-82.6, 583.9, 37.6, 265.6, 38.8, 286.4, 41.0, 287.6, 36.1, 307.5,
-38.5, 298.0, 34.3, 297.0, 32.5, 286.5, 26.4, 251.5, 21.6, 251.7,
-20.3, 216.5, 33.8, 203.1, 24.1, 193.3, 27.9, 170.2, 43.4, 214.1,
-34.7, 217.8, 37.6, 265.6, 27.9, 170.2, 36.0, 121.3, 36.1, 121.4,
-44.2, 72.5, 43.5, 76.1, 44.0, 76.2, 43.9, 79.8, 43.7, 85.4,
-43.7, 85.4, 43.5, 91.0, 41.9, 137.6, 41.9, 137.6, 40.3, 184.2,
-39.2, 217.8, 39.2, 217.8, 38.1, 251.5, 37.8, 258.5, 36.7, 258.7,
-37.6, 265.6, 34.7, 217.8, 43.4, 214.1, 27.9, 170.2, -16.2, 299.0,
--16.2, 299.0, -15.8, 297.4, -15.4, 295.8, -10.3, 274.5, -10.2, 274.5,
--5.1, 253.1, -1.7, 238.6, -1.9, 238.6, 1.6, 224.2, 2.5, 220.5,
-2.8, 220.6, 3.6, 216.9, -0.6, 235.0, -0.7, 235.0, -5.1, 253.1,
--10.2, 274.5, -10.3, 274.5, -15.4, 295.8, -15.8, 297.4, -16.2, 299.0,
--16.2, 299.0, 242.4, -11.8, 258.9, -17.0, 261.0, -11.0, 277.2, -16.9,
-183.6, 17.7, 182.4, 14.3, 87.6, 45.5, 87.3, 45.5, 87.3, 45.5,
-87.1, 45.6, 71.7, 49.5, 71.2, 48.0, 56.4, 53.5, 148.8, 19.4,
-148.5, 18.2, 242.4, -11.8, 56.4, 53.5, 52.5, 54.8, 51.1, 57.0,
-48.5, 55.6, 47.9, 55.2, 48.4, 50.6, 50.0, 50.0, 134.7, 18.5,
-135.0, 19.0, 221.1, -8.6, 231.2, -11.9, 232.5, -8.1, 242.4, -11.8,
-148.5, 18.2, 148.8, 19.4, 56.4, 53.5, 194.7, 17.8, 158.4, 27.2,
-158.4, 27.2, 122.0, 36.6, 117.5, 37.7, 117.5, 37.7, 112.9, 38.9,
-100.2, 42.2, 100.2, 42.2, 87.6, 45.5, 87.3, 45.5, 87.3, 45.5,
-87.1, 45.6, 182.1, 14.3, 181.1, 10.8, 277.2, -16.9, 303.4, -24.5,
-307.1, -14.6, 331.7, -25.0, 266.4, 2.6, 263.7, -3.7, 195.7, 17.5,
-195.2, 17.7, 195.2, 17.7, 194.7, 17.8, 331.7, -25.0, 364.2, -33.4,
-365.0, -31.6, 398.6, -34.9, 387.8, -33.8, 388.0, -32.1, 377.4, -29.4,
-370.0, -27.5, 370.0, -27.5, 362.6, -25.6, 362.3, -25.5, 362.3, -25.5,
-362.0, -25.4, 355.9, -23.9, 355.9, -23.9, 349.8, -22.3, 341.8, -20.2,
-341.8, -20.2, 333.7, -18.1, 318.3, -14.2, 318.3, -14.2, 303.0, -10.2,
-300.6, -9.6, 300.6, -9.6, 298.2, -9.0, 281.5, -4.7, 281.5, -4.7,
-264.9, -0.3, 254.1, 2.4, 254.1, 2.4, 243.2, 5.2, 227.9, 9.2,
-227.9, 9.2, 212.6, 13.1, 204.2, 15.3, 204.2, 15.3, 195.7, 17.5,
-195.2, 17.7, 195.2, 17.7, 194.7, 17.8, 263.2, -3.6, 262.3, -7.1,
-331.7, -25.0, -5.1, 253.1, -0.7, 235.0, -0.6, 235.0, 3.6, 216.9,
-7.2, 203.0, 5.7, 202.2, 11.4, 189.1, 6.4, 200.6, 8.2, 201.4,
-5.0, 213.7, -0.0, 233.4, 2.9, 234.7, -5.1, 253.1, 0.7, 536.2,
-13.6, 573.8, 15.5, 574.7, 18.7, 614.1, 18.8, 616.3, 7.9, 620.2,
-7.3, 619.4, -4.6, 602.1, -1.2, 599.1, -6.2, 577.9, -16.0, 536.4,
--28.8, 533.6, -22.2, 494.1, -25.4, 512.7, -6.9, 513.8, 0.7, 536.2,
--22.2, 494.1, -26.0, 485.6, -28.6, 477.0, -25.8, 475.4, -22.7, 473.6,
--14.7, 479.5, -10.5, 487.2, -3.6, 500.3, -7.1, 502.1, -3.7, 517.0,
--2.5, 522.1, -2.5, 522.1, -1.4, 527.1, -0.3, 531.7, -1.6, 532.5,
-0.7, 536.2, -6.9, 513.8, -25.4, 512.7, -22.2, 494.1, 19.0, 510.1,
-21.7, 515.4, 24.2, 514.1, 29.4, 518.2, 30.9, 519.3, 30.9, 519.3,
-32.3, 520.4, 56.0, 538.7, 58.2, 536.4, 79.7, 557.1, 82.9, 560.1,
-80.6, 562.5, 81.6, 567.8, 82.9, 575.5, 83.7, 575.4, 84.2, 583.1,
-84.3, 583.3, 82.5, 583.6, 82.6, 583.9, 75.0, 587.4, 75.2, 587.9,
-67.4, 591.0, 67.4, 591.1, 67.2, 590.6, 66.9, 590.2, 42.9, 550.1,
-40.5, 551.4, 19.0, 510.1, 121.8, 800.9, 121.7, 801.1, 122.3, 801.2,
-122.4, 801.6, 123.7, 808.3, 126.5, 809.3, 124.7, 815.1, 125.1, 813.8,
-120.1, 813.3, 119.5, 810.6, 118.6, 806.2, 120.3, 805.6, 121.8, 800.9,
-0.7, 495.9, 3.7, 500.5, 5.2, 499.5, 9.8, 503.0, 14.4, 506.5,
-15.9, 505.5, 19.0, 510.1, 40.5, 551.4, 42.9, 550.1, 66.9, 590.2,
-63.6, 584.5, 63.1, 584.8, 59.4, 579.4, 30.0, 537.7, 28.5, 538.7,
-0.7, 495.9, 113.7, 752.9, 115.3, 762.1, 117.1, 771.4, 117.1, 771.4,
-117.4, 773.4, 117.4, 773.4, 117.8, 775.3, 120.1, 788.5, 120.3, 788.4,
-122.4, 801.6, 122.3, 801.2, 121.7, 801.1, 121.8, 800.9, 121.4, 800.4,
-121.4, 800.4, 121.0, 799.9, 120.6, 799.4, 120.6, 799.4, 120.3, 798.9,
-95.0, 767.1, 74.8, 770.0, 69.8, 735.3, 71.5, 747.0, 95.6, 739.1,
-113.7, 752.9, 69.8, 735.3, 69.0, 734.9, 68.4, 733.7, 68.5, 733.6,
-75.3, 725.8, 76.1, 726.5, 83.8, 719.4, 89.1, 714.5, 89.1, 714.5,
-94.4, 709.6, 99.2, 705.1, 104.9, 702.6, 104.1, 700.7, 108.9, 726.8,
-108.9, 726.8, 113.7, 752.9, 95.6, 739.1, 71.5, 747.0, 69.8, 735.3,
-19.0, 613.9, 22.4, 604.2, 32.4, 607.6, 45.7, 601.3, 56.0, 596.4,
-56.0, 596.4, 66.3, 591.6, 66.9, 591.3, 66.9, 591.3, 67.4, 591.0,
-75.2, 587.9, 75.0, 587.4, 82.6, 583.9, 85.5, 604.5, 86.3, 604.3,
-90.1, 624.8, 90.1, 624.5, 88.9, 624.6, 87.8, 624.5, 64.0, 620.8,
-64.0, 620.8, 40.2, 617.2, 29.6, 615.5, 19.7, 612.1, 19.0, 613.9,
-121.0, 799.9, 121.4, 800.4, 121.4, 800.4, 121.8, 800.9, 120.3, 805.6,
-118.6, 806.2, 119.5, 810.6, 108.1, 806.7, 98.9, 800.6, 99.9, 793.4,
-99.6, 795.2, 110.5, 796.3, 121.0, 799.9, 191.6, 801.6, 213.6, 817.8,
-197.0, 840.4, 202.3, 879.2, 202.4, 880.2, 203.0, 880.7, 202.6, 881.2,
-202.1, 881.7, 201.1, 881.7, 200.4, 881.1, 187.5, 870.7, 176.8, 871.5,
-175.5, 859.3, 172.4, 831.7, 200.2, 807.9, 191.6, 801.6, 32.3, 520.4,
-30.9, 519.3, 30.9, 519.3, 29.4, 518.2, 27.6, 505.3, 28.9, 505.1,
-28.3, 492.1, 26.0, 440.3, 25.5, 440.3, 23.7, 388.5, 24.2, 405.2,
-24.7, 405.2, 25.8, 421.8, 27.0, 439.3, 27.0, 439.3, 28.1, 456.8,
-29.1, 470.9, 29.1, 470.9, 30.0, 485.1, 31.1, 502.7, 32.6, 502.7,
-32.3, 520.4, -3.7, 517.0, -7.1, 502.1, -3.6, 500.3, -10.5, 487.2,
--10.8, 490.3, -6.1, 490.7, -1.6, 494.1, -0.5, 495.0, -0.1, 494.8,
-0.7, 495.9, 28.5, 538.7, 30.0, 537.7, 59.4, 579.4, 64.3, 555.8,
-22.9, 552.0, -3.7, 517.0, 83.8, 719.4, 76.1, 726.5, 75.3, 725.8,
-68.5, 733.6, 49.9, 724.3, 45.1, 717.9, 40.0, 697.6, 42.0, 705.5,
-51.1, 703.2, 62.2, 708.7, 69.0, 712.1, 69.0, 712.1, 75.8, 715.5,
-79.8, 717.4, 83.9, 719.1, 83.8, 719.4, 69.7, 767.2, 66.2, 756.5,
-57.4, 760.4, 50.0, 750.0, 44.4, 742.1, 50.3, 736.4, 43.7, 730.7,
-60.1, 745.0, 63.1, 746.8, 69.7, 767.2, 943.6, 608.8, 941.3, 609.3,
-947.5, 623.9, 942.6, 627.8, 892.0, 668.3, 889.0, 665.2, 832.4, 697.7,
-848.6, 688.4, 847.2, 685.9, 861.9, 674.1, 867.3, 669.8, 867.3, 669.8,
-872.6, 665.6, 875.3, 663.4, 875.3, 663.4, 878.0, 661.2, 891.5, 650.5,
-891.5, 650.5, 904.9, 639.8, 906.2, 638.7, 906.2, 638.7, 907.5, 637.7,
-909.8, 635.8, 909.8, 635.8, 912.2, 633.9, 927.9, 621.4, 926.1, 612.3,
-943.6, 608.8, 743.8, 661.6, 749.6, 670.9, 741.5, 681.2, 747.9, 684.8,
-733.2, 676.6, 737.6, 668.6, 727.2, 652.4, 722.1, 644.3, 722.1, 644.3,
-716.9, 636.3, 711.2, 627.4, 711.2, 627.4, 705.5, 618.5, 701.1, 611.6,
-695.6, 610.5, 696.7, 604.7, 695.8, 609.3, 701.3, 610.3, 706.0, 615.9,
-724.9, 638.7, 728.6, 636.5, 743.8, 661.6, 947.6, 328.1, 940.6, 361.9,
-953.7, 364.0, 954.4, 400.0, 955.1, 438.8, 952.6, 438.9, 950.4, 477.7,
-950.5, 475.0, 950.3, 475.0, 950.3, 472.2, 949.8, 448.4, 949.8, 448.4,
-949.4, 424.6, 948.5, 376.3, 938.1, 374.2, 947.6, 328.1, 846.3, 117.0,
-890.0, 147.0, 890.5, 146.4, 933.3, 177.7, 934.1, 178.3, 932.8, 180.3,
-933.6, 180.8, 919.3, 171.9, 920.0, 170.9, 906.3, 160.9, 890.8, 149.6,
-890.8, 149.6, 875.3, 138.2, 872.0, 135.8, 872.0, 135.8, 868.7, 133.4,
-857.5, 125.2, 857.7, 124.9, 846.3, 117.0, 408.1, 154.0, 408.9, 154.9,
-409.6, 155.6, 409.4, 156.0, 393.6, 178.5, 392.8, 177.9, 376.1, 199.9,
-371.9, 205.6, 372.2, 205.9, 367.6, 211.2, 370.8, 207.5, 370.5, 207.2,
-373.3, 203.2, 390.6, 178.7, 390.6, 178.7, 407.9, 154.3, 408.0, 154.2,
-408.2, 154.1, 408.1, 154.0, 142.2, 652.8, 141.2, 609.9, 142.1, 609.9,
-142.0, 567.0, 142.0, 543.5, 142.0, 543.5, 141.9, 520.0, 141.9, 517.7,
-141.9, 517.7, 141.9, 515.4, 141.9, 494.5, 141.9, 494.5, 141.9, 473.6,
-141.9, 472.3, 141.9, 472.3, 141.9, 471.0, 141.8, 468.7, 141.8, 468.7,
-141.8, 466.3, 141.8, 452.9, 141.5, 452.9, 141.8, 439.5, 141.8, 441.3,
-142.0, 441.3, 142.3, 443.2, 144.2, 457.2, 144.2, 457.2, 146.2, 471.3,
-146.6, 474.8, 146.6, 474.8, 147.1, 478.3, 147.4, 480.0, 147.4, 480.0,
-147.6, 481.7, 148.8, 490.4, 148.8, 490.4, 150.0, 499.1, 150.2, 500.3,
-150.2, 500.3, 150.3, 501.5, 153.2, 522.1, 153.2, 522.1, 156.0, 542.8,
-156.8, 548.2, 156.8, 548.2, 157.5, 553.7, 157.8, 556.1, 158.5, 556.2,
-158.2, 558.4, 155.4, 578.7, 154.7, 578.6, 151.3, 598.8, 147.6, 620.7,
-147.6, 620.7, 143.9, 642.6, 143.9, 642.7, 143.9, 642.7, 143.9, 642.7,
-143.1, 647.7, 142.1, 647.8, 142.2, 652.8, -1.6, 494.1, -6.1, 490.7,
--10.8, 490.3, -10.5, 487.2, -14.7, 479.5, -22.7, 473.6, -25.8, 475.4,
--37.3, 443.0, -39.2, 441.2, -38.9, 407.2, -39.0, 422.7, -32.2, 422.8,
--25.5, 438.4, -13.6, 466.3, -10.5, 465.3, -1.6, 494.1, 15.1, 196.4,
-24.9, 282.2, 18.9, 282.9, 22.8, 369.5, 22.8, 369.5, 22.8, 369.6,
-22.8, 369.6, 19.8, 367.5, 17.9, 368.2, 16.8, 365.3, 14.8, 360.0,
-16.8, 359.2, 16.7, 353.2, 16.6, 347.1, 16.6, 347.1, 16.6, 341.0,
-16.4, 326.7, 16.4, 326.7, 16.3, 312.3, 15.7, 254.3, 21.6, 253.7,
-15.1, 196.4, -1.4, 527.1, -2.5, 522.1, -2.5, 522.1, -3.7, 517.0,
-22.9, 552.0, 64.3, 555.8, 59.4, 579.4, 63.1, 584.8, 63.6, 584.5,
-66.9, 590.2, 67.2, 590.6, 67.4, 591.1, 67.4, 591.0, 66.9, 591.3,
-66.9, 591.3, 66.3, 591.6, 44.0, 571.1, 44.3, 570.7, 22.4, 549.7,
-10.5, 538.4, 8.8, 539.8, -1.4, 527.1, 87.8, 624.5, 88.9, 624.6,
-90.1, 624.5, 90.1, 624.8, 97.1, 662.7, 97.1, 662.7, 104.1, 700.7,
-104.9, 702.6, 99.2, 705.1, 94.4, 709.6, 91.2, 708.1, 93.8, 702.6,
-93.3, 695.5, 92.9, 690.2, 92.9, 690.2, 92.5, 684.9, 91.2, 668.6,
-91.2, 668.6, 89.9, 652.3, 88.9, 638.4, 87.7, 638.4, 87.8, 624.5,
-120.3, 798.9, 120.6, 799.4, 120.6, 799.4, 121.0, 799.9, 110.5, 796.3,
-99.6, 795.2, 99.9, 793.4, 83.2, 782.8, 82.9, 782.0, 69.7, 767.2,
-63.1, 746.8, 60.1, 745.0, 43.7, 730.7, 42.4, 728.8, 43.7, 727.6,
-42.2, 726.3, 82.0, 761.7, 81.3, 762.5, 120.3, 798.9, 42.2, 726.3,
-28.8, 709.3, 29.6, 704.7, 27.9, 682.3, 28.5, 690.4, 33.9, 690.0,
-40.0, 697.6, 45.1, 717.9, 49.9, 724.3, 68.5, 733.6, 68.4, 733.7,
-69.0, 734.9, 69.8, 735.3, 74.8, 770.0, 95.0, 767.1, 120.3, 798.9,
-81.3, 762.5, 82.0, 761.7, 42.2, 726.3, 703.4, 562.7, 701.7, 552.1,
-711.8, 549.5, 722.0, 537.9, 721.3, 538.6, 722.2, 539.4, 722.5, 540.9,
-723.8, 548.1, 723.8, 548.1, 725.0, 555.3, 730.5, 586.1, 730.5, 586.1,
-735.9, 616.8, 737.4, 625.4, 738.6, 625.3, 739.0, 634.0, 738.8, 631.5,
-737.7, 631.5, 736.5, 629.0, 719.9, 595.9, 708.9, 597.6, 703.4, 562.7,
-539.8, 359.6, 539.7, 358.7, 539.2, 358.7, 538.6, 357.9, 519.1, 327.4,
-519.1, 327.4, 499.6, 296.9, 492.6, 286.0, 492.4, 286.2, 485.7, 275.1,
-486.0, 275.6, 486.2, 275.5, 486.8, 275.9, 488.5, 277.1, 488.5, 277.1,
-490.3, 278.3, 512.4, 293.3, 515.9, 289.9, 534.6, 308.4, 538.8, 312.6,
-535.4, 316.0, 536.1, 323.7, 536.4, 326.7, 536.4, 326.7, 536.7, 329.8,
-538.3, 344.7, 538.8, 344.7, 539.8, 359.6, 672.2, 402.1, 674.0, 400.5,
-680.5, 407.7, 688.8, 413.4, 692.6, 416.0, 692.6, 416.0, 696.4, 418.5,
-698.9, 420.3, 700.7, 419.7, 701.5, 422.0, 705.6, 434.7, 703.8, 435.3,
-706.2, 448.6, 706.9, 452.6, 706.9, 452.6, 707.6, 456.6, 710.3, 471.8,
-713.6, 472.0, 713.0, 487.0, 713.1, 483.1, 709.8, 483.0, 706.7, 478.9,
-704.9, 476.6, 704.9, 476.6, 703.1, 474.3, 701.9, 472.8, 701.9, 472.8,
-700.8, 471.3, 696.3, 465.5, 696.3, 465.5, 691.8, 459.8, 689.2, 456.4,
-689.2, 456.4, 686.6, 453.1, 678.3, 442.4, 678.3, 442.4, 669.9, 431.6,
-669.6, 431.2, 669.3, 431.2, 669.3, 430.8, 670.4, 416.4, 664.2, 409.2,
-672.2, 402.1, 669.3, 430.8, 662.6, 432.2, 659.8, 418.7, 650.4, 406.5,
-639.5, 392.5, 639.5, 392.5, 628.6, 378.5, 623.6, 372.1, 625.2, 368.3,
-618.6, 365.6, 636.3, 372.9, 634.8, 376.6, 650.9, 387.6, 657.0, 391.8,
-657.0, 391.8, 663.1, 395.9, 666.5, 398.2, 666.5, 398.2, 669.9, 400.6,
-670.3, 400.8, 670.3, 400.8, 670.6, 401.0, 671.4, 401.6, 672.2, 401.6,
-672.2, 402.1, 664.2, 409.2, 670.4, 416.4, 669.3, 430.8, 150.3, 501.5,
-150.2, 500.3, 150.2, 500.3, 150.0, 499.1, 164.5, 478.5, 165.2, 479.0,
-180.4, 458.9, 203.0, 428.9, 200.5, 426.6, 225.7, 398.9, 203.9, 422.9,
-206.4, 425.2, 187.1, 451.5, 168.7, 476.5, 169.4, 477.1, 150.3, 501.5,
-198.1, 70.3, 213.7, 72.4, 227.1, 73.6, 228.3, 81.5, 229.1, 86.3,
-215.3, 88.6, 202.2, 95.7, 194.5, 100.0, 194.5, 100.0, 186.7, 104.2,
-177.5, 109.3, 170.2, 107.4, 168.4, 114.3, 173.7, 93.6, 181.1, 95.5,
-193.8, 76.7, 195.9, 73.5, 196.4, 70.1, 198.1, 70.3, 140.7, 133.4,
-137.8, 135.0, 133.7, 132.2, 133.2, 133.5, 134.7, 129.7, 137.9, 130.9,
-142.6, 128.4, 147.4, 125.8, 147.4, 125.8, 152.1, 123.1, 160.3, 118.7,
-160.3, 118.7, 168.4, 114.3, 170.2, 107.4, 177.5, 109.3, 186.7, 104.2,
-164.3, 119.7, 164.5, 120.3, 140.7, 133.4, 134.9, 228.4, 136.6, 240.3,
-129.2, 247.8, 116.4, 255.3, 118.9, 253.8, 111.2, 244.9, 114.4, 240.4,
-120.5, 231.5, 135.5, 232.9, 134.9, 228.4, 151.3, 598.8, 154.7, 578.6,
-155.4, 578.7, 158.2, 558.4, 157.7, 560.5, 158.5, 560.6, 158.8, 562.8,
-161.6, 583.3, 161.6, 583.3, 164.4, 603.8, 165.1, 609.2, 165.1, 609.2,
-165.9, 614.5, 169.9, 643.5, 169.9, 643.5, 173.9, 672.6, 174.5, 677.0,
-173.8, 677.2, 175.1, 681.5, 162.5, 640.3, 157.1, 641.0, 151.3, 598.8,
-141.4, 568.5, 141.4, 567.7, 142.1, 567.7, 142.0, 567.0, 142.1, 609.9,
-141.2, 609.9, 142.2, 652.8, 142.4, 726.7, 142.4, 726.7, 142.5, 800.7,
-142.5, 811.8, 142.5, 811.8, 142.6, 822.9, 142.6, 826.8, 142.7, 830.7,
-142.6, 830.7, 138.4, 830.8, 134.1, 827.1, 133.9, 823.2, 131.5, 765.1,
-135.6, 765.0, 137.3, 706.8, 137.6, 699.6, 137.6, 699.6, 137.8, 692.5,
-139.6, 630.5, 139.3, 630.5, 141.4, 568.5, 94.7, 642.9, 92.4, 630.1,
-92.4, 630.1, 90.2, 617.3, 90.6, 608.0, 93.4, 608.1, 96.7, 598.9,
-98.3, 594.2, 99.8, 594.3, 100.0, 589.5, 98.9, 614.8, 97.5, 614.8,
-95.0, 640.0, 94.8, 641.5, 94.4, 641.6, 94.7, 642.9, 118.9, 272.9,
-120.5, 292.1, 121.5, 292.0, 124.1, 311.0, 126.7, 329.9, 126.7, 329.9,
-129.3, 348.8, 135.5, 394.1, 136.9, 394.0, 141.8, 439.5, 141.5, 452.9,
-141.8, 452.9, 141.8, 466.3, 142.0, 464.7, 139.8, 464.7, 139.2, 462.7,
-138.1, 459.0, 138.8, 458.8, 138.4, 454.9, 135.2, 425.6, 135.2, 425.6,
-132.1, 396.2, 130.6, 382.7, 130.6, 382.7, 129.2, 369.3, 124.0, 321.1,
-123.1, 321.2, 118.9, 272.9, 44.2, 353.6, 40.0, 349.1, 42.9, 346.4,
-41.7, 339.3, 40.6, 332.9, 43.2, 329.6, 39.5, 326.5, 51.9, 336.6,
-49.3, 339.9, 59.1, 353.3, 60.0, 354.6, 60.0, 354.6, 60.9, 355.8,
-66.5, 363.4, 66.5, 363.4, 72.1, 371.0, 73.1, 372.4, 73.1, 372.4,
-74.1, 373.8, 74.2, 373.9, 74.1, 374.0, 74.3, 374.1, 59.2, 363.9,
-56.3, 366.5, 44.2, 353.6, -15.4, 295.8, -10.3, 274.5, -10.2, 274.5,
--5.1, 253.1, 2.9, 234.7, -0.0, 233.4, 5.0, 213.7, 2.7, 222.5,
-2.8, 222.5, 0.6, 231.3, -3.2, 247.1, -3.2, 247.2, -7.1, 263.0,
--11.2, 279.4, -12.0, 279.2, -15.4, 295.8, 22.8, 369.5, 18.9, 282.9,
-24.9, 282.2, 15.1, 196.4, 14.8, 189.9, 16.1, 189.6, 14.5, 183.5,
-17.4, 200.0, 27.0, 209.8, 20.3, 216.5, 21.6, 251.7, 26.4, 251.5,
-32.5, 286.5, 33.4, 293.8, 31.6, 294.0, 30.7, 301.5, 30.7, 301.8,
-30.7, 301.8, 30.7, 302.0, 29.9, 308.7, 29.9, 308.7, 29.1, 315.3,
-26.0, 342.4, 19.7, 343.1, 22.8, 369.5, 78.4, 549.9, 78.8, 550.4,
-78.6, 550.6, 78.7, 551.4, 79.2, 554.2, 78.0, 556.0, 79.7, 557.1,
-58.2, 536.4, 56.0, 538.7, 32.3, 520.4, 32.6, 502.7, 31.1, 502.7,
-30.0, 485.1, 30.0, 486.7, 31.2, 486.7, 32.4, 488.3, 55.4, 519.1,
-55.7, 518.9, 78.4, 549.9, 45.7, 601.3, 32.4, 607.6, 22.4, 604.2,
-19.0, 613.9, 18.8, 614.0, 18.6, 614.0, 18.7, 614.1, 15.5, 574.7,
-13.6, 573.8, 0.7, 536.2, -1.6, 532.5, -0.3, 531.7, -1.4, 527.1,
-8.8, 539.8, 10.5, 538.4, 22.4, 549.7, 37.4, 573.4, 47.0, 576.2,
-45.7, 601.3, 22.4, 549.7, 44.3, 570.7, 44.0, 571.1, 66.3, 591.6,
-56.0, 596.4, 56.0, 596.4, 45.7, 601.3, 47.0, 576.2, 37.4, 573.4,
-22.4, 549.7, 62.2, 708.7, 51.1, 703.2, 42.0, 705.5, 40.0, 697.6,
-33.9, 690.0, 28.5, 690.4, 27.9, 682.3, 21.2, 668.6, 25.2, 654.1,
-18.3, 653.0, 32.9, 655.3, 30.8, 668.9, 43.3, 684.7, 49.6, 692.7,
-49.6, 692.7, 55.9, 700.7, 56.1, 701.0, 56.1, 701.0, 56.3, 701.2,
-59.3, 705.0, 58.6, 707.9, 62.2, 708.7, 773.1, 619.7, 757.0, 625.1,
-754.8, 618.3, 736.4, 616.8, 736.2, 616.8, 735.9, 616.9, 735.9, 616.8,
-730.5, 586.1, 730.5, 586.1, 725.0, 555.3, 725.3, 557.0, 726.8, 556.9,
-728.5, 558.4, 734.7, 564.0, 734.7, 564.0, 741.0, 569.6, 750.7, 578.2,
-750.7, 578.2, 760.4, 586.8, 768.9, 594.4, 768.9, 594.4, 777.5, 602.0,
-778.0, 602.4, 778.5, 602.6, 778.4, 602.8, 776.3, 611.4, 778.0, 618.1,
-773.1, 619.7, 778.4, 602.8, 780.2, 601.8, 783.2, 607.1, 787.9, 611.3,
-791.7, 614.6, 792.8, 613.9, 795.5, 618.0, 796.2, 619.0, 795.2, 621.3,
-794.7, 621.4, 784.0, 622.2, 778.2, 625.5, 773.1, 619.7, 778.0, 618.1,
-776.3, 611.4, 778.4, 602.8, 767.2, 714.9, 766.5, 712.4, 765.7, 712.6,
-764.3, 710.3, 759.7, 703.1, 759.7, 703.1, 755.2, 696.0, 751.5, 690.4,
-750.0, 690.9, 747.9, 684.8, 741.5, 681.2, 749.6, 670.9, 743.8, 661.6,
-741.7, 649.6, 741.7, 649.6, 739.6, 637.7, 739.3, 635.8, 739.3, 635.8,
-739.0, 634.0, 738.6, 625.3, 737.4, 625.4, 735.9, 616.8, 735.9, 616.9,
-736.2, 616.8, 736.4, 616.8, 741.7, 632.9, 741.5, 633.0, 746.6, 649.2,
-756.9, 682.0, 757.7, 681.8, 767.2, 714.9, 787.2, 480.4, 785.4, 487.8,
-809.3, 488.9, 823.0, 504.7, 825.6, 507.8, 817.7, 516.8, 819.7, 518.2,
-799.8, 504.6, 783.7, 494.5, 787.2, 480.4, 760.1, 584.4, 760.7, 585.0,
-759.7, 586.2, 760.4, 586.8, 750.7, 578.2, 750.7, 578.2, 741.0, 569.6,
-744.4, 572.8, 744.8, 572.5, 748.5, 575.4, 754.3, 579.9, 754.8, 579.3,
-760.1, 584.4, 781.1, 677.4, 781.0, 677.3, 781.2, 676.2, 781.4, 676.2,
-796.6, 675.2, 796.6, 675.8, 811.9, 675.4, 814.5, 675.3, 814.5, 675.3,
-817.1, 675.3, 839.5, 674.7, 855.1, 664.1, 861.9, 674.1, 847.2, 685.9,
-848.6, 688.4, 832.4, 697.7, 829.2, 700.2, 827.7, 703.0, 825.4, 702.1,
-802.0, 692.9, 803.0, 690.2, 781.1, 677.4, 825.4, 702.1, 824.6, 718.3,
-804.0, 723.6, 778.2, 732.1, 776.6, 732.6, 771.7, 726.6, 770.7, 720.3,
-769.6, 713.9, 772.4, 713.4, 774.0, 706.6, 777.6, 692.0, 776.3, 677.8,
-781.1, 677.4, 803.0, 690.2, 802.0, 692.9, 825.4, 702.1, 736.5, 629.0,
-737.7, 631.5, 738.8, 631.5, 739.0, 634.0, 739.3, 635.8, 739.3, 635.8,
-739.6, 637.7, 737.6, 633.7, 738.1, 633.5, 736.6, 629.3, 736.5, 629.2,
-736.6, 629.2, 736.5, 629.0, 939.3, 263.2, 939.2, 262.7, 941.3, 262.5,
-941.3, 262.2, 945.5, 295.0, 945.9, 295.1, 947.6, 328.1, 938.1, 374.2,
-948.5, 376.3, 949.4, 424.6, 949.3, 413.7, 948.7, 413.7, 948.0, 402.8,
-943.6, 333.0, 942.6, 333.0, 939.3, 263.2, 933.8, 398.2, 945.1, 423.2,
-939.9, 425.5, 945.9, 452.8, 948.1, 462.5, 948.5, 462.5, 950.3, 472.2,
-950.3, 475.0, 950.5, 475.0, 950.4, 477.7, 949.9, 489.9, 944.7, 492.2,
-949.1, 502.2, 932.5, 464.7, 937.5, 462.4, 926.0, 422.7, 923.8, 415.2,
-923.8, 415.2, 921.6, 407.7, 920.4, 403.4, 920.4, 403.4, 919.1, 399.2,
-916.7, 390.9, 916.1, 382.5, 914.3, 382.6, 923.5, 382.0, 929.2, 388.1,
-933.8, 398.2, 924.1, 500.9, 935.4, 520.1, 931.7, 522.3, 939.4, 543.8,
-942.7, 553.0, 944.8, 552.8, 946.0, 562.3, 947.5, 574.7, 945.5, 574.9,
-944.7, 587.6, 944.7, 587.5, 944.5, 587.5, 944.3, 587.3, 934.6, 580.7,
-934.6, 580.7, 924.9, 574.1, 919.9, 570.7, 915.1, 570.9, 915.0, 567.3,
-913.8, 541.2, 918.6, 541.0, 922.2, 514.6, 923.1, 507.7, 926.8, 505.5,
-924.1, 500.9, 926.0, 422.7, 937.5, 462.4, 932.5, 464.7, 949.1, 502.2,
-953.3, 531.4, 952.7, 533.4, 946.0, 562.3, 944.8, 552.8, 942.7, 553.0,
-939.4, 543.8, 934.7, 516.5, 936.3, 516.2, 933.3, 488.7, 932.5, 482.0,
-932.5, 482.0, 931.8, 475.4, 928.9, 449.0, 938.8, 442.6, 926.0, 422.7,
-669.9, 400.6, 666.5, 398.2, 666.5, 398.2, 663.1, 395.9, 663.0, 395.4,
-665.6, 394.7, 668.1, 393.5, 684.8, 385.5, 684.8, 385.5, 701.4, 377.5,
-711.7, 372.6, 711.7, 372.6, 722.0, 367.6, 725.4, 366.0, 725.4, 366.0,
-728.7, 364.4, 730.3, 363.7, 730.3, 363.7, 731.8, 362.9, 732.7, 362.5,
-732.7, 362.5, 733.6, 362.1, 740.2, 358.9, 740.2, 358.9, 746.8, 355.7,
-750.9, 353.7, 750.9, 353.7, 755.0, 351.7, 767.9, 345.5, 767.9, 345.5,
-780.8, 339.3, 815.8, 322.6, 815.8, 322.7, 850.7, 305.9, 851.2, 305.7,
-851.6, 305.3, 851.6, 305.3, 851.6, 305.3, 851.2, 305.7, 850.7, 305.9,
-805.7, 329.5, 805.7, 329.5, 760.6, 353.1, 715.3, 376.8, 716.7, 380.0,
-669.9, 400.6, 676.7, 19.0, 678.1, 20.5, 689.6, 2.0, 699.1, 3.6,
-713.8, 6.3, 713.2, 14.6, 725.3, 27.5, 724.0, 26.2, 723.0, 27.1,
-720.8, 26.7, 698.7, 22.8, 689.0, 32.0, 676.7, 19.0, 446.7, 132.3,
-433.1, 136.8, 432.6, 135.3, 418.6, 138.4, 413.9, 139.4, 413.9, 139.4,
-409.3, 140.3, 408.6, 140.5, 408.6, 140.5, 408.0, 140.6, 404.3, 141.4,
-404.3, 142.2, 400.6, 142.2, 400.0, 142.2, 399.3, 141.0, 399.5, 140.5,
-401.5, 136.3, 401.3, 134.8, 405.1, 132.7, 408.4, 130.9, 409.4, 132.7,
-413.7, 132.6, 414.0, 132.6, 414.0, 132.6, 414.2, 132.6, 424.1, 132.5,
-424.1, 132.5, 434.0, 132.5, 435.4, 132.4, 435.4, 132.4, 436.8, 132.4,
-441.7, 132.4, 442.2, 133.8, 446.7, 132.3, 359.9, 57.9, 372.4, 77.4,
-383.0, 94.8, 375.4, 102.9, 379.1, 99.0, 363.7, 84.6, 352.0, 66.3,
-345.7, 56.6, 345.7, 56.6, 339.5, 46.8, 338.4, 45.2, 338.4, 45.2,
-337.4, 43.5, 327.7, 28.4, 331.8, 22.0, 318.0, 13.2, 343.0, 29.2,
-343.7, 32.5, 359.9, 57.9, 318.0, 13.2, 309.1, 2.6, 299.8, -3.8,
-303.0, -10.2, 318.3, -14.2, 318.3, -14.2, 333.7, -18.1, 336.3, -17.9,
-335.7, -12.3, 337.7, -6.6, 348.8, 25.7, 370.5, 47.3, 359.9, 57.9,
-343.7, 32.5, 343.0, 29.2, 318.0, 13.2, 393.4, 131.0, 382.3, 118.8,
-382.3, 117.9, 375.4, 102.9, 383.0, 94.8, 372.4, 77.4, 359.9, 57.9,
-370.5, 47.3, 348.8, 25.7, 337.7, -6.6, 365.8, 53.1, 362.5, 54.7,
-387.3, 116.0, 390.3, 123.5, 388.3, 125.4, 393.4, 131.0, 290.4, 2.4,
-289.0, 0.5, 293.4, -4.2, 298.2, -9.0, 300.6, -9.6, 300.6, -9.6,
-303.0, -10.2, 299.8, -3.8, 309.1, 2.6, 318.0, 13.2, 331.8, 22.0,
-327.7, 28.4, 337.4, 43.5, 336.2, 41.4, 335.5, 41.8, 333.5, 40.1,
-311.9, 21.3, 306.7, 25.1, 290.4, 2.4, 432.1, 236.3, 431.1, 225.7,
-431.2, 225.7, 430.8, 215.1, 431.0, 219.5, 431.2, 219.5, 431.6, 223.8,
-431.8, 226.0, 431.8, 226.0, 432.0, 228.2, 435.6, 267.5, 435.6, 267.5,
-439.3, 306.7, 441.3, 329.1, 441.3, 329.1, 443.4, 351.4, 443.9, 357.8,
-443.9, 357.8, 444.5, 364.1, 444.8, 366.7, 444.8, 366.7, 445.0, 369.4,
-446.9, 389.4, 446.9, 389.4, 448.7, 409.5, 452.1, 447.0, 452.1, 447.0,
-455.6, 484.5, 456.5, 494.1, 456.5, 494.1, 457.3, 503.6, 461.1, 544.5,
-461.1, 544.5, 464.8, 585.3, 466.5, 603.5, 466.6, 603.5, 468.2, 621.6,
-469.3, 634.5, 469.2, 634.5, 470.3, 647.3, 471.5, 660.3, 471.7, 660.3,
-472.9, 673.2, 473.3, 677.4, 473.3, 677.4, 473.7, 681.5, 473.9, 684.3,
-474.0, 684.3, 474.2, 687.1, 474.9, 695.0, 474.8, 695.0, 475.5, 702.9,
-476.7, 715.9, 476.8, 715.9, 478.0, 728.9, 480.1, 750.5, 480.0, 750.5,
-482.0, 772.1, 482.3, 775.1, 482.3, 775.1, 482.5, 778.1, 483.9, 793.3,
-485.3, 808.6, 485.3, 808.6, 485.3, 808.6, 483.9, 793.3, 482.5, 778.1,
-482.3, 775.1, 482.3, 775.1, 482.0, 772.1, 480.0, 750.5, 480.1, 750.5,
-478.0, 728.9, 476.8, 715.9, 476.7, 715.9, 475.5, 702.9, 472.9, 675.1,
-472.9, 675.1, 470.3, 647.3, 469.3, 635.9, 469.4, 635.9, 468.4, 624.5,
-468.3, 623.1, 468.3, 623.1, 468.2, 621.6, 466.6, 603.5, 466.5, 603.5,
-464.8, 585.3, 461.1, 544.5, 461.1, 544.5, 457.3, 503.6, 456.5, 494.1,
-456.5, 494.1, 455.6, 484.5, 452.1, 447.0, 452.1, 447.0, 448.7, 409.5,
-446.9, 389.4, 446.9, 389.4, 445.0, 369.4, 438.6, 302.8, 438.2, 302.9,
-432.1, 236.3, 431.6, 223.8, 431.2, 219.5, 431.0, 219.5, 430.8, 215.1,
-429.9, 201.0, 423.5, 197.5, 429.1, 186.9, 427.2, 190.5, 437.8, 193.7,
-438.3, 201.1, 439.0, 212.2, 437.1, 213.6, 431.6, 223.8, 94.7, 97.2,
-96.3, 96.3, 94.0, 92.2, 93.3, 87.3, 91.4, 73.5, 91.4, 73.5,
-89.5, 59.8, 88.5, 52.6, 84.6, 48.1, 87.6, 45.5, 100.2, 42.2,
-100.2, 42.2, 112.9, 38.9, 122.8, 39.1, 132.9, 43.7, 132.6, 46.2,
-130.6, 63.5, 120.5, 62.4, 108.5, 78.6, 101.6, 87.9, 103.9, 91.9,
-94.7, 97.2, 236.1, 70.1, 237.2, 70.5, 237.2, 74.9, 235.3, 77.7,
-233.3, 80.6, 231.3, 82.1, 228.3, 81.5, 227.1, 73.6, 213.7, 72.4,
-198.1, 70.3, 187.3, 66.3, 178.2, 59.9, 176.5, 62.4, 179.9, 57.6,
-189.0, 64.0, 201.4, 65.6, 203.1, 65.8, 203.1, 65.8, 204.7, 66.0,
-207.8, 66.4, 207.8, 66.4, 210.8, 66.8, 223.5, 68.4, 225.0, 65.1,
-236.1, 70.1, 239.1, 42.7, 241.4, 39.6, 239.6, 38.3, 240.1, 33.8,
-241.7, 19.5, 235.9, 15.3, 243.2, 5.2, 254.1, 2.4, 254.1, 2.4,
-264.9, -0.3, 262.4, 22.3, 253.8, 22.5, 239.1, 42.7, 264.9, -0.3,
-281.5, -4.7, 281.5, -4.7, 298.2, -9.0, 293.4, -4.2, 289.0, 0.5,
-290.4, 2.4, 281.5, 15.3, 281.5, 15.3, 272.6, 28.3, 271.6, 29.7,
-271.6, 29.7, 270.6, 31.1, 270.6, 31.2, 270.6, 31.2, 270.6, 31.2,
-267.6, 35.6, 267.6, 35.6, 264.6, 39.9, 257.8, 49.7, 257.8, 49.7,
-251.1, 59.5, 245.9, 67.1, 246.6, 67.8, 240.6, 74.8, 238.8, 76.9,
-235.8, 78.2, 235.3, 77.7, 237.2, 74.9, 237.2, 70.5, 236.1, 70.1,
-237.6, 56.4, 234.1, 55.0, 239.1, 42.7, 253.8, 22.5, 262.4, 22.3,
-264.9, -0.3, 202.2, 95.7, 215.3, 88.6, 229.1, 86.3, 228.3, 81.5,
-231.3, 82.1, 233.3, 80.6, 235.3, 77.7, 235.8, 78.2, 238.8, 76.9,
-240.6, 74.8, 223.0, 102.9, 229.0, 115.3, 202.9, 129.5, 209.8, 125.8,
-195.3, 108.8, 202.2, 95.7, 202.9, 129.5, 202.9, 131.1, 202.0, 132.5,
-200.8, 132.6, 185.0, 134.2, 184.8, 132.8, 168.8, 133.0, 156.7, 133.2,
-156.7, 133.2, 144.7, 133.3, 142.7, 133.4, 142.0, 132.4, 140.7, 133.4,
-164.5, 120.3, 164.3, 119.7, 186.7, 104.2, 194.5, 100.0, 194.5, 100.0,
-202.2, 95.7, 195.3, 108.8, 209.8, 125.8, 202.9, 129.5, 167.7, 180.7,
-147.7, 192.0, 153.2, 201.8, 138.8, 222.8, 136.8, 225.6, 137.5, 226.5,
-134.9, 228.4, 135.5, 232.9, 120.5, 231.5, 114.4, 240.4, 114.8, 240.2,
-113.1, 237.7, 113.9, 236.9, 139.8, 207.9, 135.3, 199.1, 167.7, 180.7,
-143.9, 642.6, 147.6, 620.7, 147.6, 620.7, 151.3, 598.8, 157.1, 641.0,
-162.5, 640.3, 175.1, 681.5, 177.5, 690.6, 176.4, 690.9, 177.7, 700.4,
-179.3, 711.9, 179.3, 711.9, 180.9, 723.4, 182.7, 737.0, 182.7, 737.0,
-184.6, 750.6, 184.7, 751.0, 184.6, 751.1, 184.7, 751.5, 171.2, 715.6,
-171.3, 715.6, 157.8, 679.7, 156.0, 674.9, 156.0, 674.9, 154.3, 670.2,
-149.1, 656.4, 144.5, 656.6, 143.9, 642.6, 125.1, 606.5, 125.7, 587.3,
-144.0, 585.9, 141.4, 568.5, 139.3, 630.5, 139.6, 630.5, 137.8, 692.5,
-152.3, 658.4, 123.9, 649.3, 125.1, 606.5, 95.0, 640.0, 97.5, 614.8,
-98.9, 614.8, 100.0, 589.5, 104.7, 567.6, 107.5, 568.2, 115.1, 546.9,
-120.5, 531.4, 124.2, 531.8, 126.0, 515.9, 122.8, 543.6, 119.2, 543.2,
-112.4, 570.4, 108.5, 585.7, 108.5, 585.7, 104.7, 601.1, 102.4, 610.2,
-102.4, 610.2, 100.1, 619.4, 97.5, 629.7, 94.9, 629.7, 95.0, 640.0,
-10.6, 447.0, 22.3, 456.0, 16.9, 463.2, 23.2, 479.3, 25.8, 485.7,
-27.2, 485.5, 28.3, 492.1, 28.9, 505.1, 27.6, 505.3, 29.4, 518.2,
-24.2, 514.1, 21.7, 515.4, 19.0, 510.1, 15.9, 505.5, 14.4, 506.5,
-9.8, 503.0, 7.7, 499.0, 9.9, 497.9, 9.9, 492.8, 10.1, 481.1,
-10.1, 481.1, 10.2, 469.4, 10.4, 458.2, 15.8, 451.1, 10.6, 447.0,
--22.1, 363.9, -22.7, 362.5, -22.7, 362.5, -23.3, 361.1, -25.7, 355.0,
--26.1, 355.1, -28.1, 348.9, -28.3, 348.1, -27.4, 347.8, -27.6, 347.1,
--24.5, 355.0, -25.0, 355.2, -22.3, 363.3, -22.2, 363.6, -22.2, 363.6,
--22.1, 363.9, -24.7, 334.6, -20.5, 316.8, -20.4, 316.8, -16.2, 299.0,
--16.2, 299.0, -15.8, 297.4, -15.4, 295.8, -12.0, 279.2, -11.2, 279.4,
--7.1, 263.0, -3.2, 247.2, -3.2, 247.1, 0.6, 231.3, -3.2, 247.1,
--3.2, 247.2, -7.1, 263.0, -11.2, 279.4, -12.0, 279.2, -15.4, 295.8,
--15.8, 297.4, -16.2, 299.0, -16.2, 299.0, -19.1, 311.6, -19.1, 311.6,
--22.1, 324.1, -23.3, 329.4, -23.4, 329.3, -24.7, 334.6, 30.7, 301.5,
-31.6, 294.0, 33.4, 293.8, 32.5, 286.5, 34.3, 297.0, 38.5, 298.0,
-36.1, 307.5, 37.1, 313.2, 37.1, 313.2, 38.1, 318.9, 38.5, 321.0,
-38.5, 321.0, 38.9, 323.2, 39.0, 324.0, 38.9, 324.0, 39.1, 324.7,
-34.8, 313.2, 32.8, 313.5, 30.7, 301.5, 77.0, 541.9, 79.2, 544.8,
-76.2, 547.2, 78.4, 549.9, 55.7, 518.9, 55.4, 519.1, 32.4, 488.3,
-38.9, 497.4, 39.6, 496.9, 46.7, 505.5, 61.9, 523.7, 63.3, 522.7,
-77.0, 541.9, 774.0, 706.6, 772.4, 713.4, 769.6, 713.9, 770.7, 720.3,
-770.8, 720.0, 770.4, 719.9, 770.2, 719.5, 768.7, 717.2, 768.1, 717.4,
-767.2, 714.9, 757.7, 681.8, 756.9, 682.0, 746.6, 649.2, 747.7, 652.9,
-748.3, 652.7, 750.0, 656.2, 762.0, 681.4, 765.5, 680.3, 774.0, 706.6,
-745.8, 465.5, 745.6, 465.3, 745.7, 465.1, 745.7, 464.8, 744.9, 457.9,
-747.0, 452.1, 744.0, 451.0, 767.8, 459.9, 767.8, 463.2, 787.2, 480.4,
-783.7, 494.5, 799.8, 504.6, 819.7, 518.2, 820.2, 518.7, 819.5, 519.3,
-819.2, 520.3, 818.8, 522.1, 819.5, 522.9, 818.4, 523.8, 818.2, 523.9,
-817.5, 523.1, 816.7, 522.4, 781.2, 494.0, 781.1, 494.2, 745.8, 465.5,
-728.5, 558.4, 726.8, 556.9, 725.3, 557.0, 725.0, 555.3, 723.8, 548.1,
-723.8, 548.1, 722.5, 540.9, 722.7, 542.5, 723.0, 542.4, 723.5, 543.9,
-726.0, 551.2, 727.5, 551.0, 728.5, 558.4, 811.9, 675.4, 796.6, 675.8,
-796.6, 675.2, 781.4, 676.2, 776.8, 671.7, 782.5, 663.2, 787.3, 651.6,
-787.0, 652.4, 788.9, 653.1, 790.4, 654.6, 797.3, 661.3, 797.3, 661.3,
-804.3, 668.0, 808.1, 671.7, 809.7, 676.2, 811.9, 675.4, 736.6, 629.3,
-738.1, 633.5, 737.6, 633.7, 739.6, 637.7, 741.7, 649.6, 741.7, 649.6,
-743.8, 661.6, 728.6, 636.5, 724.9, 638.7, 706.0, 615.9, 708.2, 625.6,
-722.7, 620.4, 736.6, 629.3, 706.0, 615.9, 701.3, 610.3, 695.8, 609.3,
-696.7, 604.7, 696.3, 604.2, 696.3, 604.1, 696.0, 603.6, 690.6, 595.2,
-687.4, 596.0, 685.3, 586.9, 684.6, 584.2, 687.8, 583.4, 690.4, 580.0,
-694.8, 574.1, 694.8, 574.1, 699.3, 568.1, 701.3, 565.4, 704.0, 563.8,
-703.4, 562.7, 708.9, 597.6, 719.9, 595.9, 736.5, 629.0, 736.6, 629.2,
-736.5, 629.2, 736.6, 629.3, 722.7, 620.4, 708.2, 625.6, 706.0, 615.9,
-628.6, 378.5, 639.5, 392.5, 639.5, 392.5, 650.4, 406.5, 654.9, 441.5,
-646.0, 442.7, 641.6, 478.9, 641.5, 479.0, 641.5, 479.0, 641.5, 479.0,
-641.1, 482.9, 641.1, 482.9, 640.6, 486.8, 639.5, 496.1, 635.1, 498.0,
-638.3, 505.4, 632.9, 492.8, 637.2, 490.9, 636.1, 476.4, 634.1, 450.4,
-634.1, 450.4, 632.1, 424.4, 630.4, 401.5, 618.0, 388.9, 628.6, 378.5,
-641.6, 478.9, 646.0, 442.7, 654.9, 441.5, 650.4, 406.5, 659.8, 418.7,
-662.6, 432.2, 669.3, 430.8, 669.3, 431.2, 669.6, 431.2, 669.9, 431.6,
-665.0, 440.8, 664.6, 440.6, 659.2, 449.5, 650.4, 464.2, 639.0, 466.5,
-641.6, 478.9, 914.0, 381.7, 920.2, 370.0, 908.9, 364.0, 903.7, 346.4,
-903.5, 345.5, 903.5, 345.5, 903.2, 344.7, 896.6, 321.9, 896.6, 321.9,
-890.0, 299.2, 888.4, 293.8, 888.2, 293.8, 886.8, 288.4, 886.8, 288.3,
-887.1, 288.3, 887.3, 288.2, 895.2, 284.4, 895.2, 284.4, 903.1, 280.6,
-905.1, 279.6, 907.3, 278.8, 907.2, 278.6, 914.2, 299.5, 915.4, 300.0,
-916.8, 321.8, 918.8, 351.5, 926.7, 357.7, 914.0, 381.7, 916.8, 321.8,
-940.6, 341.7, 935.4, 360.4, 933.8, 398.2, 929.2, 388.1, 923.5, 382.0,
-914.3, 382.6, 914.0, 382.4, 914.0, 382.1, 914.0, 381.7, 926.7, 357.7,
-918.8, 351.5, 916.8, 321.8, 869.9, 395.5, 869.6, 395.5, 869.6, 393.4,
-869.3, 391.2, 866.2, 370.9, 866.2, 370.9, 863.2, 350.6, 862.8, 348.1,
-862.8, 348.1, 862.4, 345.6, 861.4, 338.7, 861.4, 338.7, 860.4, 331.9,
-859.2, 323.7, 857.8, 323.7, 858.0, 315.5, 857.9, 319.1, 859.2, 319.2,
-860.5, 322.8, 865.3, 336.2, 868.2, 335.8, 870.1, 349.6, 872.9, 370.0,
-870.0, 370.4, 869.9, 391.2, 869.9, 393.4, 869.9, 395.5, 869.9, 395.5,
-860.5, 322.8, 859.2, 319.2, 857.9, 319.1, 858.0, 315.5, 856.6, 309.4,
-853.5, 305.6, 856.1, 303.1, 867.9, 292.0, 870.8, 290.2, 886.8, 288.4,
-888.2, 293.8, 888.4, 293.8, 890.0, 299.2, 887.6, 305.1, 884.3, 303.7,
-878.7, 308.3, 869.6, 315.5, 870.9, 319.1, 860.5, 322.8, 694.7, 409.5,
-693.6, 408.7, 690.9, 414.1, 688.8, 413.4, 680.5, 407.7, 674.0, 400.5,
-672.2, 402.1, 672.2, 401.6, 671.4, 401.6, 670.6, 401.0, 682.8, 405.0,
-684.5, 402.5, 694.7, 409.5, 860.4, 331.9, 861.4, 338.7, 861.4, 338.7,
-862.4, 345.6, 858.9, 351.0, 855.0, 348.4, 847.6, 351.2, 844.2, 352.5,
-844.2, 352.5, 840.8, 353.8, 820.4, 361.5, 820.4, 361.5, 799.9, 369.3,
-792.1, 372.2, 792.1, 372.2, 784.2, 375.2, 782.6, 375.8, 782.5, 375.6,
-781.0, 376.4, 805.0, 362.6, 805.1, 362.9, 829.3, 349.3, 835.8, 345.6,
-835.8, 345.6, 842.4, 342.0, 851.4, 336.9, 852.6, 330.4, 860.4, 331.9,
-625.4, 361.6, 634.8, 368.9, 633.8, 370.2, 642.2, 378.7, 646.5, 383.2,
-645.7, 384.7, 650.9, 387.6, 634.8, 376.6, 636.3, 372.9, 618.6, 365.6,
-607.2, 357.8, 607.2, 357.8, 595.7, 350.0, 591.1, 346.9, 591.1, 346.9,
-586.5, 343.8, 560.5, 326.1, 560.5, 326.1, 534.6, 308.4, 515.9, 289.9,
-512.4, 293.3, 490.3, 278.3, 494.6, 281.3, 494.8, 281.0, 499.3, 283.8,
-500.2, 284.4, 500.2, 284.4, 501.2, 285.0, 543.6, 311.2, 543.6, 311.2,
-586.0, 337.3, 592.2, 341.2, 592.2, 341.2, 598.4, 345.0, 611.9, 353.3,
-612.9, 352.0, 625.4, 361.6, 251.1, 59.5, 257.8, 49.7, 257.8, 49.7,
-264.6, 39.9, 245.2, 81.7, 243.4, 80.9, 222.1, 121.8, 201.5, 161.7,
-201.5, 161.7, 180.9, 201.5, 171.0, 220.5, 170.9, 220.4, 161.1, 239.4,
-158.7, 243.9, 156.5, 248.6, 156.5, 248.6, 156.5, 248.6, 158.7, 243.9,
-161.1, 239.4, 180.0, 201.5, 180.0, 201.5, 199.0, 163.7, 219.1, 123.5,
-219.1, 123.5, 239.2, 83.3, 245.2, 71.4, 244.4, 70.9, 251.1, 59.5,
-474.9, 881.8, 473.8, 882.9, 470.8, 882.1, 470.7, 882.0, 466.7, 848.4,
-468.7, 848.1, 466.7, 814.3, 465.8, 799.3, 465.8, 799.3, 464.9, 784.3,
-463.3, 759.1, 463.2, 759.1, 461.7, 734.0, 460.1, 708.3, 460.2, 708.3,
-458.7, 682.6, 457.9, 669.3, 457.9, 669.3, 457.1, 655.9, 455.3, 625.3,
-455.3, 625.3, 453.5, 594.6, 453.1, 588.3, 453.1, 588.3, 452.8, 581.9,
-452.6, 578.7, 452.6, 578.7, 452.4, 575.5, 451.9, 567.7, 451.9, 567.7,
-451.5, 559.9, 449.9, 533.5, 450.3, 533.5, 448.3, 507.2, 454.4, 587.2,
-454.0, 587.3, 459.7, 667.4, 462.4, 705.5, 462.4, 705.5, 465.1, 743.6,
-468.5, 791.8, 468.5, 791.8, 471.9, 840.0, 473.3, 859.1, 473.3, 859.1,
-474.7, 878.3, 474.8, 880.1, 475.7, 881.1, 474.9, 881.8, 140.0, 48.9,
-137.3, 46.4, 136.3, 47.5, 132.6, 46.2, 132.9, 43.7, 122.8, 39.1,
-112.9, 38.9, 117.5, 37.7, 117.5, 37.7, 122.0, 36.6, 132.0, 40.2,
-132.1, 41.6, 140.0, 48.9, 168.8, 133.0, 184.8, 132.8, 185.0, 134.2,
-200.8, 132.6, 200.1, 132.2, 196.4, 139.0, 192.0, 145.4, 182.2, 159.7,
-183.0, 160.3, 172.4, 174.0, 173.0, 173.1, 172.2, 172.5, 172.1, 171.1,
-171.0, 158.5, 171.0, 158.5, 169.9, 145.9, 169.7, 143.6, 169.7, 143.6,
-169.5, 141.3, 169.2, 137.2, 168.1, 133.2, 168.8, 133.0, 142.5, 800.7,
-142.4, 726.7, 142.4, 726.7, 142.2, 652.8, 142.1, 647.8, 143.1, 647.7,
-143.9, 642.7, 144.9, 660.2, 143.8, 660.2, 143.6, 677.7, 143.1, 739.2,
-139.1, 739.4, 142.5, 800.7, 112.4, 570.4, 119.2, 543.2, 122.8, 543.6,
-126.0, 515.9, 127.1, 511.9, 127.4, 512.0, 128.8, 508.0, 135.1, 490.1,
-135.1, 490.1, 141.5, 472.1, 141.7, 471.6, 142.0, 471.5, 141.9, 471.0,
-141.9, 472.3, 141.9, 472.3, 141.9, 473.6, 127.5, 522.1, 130.1, 523.1,
-112.4, 570.4, 132.1, 396.2, 135.2, 425.6, 135.2, 425.6, 138.4, 454.9,
-109.9, 423.8, 122.8, 412.0, 107.3, 369.1, 106.3, 366.5, 106.3, 366.5,
-105.4, 363.9, 98.1, 343.8, 98.1, 343.8, 90.8, 323.7, 84.3, 305.5,
-84.3, 305.5, 77.7, 287.3, 72.4, 272.6, 72.4, 272.6, 67.0, 257.9,
-64.0, 249.4, 64.0, 249.4, 60.9, 240.9, 58.1, 233.2, 58.4, 225.5,
-55.3, 225.4, 59.1, 225.6, 58.8, 233.2, 62.3, 240.9, 63.3, 243.2,
-63.3, 243.2, 64.3, 245.5, 70.8, 259.9, 70.8, 259.9, 77.2, 274.3,
-90.8, 304.5, 90.8, 304.5, 104.4, 334.7, 106.6, 339.6, 106.6, 339.6,
-108.8, 344.5, 120.5, 370.3, 124.8, 369.2, 132.1, 396.2, 73.9, 510.3,
-74.7, 516.4, 72.5, 516.8, 73.7, 522.7, 63.8, 473.9, 62.6, 474.0,
-56.6, 424.6, 60.5, 456.8, 63.0, 456.5, 69.5, 488.4, 71.7, 499.4,
-72.6, 499.3, 73.9, 510.3, -25.5, 438.4, -32.2, 422.8, -39.0, 422.7,
--38.9, 407.2, -40.1, 403.8, -40.7, 403.4, -40.2, 400.0, -38.5, 387.8,
--34.0, 376.1, -34.5, 375.9, -29.2, 377.4, -32.6, 389.3, -30.6, 402.7,
--28.1, 420.5, -20.0, 435.3, -25.5, 438.4, 22.8, 369.7, 23.3, 379.1,
-23.2, 379.1, 23.7, 388.5, 25.5, 440.3, 26.0, 440.3, 28.3, 492.1,
-27.2, 485.5, 25.8, 485.7, 23.2, 479.3, 22.2, 474.7, 23.2, 474.4,
-23.2, 469.6, 23.1, 435.6, 23.1, 435.6, 22.9, 401.7, 22.9, 387.5,
-22.9, 387.5, 22.8, 373.4, 22.8, 371.5, 22.9, 371.5, 22.8, 369.7,
--7.1, 263.0, -3.2, 247.2, -3.2, 247.1, 0.6, 231.3, 2.8, 222.5,
-2.7, 222.5, 5.0, 213.7, 8.2, 201.4, 6.4, 200.6, 11.4, 189.1,
-12.6, 184.6, 11.6, 184.0, 13.9, 180.0, 13.5, 181.6, 14.2, 181.8,
-14.5, 183.5, 16.1, 189.6, 14.8, 189.9, 15.1, 196.4, 21.6, 253.7,
-15.7, 254.3, 16.3, 312.3, 18.3, 298.8, 9.2, 297.5, 2.2, 282.6,
--2.5, 272.8, -6.8, 272.9, -7.1, 263.0, 25.8, 421.8, 24.7, 405.2,
-24.2, 405.2, 23.7, 388.5, 23.2, 379.1, 23.3, 379.1, 22.8, 369.7,
-22.8, 369.7, 22.8, 369.7, 22.8, 369.6, 22.8, 369.6, 22.8, 369.5,
-22.8, 369.5, 19.7, 343.1, 26.0, 342.4, 29.1, 315.3, 35.6, 352.4,
-27.9, 353.7, 26.8, 392.2, 26.7, 393.2, 26.7, 393.2, 26.7, 394.2,
-26.2, 408.0, 20.2, 411.2, 25.8, 421.8, 55.5, 418.2, 55.0, 421.2,
-56.0, 421.4, 56.6, 424.6, 62.6, 474.0, 63.8, 473.9, 73.7, 522.7,
-75.4, 532.3, 71.5, 538.3, 77.0, 541.9, 63.3, 522.7, 61.9, 523.7,
-46.7, 505.5, 40.6, 486.7, 48.9, 484.0, 51.0, 462.5, 53.2, 440.3,
-52.2, 440.2, 55.5, 418.2, 40.2, 617.2, 64.0, 620.8, 64.0, 620.8,
-87.8, 624.5, 87.7, 638.4, 88.9, 638.4, 89.9, 652.3, 89.9, 652.3,
-89.7, 652.3, 89.4, 652.2, 80.8, 650.5, 80.8, 650.5, 72.2, 648.9,
-62.8, 647.0, 59.0, 650.8, 53.4, 645.1, 43.1, 634.9, 38.9, 618.0,
-40.2, 617.2, 53.4, 645.1, 53.2, 643.6, 47.9, 644.1, 42.5, 643.0,
-35.6, 641.6, 35.6, 641.6, 28.8, 640.3, 21.0, 638.8, 17.9, 641.9,
-13.1, 637.2, 7.2, 631.4, 5.5, 627.2, 7.3, 619.4, 7.9, 620.2,
-18.8, 616.3, 18.7, 614.1, 18.6, 614.0, 18.8, 614.0, 19.0, 613.9,
-19.7, 612.1, 29.6, 615.5, 40.2, 617.2, 38.9, 618.0, 43.1, 634.9,
-53.4, 645.1, 75.8, 715.5, 69.0, 712.1, 69.0, 712.1, 62.2, 708.7,
-58.6, 707.9, 59.3, 705.0, 56.3, 701.2, 67.0, 706.5, 68.6, 706.3,
-75.8, 715.5, 789.1, 644.2, 787.8, 644.4, 788.2, 647.9, 787.3, 651.6,
-782.5, 663.2, 776.8, 671.7, 781.4, 676.2, 781.2, 676.2, 781.0, 677.3,
-781.1, 677.4, 776.3, 677.8, 777.6, 692.0, 774.0, 706.6, 765.5, 680.3,
-762.0, 681.4, 750.0, 656.2, 752.4, 646.1, 769.1, 646.7, 789.1, 644.2,
-750.0, 656.2, 748.3, 652.7, 747.7, 652.9, 746.6, 649.2, 741.5, 633.0,
-741.7, 632.9, 736.4, 616.8, 754.8, 618.3, 757.0, 625.1, 773.1, 619.7,
-778.2, 625.5, 784.0, 622.2, 794.7, 621.4, 794.7, 621.4, 794.2, 623.3,
-793.8, 625.1, 791.5, 634.7, 795.2, 639.9, 789.1, 644.2, 769.1, 646.7,
-752.4, 646.1, 750.0, 656.2, 748.1, 484.6, 742.7, 479.3, 750.7, 468.2,
-745.8, 465.5, 781.1, 494.2, 781.2, 494.0, 816.7, 522.4, 809.9, 516.5,
-808.6, 518.0, 800.5, 513.5, 793.3, 509.5, 793.3, 509.5, 786.1, 505.6,
-767.1, 495.1, 762.9, 499.3, 748.1, 484.6, 907.8, 630.0, 907.7, 629.7,
-907.1, 629.8, 907.1, 629.4, 904.8, 615.5, 904.2, 615.5, 903.1, 601.5,
-903.9, 612.2, 904.8, 612.1, 906.6, 622.8, 907.2, 626.4, 907.5, 626.4,
-907.8, 630.0, 595.7, 350.0, 607.2, 357.8, 607.2, 357.8, 618.6, 365.6,
-625.2, 368.3, 623.6, 372.1, 628.6, 378.5, 618.0, 388.9, 630.4, 401.5,
-632.1, 424.4, 604.2, 402.0, 614.7, 388.9, 597.3, 353.4, 596.5, 351.7,
-597.0, 350.8, 595.7, 350.0, 659.2, 449.5, 664.6, 440.6, 665.0, 440.8,
-669.9, 431.6, 678.3, 442.4, 678.3, 442.4, 686.6, 453.1, 683.8, 457.8,
-665.3, 457.3, 659.2, 449.5, 948.0, 402.8, 948.7, 413.7, 949.3, 413.7,
-949.4, 424.6, 949.8, 448.4, 949.8, 448.4, 950.3, 472.2, 948.5, 462.5,
-948.1, 462.5, 945.9, 452.8, 942.7, 430.1, 943.4, 430.0, 940.8, 407.3,
-937.7, 379.2, 924.2, 357.6, 934.6, 351.1, 927.8, 355.4, 942.7, 376.7,
-948.0, 402.8, 934.6, 351.1, 927.7, 310.9, 923.3, 310.1, 925.5, 269.8,
-925.6, 266.1, 939.6, 265.2, 939.3, 263.2, 942.6, 333.0, 943.6, 333.0,
-948.0, 402.8, 942.7, 376.7, 927.8, 355.4, 934.6, 351.1, 914.7, 275.0,
-914.5, 273.9, 918.0, 273.4, 921.4, 271.7, 923.2, 270.9, 923.2, 270.9,
-925.0, 270.0, 925.2, 269.9, 925.5, 269.9, 925.5, 269.8, 923.3, 310.1,
-927.7, 310.9, 934.6, 351.1, 924.2, 357.6, 937.7, 379.2, 940.8, 407.3,
-923.8, 342.2, 924.2, 341.6, 914.7, 275.0, 940.8, 407.3, 943.4, 430.0,
-942.7, 430.1, 945.9, 452.8, 939.9, 425.5, 945.1, 423.2, 933.8, 398.2,
-935.4, 360.4, 940.6, 341.7, 916.8, 321.8, 915.4, 300.0, 914.2, 299.5,
-907.2, 278.6, 907.1, 277.0, 914.9, 275.8, 914.7, 275.0, 924.2, 341.6,
-923.8, 342.2, 940.8, 407.3, 760.6, 353.1, 805.7, 329.5, 805.7, 329.5,
-850.7, 305.9, 823.3, 315.5, 825.7, 322.5, 800.7, 339.1, 776.8, 355.0,
-776.8, 355.0, 752.8, 370.9, 744.0, 376.7, 738.7, 374.4, 735.2, 382.6,
-742.6, 365.5, 745.0, 363.5, 760.6, 353.1, 735.2, 382.6, 717.6, 397.7,
-715.7, 395.5, 696.2, 408.5, 695.5, 409.0, 695.3, 409.6, 694.7, 409.5,
-684.5, 402.5, 682.8, 405.0, 670.6, 401.0, 670.3, 400.8, 670.3, 400.8,
-669.9, 400.6, 716.7, 380.0, 715.3, 376.8, 760.6, 353.1, 745.0, 363.5,
-742.6, 365.5, 735.2, 382.6, 829.3, 349.3, 805.1, 362.9, 805.0, 362.6,
-781.0, 376.4, 775.0, 379.5, 774.6, 378.8, 768.3, 381.2, 766.2, 382.0,
-766.2, 382.0, 764.0, 382.8, 751.7, 387.5, 751.7, 387.5, 739.4, 392.2,
-727.0, 396.9, 727.0, 396.9, 714.5, 401.6, 705.4, 405.0, 702.9, 402.3,
-696.2, 408.5, 715.7, 395.5, 717.6, 397.7, 735.2, 382.6, 738.7, 374.4,
-744.0, 376.7, 752.8, 370.9, 790.2, 357.7, 794.5, 342.5, 829.3, 349.3,
-823.9, 404.0, 808.4, 391.3, 812.1, 386.9, 800.2, 369.8, 800.1, 369.5,
-800.0, 369.2, 799.9, 369.3, 820.4, 361.5, 820.4, 361.5, 840.8, 353.8,
-846.5, 358.5, 834.3, 373.1, 827.8, 392.5, 825.8, 398.3, 822.2, 402.7,
-823.9, 404.0, 520.2, 128.3, 522.8, 135.7, 526.6, 134.1, 530.8, 141.2,
-541.2, 158.9, 540.1, 159.5, 549.5, 177.8, 563.9, 205.9, 566.4, 204.8,
-578.3, 234.0, 576.1, 228.6, 572.1, 230.5, 569.0, 225.3, 554.9, 201.4,
-556.5, 200.5, 544.1, 175.8, 542.3, 172.2, 542.3, 172.2, 540.5, 168.7,
-530.3, 148.5, 527.6, 149.4, 520.2, 128.3, 649.0, 299.7, 641.0, 276.2,
-628.3, 280.5, 607.6, 261.2, 603.6, 257.5, 603.6, 257.5, 599.6, 253.8,
-588.9, 243.9, 586.1, 245.8, 578.3, 234.0, 566.4, 204.8, 563.9, 205.9,
-549.5, 177.8, 581.3, 186.8, 575.0, 209.0, 600.5, 240.3, 624.8, 270.0,
-637.5, 265.7, 649.0, 299.7, 621.3, 242.7, 629.3, 253.2, 624.4, 257.5,
-633.4, 266.7, 601.5, 234.1, 604.4, 231.3, 575.4, 195.8, 570.5, 189.8,
-571.2, 189.2, 565.6, 183.9, 578.8, 196.4, 578.2, 197.1, 590.7, 210.4,
-606.0, 226.5, 607.9, 225.1, 621.3, 242.7, 607.6, 261.2, 628.3, 280.5,
-641.0, 276.2, 649.0, 299.7, 666.4, 315.9, 667.6, 314.8, 683.8, 332.1,
-680.1, 328.1, 678.1, 330.1, 674.0, 326.3, 640.0, 294.7, 639.4, 295.1,
-607.6, 261.2, 538.5, 273.3, 548.2, 283.1, 548.2, 283.1, 557.8, 293.0,
-582.8, 318.3, 582.8, 318.3, 607.8, 343.7, 616.6, 352.7, 617.9, 362.6,
-625.4, 361.6, 612.9, 352.0, 611.9, 353.3, 598.4, 345.0, 568.0, 314.6,
-570.6, 312.1, 542.8, 279.0, 542.2, 278.3, 542.2, 278.2, 541.6, 277.4,
-540.5, 275.8, 540.5, 275.8, 539.3, 274.3, 538.9, 273.8, 538.9, 273.7,
-538.5, 273.3, 671.6, 22.5, 673.6, 20.2, 674.3, 18.8, 676.7, 19.0,
-689.0, 32.0, 698.7, 22.8, 720.8, 26.7, 691.3, 60.0, 674.9, 71.6,
-633.3, 68.0, 650.3, 69.5, 651.8, 44.7, 671.6, 22.5, 633.3, 68.0,
-619.2, 79.9, 616.0, 76.2, 598.7, 84.3, 570.9, 97.4, 571.6, 99.2,
-543.0, 110.6, 550.9, 107.4, 550.2, 105.6, 557.4, 100.7, 560.1, 98.9,
-560.1, 98.9, 562.7, 97.1, 566.7, 94.4, 566.7, 94.4, 570.6, 91.6,
-605.0, 68.1, 605.0, 68.1, 639.3, 44.6, 655.4, 33.6, 667.9, 36.8,
-671.6, 22.5, 651.8, 44.7, 650.3, 69.5, 633.3, 68.0, 623.1, 94.6,
-622.0, 94.0, 621.5, 95.0, 619.9, 95.3, 615.1, 96.3, 615.1, 96.3,
-610.4, 97.3, 600.3, 99.5, 600.3, 99.5, 590.2, 101.6, 580.0, 103.8,
-580.0, 103.8, 569.8, 106.0, 569.2, 106.1, 569.2, 106.1, 568.7, 106.2,
-561.4, 107.8, 561.4, 107.8, 554.1, 109.4, 547.3, 110.8, 547.4, 111.5,
-540.5, 112.3, 541.8, 112.1, 541.7, 111.2, 543.0, 110.6, 571.6, 99.2,
-570.9, 97.4, 598.7, 84.3, 599.2, 84.1, 599.4, 84.6, 600.1, 84.9,
-611.6, 89.7, 612.1, 88.8, 623.1, 94.6, 528.8, -39.2, 527.3, -47.3,
-543.8, -57.6, 542.7, -58.6, 554.3, -47.9, 557.9, -30.8, 549.9, -19.7,
-550.9, -21.1, 530.9, -27.9, 528.8, -39.2, 686.9, -7.4, 688.8, -8.6,
-700.2, 0.9, 699.1, 3.6, 689.6, 2.0, 678.1, 20.5, 676.7, 19.0,
-674.3, 18.8, 673.6, 20.2, 671.6, 22.5, 667.9, 36.8, 655.4, 33.6,
-639.3, 44.6, 643.9, 42.0, 643.1, 40.5, 646.9, 36.3, 666.9, 14.4,
-662.7, 7.7, 686.9, -7.4, 432.7, -43.8, 494.1, -60.9, 493.9, -61.6,
-555.8, -76.8, 554.4, -76.4, 555.1, -74.3, 553.5, -73.6, 548.9, -71.4,
-548.5, -72.3, 543.4, -71.1, 508.4, -62.5, 508.4, -62.5, 473.5, -53.9,
-471.6, -53.4, 471.6, -53.4, 469.8, -53.0, 451.2, -48.4, 451.1, -48.9,
-432.7, -43.8, 223.1, 199.1, 223.1, 199.1, 232.3, 166.6, 241.5, 134.0,
-245.6, 119.3, 245.6, 119.3, 249.8, 104.6, 253.8, 90.4, 253.9, 90.4,
-257.9, 76.1, 260.2, 67.8, 260.2, 67.8, 262.6, 59.6, 266.1, 47.2,
-266.1, 47.2, 269.6, 34.9, 270.1, 33.1, 270.0, 33.1, 270.6, 31.2,
-270.6, 31.2, 270.6, 31.2, 270.6, 31.1, 270.1, 33.0, 270.1, 33.0,
-269.6, 34.9, 266.1, 47.2, 266.1, 47.2, 262.6, 59.6, 260.2, 67.8,
-260.2, 67.8, 257.9, 76.1, 253.9, 90.4, 253.8, 90.4, 249.8, 104.6,
-245.6, 119.3, 245.6, 119.3, 241.5, 134.0, 232.3, 166.6, 223.1, 199.1,
-223.1, 199.1, 149.0, 461.3, 149.0, 461.3, 149.7, 458.6, 150.5, 455.9,
-178.7, 356.3, 175.0, 355.1, 206.8, 256.7, 206.6, 257.2, 214.0, 259.0,
-213.8, 260.1, 210.0, 283.9, 206.3, 283.4, 198.8, 306.6, 194.5, 320.1,
-194.5, 320.1, 190.1, 333.6, 170.3, 394.7, 170.2, 394.7, 150.5, 455.9,
-149.7, 458.6, 149.0, 461.3, 149.0, 461.3, 238.0, 140.7, 239.4, 137.2,
-240.6, 137.6, 241.5, 134.0, 232.3, 166.6, 223.1, 199.1, 223.1, 199.1,
-215.0, 227.9, 215.1, 227.9, 206.8, 256.7, 194.4, 299.9, 194.2, 299.8,
-181.8, 343.0, 179.0, 352.7, 179.1, 352.8, 176.4, 362.5, 165.4, 402.3,
-165.4, 402.3, 154.3, 442.2, 152.4, 449.0, 150.5, 455.9, 150.5, 455.9,
-150.5, 455.9, 152.4, 449.0, 154.3, 442.2, 165.4, 402.3, 165.4, 402.3,
-176.4, 362.5, 179.1, 352.8, 179.0, 352.7, 181.8, 343.0, 189.6, 315.0,
-189.6, 315.0, 197.4, 286.9, 200.1, 277.3, 200.1, 277.3, 202.7, 267.7,
-214.8, 224.2, 214.8, 224.2, 226.9, 180.6, 231.1, 165.6, 231.1, 165.6,
-235.3, 150.5, 235.5, 149.5, 235.5, 149.5, 235.8, 148.5, 236.9, 144.6,
-236.5, 144.5, 238.0, 140.7, 222.1, 121.8, 243.4, 80.9, 245.2, 81.7,
-264.6, 39.9, 267.6, 35.6, 267.6, 35.6, 270.6, 31.2, 269.1, 45.7,
-266.6, 45.4, 262.6, 59.6, 260.2, 67.8, 260.2, 67.8, 257.9, 76.1,
-253.9, 90.4, 253.8, 90.4, 249.8, 104.6, 247.0, 109.7, 244.2, 108.1,
-238.5, 111.6, 230.3, 116.7, 224.7, 114.7, 222.1, 121.8, 161.1, 239.4,
-158.7, 243.9, 156.5, 248.6, 156.5, 248.6, 156.0, 249.5, 156.0, 249.5,
-155.5, 250.4, 147.2, 266.5, 138.9, 282.6, 138.9, 282.6, 138.9, 282.6,
-147.2, 266.5, 155.5, 250.4, 156.0, 249.5, 156.0, 249.5, 156.5, 248.6,
-156.5, 248.6, 158.7, 243.9, 161.1, 239.4, 464.8, 585.3, 461.1, 544.5,
-461.1, 544.5, 457.3, 503.6, 457.3, 502.5, 458.0, 502.4, 458.7, 501.2,
-460.2, 498.5, 460.2, 498.5, 461.7, 495.7, 462.7, 493.9, 463.8, 493.9,
-463.8, 492.1, 465.4, 538.7, 484.5, 550.0, 464.8, 585.3, 209.1, 647.2,
-209.1, 646.8, 209.3, 646.8, 209.5, 646.5, 212.6, 641.2, 212.6, 641.2,
-215.7, 636.0, 218.1, 631.9, 217.3, 628.6, 220.5, 627.8, 219.5, 628.1,
-220.3, 631.4, 220.0, 634.9, 219.1, 648.1, 219.1, 648.1, 218.1, 661.3,
-214.3, 713.1, 225.7, 716.7, 210.6, 764.9, 221.5, 730.2, 210.1, 726.6,
-209.6, 688.4, 209.5, 676.0, 209.5, 676.0, 209.3, 663.7, 209.2, 655.4,
-209.0, 655.4, 209.1, 647.2, 466.7, 814.3, 468.7, 848.1, 466.7, 848.4,
-470.7, 882.0, 470.1, 884.5, 460.2, 884.2, 450.3, 882.5, 450.5, 882.6,
-450.8, 880.6, 451.3, 878.7, 459.0, 846.5, 464.5, 813.9, 466.7, 814.3,
-131.9, 102.5, 132.2, 103.4, 132.6, 103.2, 133.3, 103.9, 134.2, 104.8,
-134.2, 104.8, 135.1, 105.7, 136.0, 106.7, 136.0, 106.7, 136.9, 107.6,
-144.5, 115.4, 149.7, 114.0, 152.1, 123.1, 147.4, 125.8, 147.4, 125.8,
-142.6, 128.4, 133.5, 119.1, 136.9, 115.6, 131.9, 102.5, 172.1, 171.1,
-172.2, 172.5, 173.0, 173.1, 172.4, 174.0, 172.0, 175.3, 170.6, 175.3,
-170.7, 176.4, 170.5, 173.8, 170.6, 173.2, 172.1, 171.1, 188.5, 778.9,
-183.6, 784.8, 193.4, 790.8, 191.6, 801.6, 200.2, 807.9, 172.4, 831.7,
-175.5, 859.3, 176.2, 858.1, 164.7, 854.8, 164.5, 849.8, 163.8, 836.8,
-169.0, 836.5, 173.5, 823.2, 181.0, 801.1, 174.5, 795.6, 188.5, 778.9,
-124.4, 697.1, 123.6, 699.9, 136.9, 701.5, 137.3, 706.8, 135.6, 765.0,
-131.5, 765.1, 133.9, 823.2, 134.3, 819.7, 127.4, 820.2, 124.7, 815.1,
-126.5, 809.3, 123.7, 808.3, 122.4, 801.6, 120.3, 788.4, 120.1, 788.5,
-117.8, 775.3, 118.5, 736.2, 113.8, 734.1, 124.4, 697.1, 117.8, 775.3,
-117.4, 773.4, 117.4, 773.4, 117.1, 771.4, 109.1, 725.5, 98.5, 724.9,
-101.1, 679.7, 100.7, 686.7, 111.3, 687.3, 121.5, 694.9, 123.0, 696.0,
-124.5, 696.1, 124.4, 697.1, 113.8, 734.1, 118.5, 736.2, 117.8, 775.3,
-113.5, 633.8, 113.4, 625.4, 117.1, 625.4, 120.7, 617.0, 122.9, 611.8,
-126.2, 611.0, 125.1, 606.5, 123.9, 649.3, 152.3, 658.4, 137.8, 692.5,
-137.6, 699.6, 137.6, 699.6, 137.3, 706.8, 136.9, 701.5, 123.6, 699.9,
-124.4, 697.1, 124.5, 696.1, 123.0, 696.0, 121.5, 694.9, 116.3, 664.6,
-113.8, 664.4, 113.5, 633.8, 121.5, 694.9, 111.3, 687.3, 100.7, 686.7,
-101.1, 679.7, 100.1, 673.7, 100.0, 673.7, 99.0, 667.8, 98.9, 666.1,
-99.7, 666.1, 100.4, 664.5, 107.0, 649.1, 118.6, 641.1, 113.5, 633.8,
-113.8, 664.4, 116.3, 664.6, 121.5, 694.9, 104.7, 601.1, 108.5, 585.7,
-108.5, 585.7, 112.4, 570.4, 130.1, 523.1, 127.5, 522.1, 141.9, 473.6,
-141.9, 494.5, 141.9, 494.5, 141.9, 515.4, 129.0, 559.9, 126.7, 560.0,
-104.7, 601.1, 74.1, 373.8, 73.1, 372.4, 73.1, 372.4, 72.1, 371.0,
-72.8, 344.1, 73.9, 344.1, 75.7, 317.2, 75.8, 314.6, 76.0, 314.7,
-76.0, 312.1, 75.6, 328.2, 75.5, 328.2, 75.0, 344.2, 74.5, 359.0,
-75.7, 359.1, 74.1, 373.8, 38.1, 251.5, 39.2, 217.8, 39.2, 217.8,
-40.3, 184.2, 38.1, 193.9, 44.4, 195.3, 48.4, 206.4, 49.9, 210.5,
-49.9, 210.5, 51.4, 214.6, 53.3, 220.0, 53.3, 220.0, 55.3, 225.4,
-58.4, 225.5, 58.1, 233.2, 60.9, 240.9, 55.0, 249.8, 37.7, 250.5,
-38.1, 251.5, 69.5, 488.4, 63.0, 456.5, 60.5, 456.8, 56.6, 424.6,
-56.0, 421.4, 55.0, 421.2, 55.5, 418.2, 52.4, 400.5, 52.4, 400.5,
-49.3, 382.8, 48.7, 379.6, 48.7, 379.6, 48.2, 376.4, 46.4, 366.3,
-46.6, 366.3, 44.6, 356.3, 49.8, 382.7, 49.6, 382.7, 54.6, 409.2,
-62.0, 448.8, 64.4, 448.5, 69.5, 488.4, 104.4, 482.2, 105.1, 470.7,
-92.8, 469.9, 81.3, 457.6, 78.2, 454.3, 75.5, 454.7, 75.1, 451.0,
-72.7, 430.8, 69.3, 428.3, 75.8, 409.9, 73.3, 416.9, 79.5, 419.1,
-83.1, 428.3, 93.7, 455.2, 106.0, 456.0, 104.4, 482.2, 9.9, 492.8,
-9.9, 497.9, 7.7, 499.0, 9.8, 503.0, 5.2, 499.5, 3.7, 500.5,
-0.7, 495.9, -0.1, 494.8, -0.5, 495.0, -1.6, 494.1, -10.5, 465.3,
--13.6, 466.3, -25.5, 438.4, -20.0, 435.3, -28.1, 420.5, -30.6, 402.7,
--30.4, 406.9, -28.8, 406.8, -27.0, 410.9, -26.2, 412.5, -26.2, 412.5,
--25.5, 414.1, -7.8, 453.5, -6.0, 452.8, 9.9, 492.8, 23.2, 469.6,
-23.2, 474.4, 22.2, 474.7, 23.2, 479.3, 16.9, 463.2, 22.3, 456.0,
-10.6, 447.0, -2.7, 413.2, -2.5, 413.1, -15.8, 379.3, -17.1, 376.1,
--18.6, 372.9, -18.6, 372.9, -18.6, 372.9, -17.1, 376.1, -15.8, 379.3,
--10.6, 391.4, -10.6, 391.4, -5.3, 403.6, 8.9, 436.6, 10.5, 436.0,
-23.2, 469.6, 16.7, 353.2, 16.8, 359.2, 14.8, 360.0, 16.8, 365.3,
-9.7, 365.8, 1.8, 359.9, 1.7, 354.3, 1.7, 353.8, 12.1, 349.8,
-16.7, 353.2, 26.7, 394.2, 27.9, 354.8, 27.4, 354.7, 29.1, 315.3,
-29.9, 308.7, 29.9, 308.7, 30.7, 302.0, 29.3, 347.1, 28.7, 347.1,
-26.8, 392.2, 26.7, 393.2, 26.7, 393.2, 26.7, 394.2, 51.0, 462.5,
-48.9, 484.0, 40.6, 486.7, 46.7, 505.5, 39.6, 496.9, 38.9, 497.4,
-32.4, 488.3, 31.2, 486.7, 30.0, 486.7, 30.0, 485.1, 29.1, 470.9,
-29.1, 470.9, 28.1, 456.8, 34.9, 416.1, 36.8, 416.2, 48.2, 376.4,
-48.7, 379.6, 48.7, 379.6, 49.3, 382.8, 50.6, 422.6, 51.9, 422.7,
-51.0, 462.5, 49.3, 382.8, 52.4, 400.5, 52.4, 400.5, 55.5, 418.2,
-52.2, 440.2, 53.2, 440.3, 51.0, 462.5, 51.9, 422.7, 50.6, 422.6,
-49.3, 382.8, 43.3, 684.7, 30.8, 668.9, 32.9, 655.3, 18.3, 653.0,
-14.0, 646.2, 10.3, 640.7, 13.1, 637.2, 17.9, 641.9, 21.0, 638.8,
-28.8, 640.3, 40.9, 659.4, 51.2, 675.0, 43.3, 684.7, 713.3, 489.1,
-712.7, 488.6, 713.1, 488.1, 713.0, 487.0, 713.6, 472.0, 710.3, 471.8,
-707.6, 456.6, 726.2, 469.7, 719.9, 478.6, 732.3, 500.6, 732.8, 501.5,
-732.5, 501.9, 733.3, 502.3, 728.0, 499.4, 728.2, 499.0, 723.2, 495.6,
-718.2, 492.3, 717.8, 492.9, 713.3, 489.1, 752.2, 518.9, 756.0, 528.8,
-751.3, 539.8, 754.8, 540.6, 745.8, 538.6, 748.0, 528.5, 741.2, 516.5,
-739.2, 512.8, 736.7, 509.4, 737.1, 509.1, 738.4, 508.1, 740.9, 511.5,
-744.7, 514.0, 748.4, 516.4, 750.9, 515.5, 752.2, 518.9, 839.3, 624.0,
-867.6, 630.5, 867.6, 630.8, 895.8, 637.6, 900.4, 638.7, 903.8, 641.2,
-904.9, 639.8, 891.5, 650.5, 891.5, 650.5, 878.0, 661.2, 856.0, 656.1,
-859.1, 643.0, 840.1, 624.8, 839.7, 624.4, 839.8, 624.1, 839.3, 624.0,
-835.3, 566.8, 835.3, 566.8, 836.0, 567.4, 836.7, 568.0, 857.1, 585.8,
-857.1, 585.8, 877.5, 603.6, 892.3, 616.5, 892.3, 616.5, 907.1, 629.4,
-907.1, 629.8, 907.7, 629.7, 907.8, 630.0, 910.0, 632.0, 912.3, 632.1,
-912.2, 633.9, 909.8, 635.8, 909.8, 635.8, 907.5, 637.7, 884.6, 619.5,
-886.4, 617.2, 865.4, 596.6, 865.0, 596.2, 865.1, 596.1, 864.8, 595.8,
-852.2, 583.3, 852.1, 583.4, 839.5, 570.9, 838.1, 569.5, 838.2, 569.5,
-836.7, 568.0, 836.0, 567.4, 835.3, 566.8, 835.3, 566.8, 845.9, 561.2,
-855.0, 547.1, 858.7, 547.4, 874.5, 539.8, 876.3, 539.0, 881.2, 544.2,
-881.1, 544.3, 877.6, 549.8, 874.2, 547.6, 867.3, 550.9, 856.6, 556.1,
-851.4, 552.7, 845.9, 561.2, 819.2, 520.3, 819.5, 519.3, 820.2, 518.7,
-819.7, 518.2, 817.7, 516.8, 825.6, 507.8, 823.0, 504.7, 839.9, 508.5,
-838.4, 515.2, 853.8, 525.7, 864.1, 532.8, 875.5, 535.3, 874.5, 539.8,
-858.7, 547.4, 855.0, 547.1, 845.9, 561.2, 842.7, 563.6, 839.5, 565.7,
-839.6, 565.9, 826.2, 545.2, 828.8, 543.4, 819.2, 520.3, 839.6, 565.9,
-839.8, 566.4, 838.3, 567.7, 836.7, 568.0, 836.0, 567.4, 835.3, 566.8,
-835.3, 566.8, 824.6, 557.5, 824.6, 557.5, 813.9, 548.1, 813.3, 547.6,
-812.6, 547.5, 812.7, 547.1, 814.9, 535.3, 815.5, 535.4, 818.4, 523.8,
-819.5, 522.9, 818.8, 522.1, 819.2, 520.3, 828.8, 543.4, 826.2, 545.2,
-839.6, 565.9, 906.6, 622.8, 904.8, 612.1, 903.9, 612.2, 903.1, 601.5,
-900.4, 583.4, 900.5, 583.4, 897.9, 565.3, 897.9, 565.1, 897.9, 565.1,
-897.9, 564.9, 899.5, 575.6, 899.5, 575.6, 901.1, 586.3, 903.8, 604.5,
-904.2, 604.5, 906.6, 622.8, 597.3, 353.4, 614.7, 388.9, 604.2, 402.0,
-632.1, 424.4, 634.1, 450.4, 634.1, 450.4, 636.1, 476.4, 636.0, 474.9,
-635.6, 474.9, 635.2, 473.4, 630.7, 459.4, 630.7, 459.4, 626.3, 445.3,
-611.8, 399.4, 586.5, 392.3, 597.3, 353.4, 690.4, 580.0, 687.8, 583.4,
-684.6, 584.2, 685.3, 586.9, 684.2, 587.1, 681.3, 582.6, 682.0, 581.7,
-683.9, 579.2, 689.6, 578.7, 690.4, 580.0, 911.3, 564.9, 903.7, 560.0,
-903.9, 559.8, 896.4, 554.7, 894.9, 553.7, 894.4, 554.0, 893.3, 552.6,
-892.7, 551.8, 893.2, 551.5, 893.0, 550.3, 892.0, 543.8, 892.0, 543.8,
-891.0, 537.3, 890.9, 536.6, 891.2, 536.4, 890.9, 536.0, 895.6, 542.1,
-895.3, 542.3, 899.8, 548.7, 905.1, 556.1, 905.1, 556.1, 910.3, 563.5,
-910.4, 563.6, 910.4, 563.6, 910.5, 563.7, 910.9, 564.3, 910.8, 564.5,
-911.3, 564.9, 881.4, 472.9, 881.6, 434.2, 875.4, 434.2, 869.9, 395.5,
-869.9, 395.5, 869.9, 393.4, 869.9, 391.2, 876.0, 432.0, 881.6, 432.1,
-881.4, 472.9, 921.6, 407.7, 923.8, 415.2, 923.8, 415.2, 926.0, 422.7,
-938.8, 442.6, 928.9, 449.0, 931.8, 475.4, 930.9, 463.2, 930.0, 463.3,
-928.2, 451.2, 924.9, 429.4, 923.3, 429.6, 921.6, 407.7, 903.7, 346.4,
-908.9, 364.0, 920.2, 370.0, 914.0, 381.7, 914.0, 382.1, 914.0, 382.4,
-914.3, 382.6, 916.1, 382.5, 916.7, 390.9, 919.1, 399.2, 917.7, 404.6,
-913.4, 403.5, 907.7, 407.8, 901.1, 412.8, 896.0, 419.1, 894.4, 417.8,
-884.3, 409.7, 889.3, 403.4, 884.2, 389.0, 883.6, 387.4, 882.6, 387.0,
-883.1, 385.9, 892.3, 365.7, 890.9, 348.1, 903.7, 346.4, 842.4, 342.0,
-835.8, 345.6, 835.8, 345.6, 829.3, 349.3, 794.5, 342.5, 790.2, 357.7,
-752.8, 370.9, 776.8, 355.0, 776.8, 355.0, 800.7, 339.1, 819.2, 333.1,
-823.5, 335.2, 842.4, 342.0, 800.7, 339.1, 825.7, 322.5, 823.3, 315.5,
-850.7, 305.9, 851.2, 305.7, 851.6, 305.3, 851.6, 305.3, 853.8, 304.2,
-856.0, 302.9, 856.1, 303.1, 853.5, 305.6, 856.6, 309.4, 858.0, 315.5,
-857.8, 323.7, 859.2, 323.7, 860.4, 331.9, 852.6, 330.4, 851.4, 336.9,
-842.4, 342.0, 823.5, 335.2, 819.2, 333.1, 800.7, 339.1, 847.6, 351.2,
-855.0, 348.4, 858.9, 351.0, 862.4, 345.6, 862.8, 348.1, 862.8, 348.1,
-863.2, 350.6, 856.3, 353.2, 847.8, 352.0, 847.6, 351.2, 765.4, 446.9,
-783.7, 457.2, 781.5, 461.2, 797.5, 475.5, 815.2, 491.3, 815.2, 491.3,
-832.8, 507.0, 837.8, 511.5, 837.8, 511.5, 842.9, 516.0, 848.3, 520.8,
-847.5, 522.2, 853.8, 525.7, 838.4, 515.2, 839.9, 508.5, 823.0, 504.7,
-809.3, 488.9, 785.4, 487.8, 787.2, 480.4, 767.8, 463.2, 767.8, 459.9,
-744.0, 451.0, 728.2, 440.2, 728.2, 440.2, 712.4, 429.4, 706.9, 425.7,
-706.9, 425.7, 701.5, 422.0, 700.7, 419.7, 698.9, 420.3, 696.4, 418.5,
-731.1, 432.1, 733.1, 428.7, 765.4, 446.9, 696.4, 418.5, 692.6, 416.0,
-692.6, 416.0, 688.8, 413.4, 690.9, 414.1, 693.6, 408.7, 694.7, 409.5,
-695.3, 409.6, 695.5, 409.0, 696.2, 408.5, 702.9, 402.3, 705.4, 405.0,
-714.5, 401.6, 743.6, 417.7, 763.2, 449.1, 765.4, 446.9, 733.1, 428.7,
-731.1, 432.1, 696.4, 418.5, 493.2, 122.4, 496.6, 123.8, 497.6, 121.5,
-502.0, 120.5, 507.0, 119.4, 507.6, 117.2, 512.1, 118.4, 515.0, 119.1,
-517.6, 122.8, 516.9, 124.3, 516.4, 125.4, 513.3, 124.0, 509.6, 123.7,
-501.4, 123.1, 500.4, 125.4, 493.2, 122.4, 600.5, 240.3, 575.0, 209.0,
-581.3, 186.8, 549.5, 177.8, 540.1, 159.5, 541.2, 158.9, 530.8, 141.2,
-553.1, 149.7, 548.2, 162.6, 565.6, 183.9, 571.2, 189.2, 570.5, 189.8,
-575.4, 195.8, 588.8, 217.5, 581.6, 227.2, 600.5, 240.3, 575.4, 195.8,
-604.4, 231.3, 601.5, 234.1, 633.4, 266.7, 639.4, 274.1, 639.4, 274.1,
-645.4, 281.4, 659.5, 298.6, 659.5, 298.6, 673.5, 315.8, 673.6, 315.8,
-673.6, 315.8, 673.6, 315.9, 685.1, 330.0, 687.0, 328.8, 696.7, 344.0,
-692.1, 336.9, 690.2, 338.1, 683.8, 332.1, 667.6, 314.8, 666.4, 315.9,
-649.0, 299.7, 637.5, 265.7, 624.8, 270.0, 600.5, 240.3, 581.6, 227.2,
-588.8, 217.5, 575.4, 195.8, 903.1, 280.6, 895.2, 284.4, 895.2, 284.4,
-887.3, 288.2, 883.2, 288.4, 883.0, 285.2, 878.8, 282.3, 854.6, 265.6,
-854.6, 265.6, 830.4, 249.0, 825.3, 245.5, 825.3, 245.5, 820.2, 241.9,
-794.8, 224.5, 794.8, 224.5, 769.5, 207.0, 768.4, 206.2, 768.4, 206.2,
-767.2, 205.4, 760.5, 200.8, 761.2, 199.3, 753.8, 196.2, 766.9, 201.7,
-766.2, 203.2, 778.7, 210.2, 792.9, 218.3, 792.9, 218.3, 807.2, 226.4,
-812.6, 229.4, 812.6, 229.4, 817.9, 232.4, 842.6, 246.4, 842.6, 246.4,
-867.2, 260.3, 875.7, 265.1, 875.7, 265.1, 884.2, 269.9, 892.2, 274.4,
-892.2, 274.4, 900.1, 278.9, 901.6, 279.7, 902.5, 281.0, 903.1, 280.6,
-517.7, 117.1, 520.7, 121.1, 529.1, 114.7, 540.5, 112.3, 547.4, 111.5,
-547.3, 110.8, 554.1, 109.4, 555.5, 109.5, 555.2, 111.7, 556.4, 114.1,
-567.2, 135.5, 567.2, 135.5, 578.0, 156.8, 579.1, 158.9, 579.1, 158.9,
-580.1, 161.0, 582.9, 166.5, 581.2, 168.9, 585.7, 172.0, 550.0, 147.0,
-543.3, 151.0, 517.7, 117.1, 599.6, 253.8, 603.6, 257.5, 603.6, 257.5,
-607.6, 261.2, 639.4, 295.1, 640.0, 294.7, 674.0, 326.3, 671.5, 323.8,
-670.3, 325.0, 667.7, 322.6, 653.1, 308.9, 653.6, 308.4, 639.5, 294.1,
-619.6, 274.0, 619.4, 274.2, 599.6, 253.8, 701.4, 377.5, 684.8, 385.5,
-684.8, 385.5, 668.1, 393.5, 665.9, 393.6, 665.6, 386.2, 663.1, 378.8,
-655.2, 355.4, 654.4, 331.7, 647.2, 331.9, 673.6, 331.1, 691.7, 348.8,
-701.4, 377.5, 439.9, 203.6, 440.2, 203.0, 439.1, 202.4, 438.3, 201.1,
-437.8, 193.7, 427.2, 190.5, 429.1, 186.9, 422.4, 176.3, 422.4, 176.3,
-415.7, 165.8, 412.5, 160.9, 412.5, 160.9, 409.4, 156.0, 409.6, 155.6,
-408.9, 154.9, 408.1, 154.0, 404.3, 148.1, 400.6, 148.2, 400.6, 142.2,
-404.3, 142.2, 404.3, 141.4, 408.0, 140.6, 430.6, 159.3, 436.6, 157.6,
-449.3, 182.6, 452.6, 189.1, 445.7, 193.8, 439.9, 203.6, 600.1, 84.9,
-599.4, 84.6, 599.2, 84.1, 598.7, 84.3, 616.0, 76.2, 619.2, 79.9,
-633.3, 68.0, 674.9, 71.6, 691.3, 60.0, 720.8, 26.7, 723.0, 27.1,
-724.0, 26.2, 725.3, 27.5, 726.3, 27.9, 726.7, 29.3, 727.1, 29.1,
-715.7, 35.3, 715.2, 34.3, 703.4, 39.5, 701.1, 40.5, 701.1, 40.5,
-698.9, 41.5, 662.7, 57.4, 662.7, 57.4, 626.5, 73.3, 613.3, 79.1,
-613.5, 79.6, 600.1, 84.9, 557.4, 100.7, 550.2, 105.6, 550.9, 107.4,
-543.0, 110.6, 541.7, 111.2, 541.8, 112.1, 540.5, 112.3, 529.1, 114.7,
-520.7, 121.1, 517.7, 117.1, 514.9, 117.8, 514.9, 117.8, 512.1, 118.4,
-507.6, 117.2, 507.0, 119.4, 502.0, 120.5, 503.0, 121.8, 506.6, 118.9,
-511.2, 117.2, 534.3, 109.0, 533.6, 105.7, 557.4, 100.7, 387.3, 116.0,
-362.5, 54.7, 365.8, 53.1, 337.7, -6.6, 335.7, -12.3, 336.3, -17.9,
-333.7, -18.1, 341.8, -20.2, 341.8, -20.2, 349.8, -22.3, 351.7, -22.3,
-352.8, -20.5, 353.5, -18.0, 364.2, 19.6, 363.0, 19.9, 372.6, 57.9,
-374.7, 66.1, 374.7, 66.1, 376.8, 74.3, 379.0, 83.0, 379.0, 83.0,
-381.2, 91.7, 383.3, 100.2, 383.3, 100.2, 385.5, 108.7, 386.4, 112.4,
-385.9, 112.6, 387.3, 116.0, 428.6, -42.8, 428.6, -42.8, 430.6, -43.3,
-432.7, -43.8, 451.1, -48.9, 451.2, -48.4, 469.8, -53.0, 451.2, -48.4,
-451.1, -48.9, 432.7, -43.8, 430.6, -43.3, 428.6, -42.8, 428.6, -42.8,
-215.0, 260.7, 214.8, 260.9, 214.4, 260.4, 213.8, 260.1, 214.0, 259.0,
-206.6, 257.2, 206.8, 256.7, 215.1, 227.9, 215.0, 227.9, 223.1, 199.1,
-223.1, 199.1, 232.3, 166.6, 241.5, 134.0, 245.6, 119.3, 245.6, 119.3,
-249.8, 104.6, 253.8, 90.4, 253.9, 90.4, 257.9, 76.1, 257.0, 79.3,
-257.2, 79.3, 256.4, 82.5, 248.0, 118.7, 248.0, 118.7, 239.6, 154.9,
-232.4, 185.6, 232.4, 185.6, 225.3, 216.3, 225.1, 217.0, 225.1, 217.0,
-225.0, 217.7, 220.2, 238.1, 220.2, 238.1, 215.5, 258.6, 215.2, 259.7,
-215.6, 260.1, 215.0, 260.7, 142.3, 443.2, 142.0, 441.3, 141.8, 441.3,
-141.8, 439.5, 136.9, 394.0, 135.5, 394.1, 129.3, 348.8, 129.9, 332.1,
-133.8, 320.3, 146.4, 316.0, 141.9, 317.5, 146.0, 329.6, 145.6, 343.2,
-143.9, 393.2, 144.3, 393.2, 142.3, 443.2, 192.0, 145.4, 196.4, 139.0,
-200.1, 132.2, 200.8, 132.6, 202.0, 132.5, 202.9, 131.1, 202.9, 129.5,
-229.0, 115.3, 223.0, 102.9, 240.6, 74.8, 246.6, 67.8, 245.9, 67.1,
-251.1, 59.5, 244.4, 70.9, 245.2, 71.4, 239.2, 83.3, 236.4, 88.2,
-235.7, 87.8, 232.3, 92.4, 212.1, 118.9, 212.5, 119.2, 192.0, 145.4,
-470.3, 647.3, 471.5, 660.3, 471.7, 660.3, 472.9, 673.2, 473.3, 677.4,
-473.3, 677.4, 473.7, 681.5, 473.9, 684.3, 474.0, 684.3, 474.2, 687.1,
-474.9, 695.0, 474.8, 695.0, 475.5, 702.9, 468.6, 699.9, 471.3, 693.5,
-467.1, 684.1, 466.6, 682.9, 466.6, 682.9, 466.1, 681.7, 464.4, 678.0,
-464.4, 678.0, 462.8, 674.3, 461.2, 670.9, 460.0, 671.0, 459.7, 667.4,
-454.0, 587.3, 454.4, 587.2, 448.3, 507.2, 447.9, 501.2, 448.0, 501.2,
-447.6, 495.3, 446.7, 480.6, 448.0, 480.4, 445.8, 465.9, 459.4, 556.4,
-458.5, 556.6, 470.3, 647.3, 445.8, 465.9, 444.2, 452.7, 445.1, 452.6,
-444.3, 439.3, 443.4, 424.6, 443.4, 424.6, 442.5, 409.9, 442.2, 404.5,
-442.2, 404.5, 441.8, 399.1, 440.9, 383.7, 440.9, 383.7, 440.0, 368.4,
-440.0, 367.4, 440.0, 367.4, 439.9, 366.4, 436.0, 301.4, 432.8, 301.4,
-432.1, 236.3, 432.5, 271.5, 435.8, 271.5, 439.3, 306.7, 441.3, 329.1,
-441.3, 329.1, 443.4, 351.4, 443.9, 357.8, 443.9, 357.8, 444.5, 364.1,
-444.8, 366.7, 444.8, 366.7, 445.0, 369.4, 446.9, 389.4, 446.9, 389.4,
-448.7, 409.5, 452.1, 447.0, 452.1, 447.0, 455.6, 484.5, 456.5, 494.1,
-456.5, 494.1, 457.3, 503.6, 461.1, 544.5, 461.1, 544.5, 464.8, 585.3,
-466.5, 603.5, 466.6, 603.5, 468.2, 621.6, 469.3, 634.5, 469.2, 634.5,
-470.3, 647.3, 458.5, 556.6, 459.4, 556.4, 445.8, 465.9, 465.1, 743.6,
-462.4, 705.5, 462.4, 705.5, 459.7, 667.4, 460.0, 671.0, 461.2, 670.9,
-462.8, 674.3, 463.8, 680.1, 463.0, 680.2, 463.2, 686.2, 464.1, 714.9,
-459.9, 715.7, 465.1, 743.6, 519.2, 392.8, 519.8, 404.6, 512.4, 405.1,
-505.5, 417.3, 505.6, 417.1, 505.4, 417.0, 505.5, 416.9, 512.2, 404.8,
-519.7, 404.5, 519.2, 392.8, 210.2, 770.6, 213.3, 782.9, 209.2, 783.9,
-208.2, 797.2, 205.3, 838.2, 215.2, 875.8, 202.3, 879.2, 197.0, 840.4,
-213.6, 817.8, 191.6, 801.6, 193.4, 790.8, 183.6, 784.8, 188.5, 778.9,
-187.3, 770.3, 187.3, 770.3, 186.1, 761.7, 185.4, 756.6, 185.4, 756.6,
-184.7, 751.5, 184.6, 751.1, 184.7, 751.0, 184.6, 750.6, 192.1, 756.1,
-191.9, 756.3, 199.2, 762.1, 204.7, 766.3, 208.8, 765.3, 210.2, 770.6,
-156.0, 542.8, 153.2, 522.1, 153.2, 522.1, 150.3, 501.5, 169.4, 477.1,
-168.7, 476.5, 187.1, 451.5, 174.1, 457.5, 180.4, 471.0, 173.8, 490.6,
-173.3, 491.8, 173.3, 491.8, 172.9, 493.1, 172.9, 493.2, 172.9, 493.2,
-172.8, 493.4, 170.6, 500.0, 170.6, 500.0, 168.3, 506.7, 165.8, 514.0,
-165.8, 514.0, 163.3, 521.4, 159.6, 532.1, 152.2, 536.9, 156.0, 542.8,
-224.3, 529.2, 225.0, 523.0, 227.6, 517.0, 228.5, 517.2, 229.2, 517.3,
-228.1, 523.5, 227.6, 529.8, 227.1, 537.3, 227.1, 537.3, 226.5, 544.9,
-223.5, 586.4, 225.4, 586.6, 220.5, 627.8, 217.3, 628.6, 218.1, 631.9,
-215.7, 636.0, 217.8, 582.5, 218.6, 582.4, 224.3, 529.2, 348.9, 883.3,
-337.1, 885.5, 330.9, 889.1, 324.4, 882.9, 320.9, 879.5, 326.7, 873.5,
-329.0, 864.1, 329.5, 862.2, 329.5, 862.2, 329.9, 860.4, 336.9, 831.8,
-354.5, 813.4, 343.8, 803.1, 363.8, 822.4, 346.2, 840.7, 348.6, 878.3,
-348.7, 880.8, 349.2, 883.2, 348.9, 883.3, 415.7, 165.8, 422.4, 176.3,
-422.4, 176.3, 429.1, 186.9, 423.5, 197.5, 429.9, 201.0, 430.8, 215.1,
-431.2, 225.7, 431.1, 225.7, 432.1, 236.3, 432.8, 301.4, 436.0, 301.4,
-439.9, 366.4, 439.3, 344.4, 437.2, 344.4, 434.6, 322.4, 429.7, 281.8,
-429.7, 281.8, 424.8, 241.2, 422.1, 218.7, 422.1, 218.7, 419.4, 196.3,
-417.8, 183.6, 417.8, 183.6, 416.3, 171.0, 416.0, 168.4, 417.1, 167.5,
-415.7, 165.8, 101.2, 144.6, 99.2, 144.7, 92.1, 120.2, 94.7, 97.2,
-103.9, 91.9, 101.6, 87.9, 108.5, 78.6, 110.8, 77.7, 113.0, 83.2,
-117.6, 87.9, 121.3, 91.7, 125.8, 93.0, 125.1, 95.6, 117.7, 121.4,
-114.4, 143.8, 101.2, 144.6, 125.1, 95.6, 124.6, 96.2, 129.7, 98.4,
-131.9, 102.5, 136.9, 115.6, 133.5, 119.1, 142.6, 128.4, 137.9, 130.9,
-134.7, 129.7, 133.2, 133.5, 117.6, 142.0, 118.6, 144.8, 102.0, 150.6,
-102.6, 150.4, 100.2, 147.0, 101.2, 144.6, 114.4, 143.8, 117.7, 121.4,
-125.1, 95.6, 117.6, 87.9, 113.0, 83.2, 110.8, 77.7, 108.5, 78.6,
-120.5, 62.4, 130.6, 63.5, 132.6, 46.2, 136.3, 47.5, 137.3, 46.4,
-140.0, 48.9, 141.8, 49.5, 141.8, 49.5, 143.5, 50.2, 158.4, 55.7,
-158.7, 55.1, 173.3, 61.2, 173.1, 61.1, 172.9, 61.9, 172.3, 62.2,
-145.1, 75.3, 146.4, 80.5, 117.6, 87.9, 172.3, 62.2, 164.6, 64.4,
-165.9, 69.1, 159.4, 76.0, 146.4, 90.0, 147.1, 90.7, 133.3, 103.9,
-132.6, 103.2, 132.2, 103.4, 131.9, 102.5, 129.7, 98.4, 124.6, 96.2,
-125.1, 95.6, 125.8, 93.0, 121.3, 91.7, 117.6, 87.9, 146.4, 80.5,
-145.1, 75.3, 172.3, 62.2, 135.1, 105.7, 134.2, 104.8, 134.2, 104.8,
-133.3, 103.9, 147.1, 90.7, 146.4, 90.0, 159.4, 76.0, 160.9, 77.5,
-148.2, 91.7, 135.1, 105.7, 143.5, 50.2, 141.8, 49.5, 141.8, 49.5,
-140.0, 48.9, 132.1, 41.6, 132.0, 40.2, 122.0, 36.6, 158.4, 27.2,
-158.4, 27.2, 194.7, 17.8, 195.2, 17.7, 195.2, 17.7, 195.7, 17.5,
-195.6, 18.0, 195.1, 17.9, 194.6, 18.2, 169.0, 34.2, 169.7, 35.4,
-143.5, 50.2, 210.8, 66.8, 207.8, 66.4, 207.8, 66.4, 204.7, 66.0,
-205.6, 39.5, 199.5, 33.8, 212.6, 13.1, 227.9, 9.2, 227.9, 9.2,
-243.2, 5.2, 235.9, 15.3, 241.7, 19.5, 240.1, 33.8, 230.1, 52.8,
-227.1, 52.1, 210.8, 66.8, 240.1, 33.8, 239.6, 38.3, 241.4, 39.6,
-239.1, 42.7, 234.1, 55.0, 237.6, 56.4, 236.1, 70.1, 225.0, 65.1,
-223.5, 68.4, 210.8, 66.8, 227.1, 52.1, 230.1, 52.8, 240.1, 33.8,
-169.9, 145.9, 171.0, 158.5, 171.0, 158.5, 172.1, 171.1, 170.6, 173.2,
-170.5, 173.8, 170.7, 176.4, 169.6, 178.8, 169.5, 178.8, 167.7, 180.7,
-135.3, 199.1, 139.8, 207.9, 113.9, 236.9, 114.0, 236.7, 113.7, 236.5,
-113.8, 236.3, 141.7, 191.0, 135.0, 185.0, 169.9, 145.9, 142.6, 822.9,
-142.5, 811.8, 142.5, 811.8, 142.5, 800.7, 139.1, 739.4, 143.1, 739.2,
-143.6, 677.7, 143.1, 739.2, 139.1, 739.4, 142.5, 800.7, 142.5, 811.8,
-142.5, 811.8, 142.6, 822.9, 100.4, 664.5, 99.7, 666.1, 98.9, 666.1,
-99.0, 667.8, 96.8, 655.3, 96.8, 655.3, 94.7, 642.9, 94.4, 641.6,
-94.8, 641.5, 95.0, 640.0, 94.9, 629.7, 97.5, 629.7, 100.1, 619.4,
-104.9, 640.9, 100.9, 641.9, 100.4, 664.5, 107.3, 369.1, 122.8, 412.0,
-109.9, 423.8, 138.4, 454.9, 138.8, 458.8, 138.1, 459.0, 139.2, 462.7,
-139.3, 461.7, 138.0, 461.7, 137.6, 460.5, 133.2, 448.6, 133.6, 448.4,
-129.6, 436.3, 118.4, 402.7, 122.3, 400.9, 107.3, 369.1, 38.1, 318.9,
-37.1, 313.2, 37.1, 313.2, 36.1, 307.5, 41.0, 287.6, 38.8, 286.4,
-37.6, 265.6, 36.7, 258.7, 37.8, 258.5, 38.1, 251.5, 37.7, 250.5,
-55.0, 249.8, 60.9, 240.9, 64.0, 249.4, 64.0, 249.4, 67.0, 257.9,
-67.4, 260.4, 65.7, 260.7, 64.4, 263.4, 62.8, 266.8, 62.8, 266.8,
-61.2, 270.1, 49.7, 294.5, 53.0, 296.7, 38.1, 318.9, 75.3, 375.5,
-75.1, 375.7, 76.4, 376.3, 76.5, 377.0, 76.7, 393.4, 76.1, 393.5,
-75.8, 409.9, 69.3, 428.3, 72.7, 430.8, 75.1, 451.0, 74.5, 479.7,
-74.5, 479.7, 74.0, 508.4, 74.0, 509.4, 73.7, 509.4, 73.9, 510.3,
-72.6, 499.3, 71.7, 499.4, 69.5, 488.4, 64.4, 448.5, 62.0, 448.8,
-54.6, 409.2, 55.5, 391.8, 64.2, 391.8, 75.3, 375.5, 54.6, 409.2,
-49.6, 382.7, 49.8, 382.7, 44.6, 356.3, 44.4, 354.9, 44.9, 354.0,
-44.2, 353.6, 59.7, 362.8, 59.2, 363.6, 74.1, 373.8, 74.2, 373.9,
-74.1, 374.0, 74.3, 374.1, 74.8, 374.8, 75.5, 375.2, 75.3, 375.5,
-64.2, 391.8, 55.5, 391.8, 54.6, 409.2, 124.4, 503.4, 112.1, 498.8,
-111.2, 494.5, 104.4, 482.2, 106.0, 456.0, 93.7, 455.2, 83.1, 428.3,
-106.5, 437.0, 99.0, 457.2, 114.9, 486.1, 119.6, 494.7, 117.4, 500.8,
-124.4, 503.4, 81.3, 457.6, 92.8, 469.9, 105.1, 470.7, 104.4, 482.2,
-111.2, 494.5, 112.1, 498.8, 124.4, 503.4, 124.6, 503.6, 124.8, 503.8,
-124.8, 503.8, 118.5, 510.7, 114.8, 518.5, 111.8, 517.1, 102.1, 512.9,
-105.6, 505.0, 99.3, 492.8, 90.3, 475.2, 76.1, 468.4, 81.3, 457.6,
-96.7, 598.9, 93.4, 608.1, 90.6, 608.0, 90.2, 617.3, 87.2, 600.2,
-88.1, 600.0, 84.2, 583.1, 83.7, 575.4, 82.9, 575.5, 81.6, 567.8,
-92.0, 581.1, 93.8, 582.6, 96.7, 598.9, 10.2, 469.4, 10.1, 481.1,
-10.1, 481.1, 9.9, 492.8, -6.0, 452.8, -7.8, 453.5, -25.5, 414.1,
--25.9, 441.5, -3.1, 439.7, 10.2, 469.4, 22.9, 401.7, 23.1, 435.6,
-23.1, 435.6, 23.2, 469.6, 10.5, 436.0, 8.9, 436.6, -5.3, 403.6,
--5.3, 402.7, 21.1, 397.3, 22.9, 401.7, 16.6, 341.0, 16.6, 347.1,
-16.6, 347.1, 16.7, 353.2, 12.1, 349.8, 1.7, 353.8, 1.7, 354.3,
--2.9, 353.3, -5.9, 347.4, -6.7, 348.2, 1.5, 340.8, 6.2, 338.8,
-16.6, 341.0, 41.7, 339.3, 42.9, 346.4, 40.0, 349.1, 44.2, 353.6,
-44.9, 354.0, 44.4, 354.9, 44.6, 356.3, 46.6, 366.3, 46.4, 366.3,
-48.2, 376.4, 36.8, 416.2, 34.9, 416.1, 28.1, 456.8, 27.0, 439.3,
-27.0, 439.3, 25.8, 421.8, 20.2, 411.2, 26.2, 408.0, 26.7, 394.2,
-26.7, 393.2, 26.7, 393.2, 26.8, 392.2, 34.0, 365.7, 30.5, 364.1,
-41.7, 339.3, 26.8, 392.2, 28.7, 347.1, 29.3, 347.1, 30.7, 302.0,
-30.7, 301.8, 30.7, 301.8, 30.7, 301.5, 32.8, 313.5, 34.8, 313.2,
-39.1, 324.7, 39.4, 325.6, 39.3, 325.6, 39.5, 326.5, 43.2, 329.6,
-40.6, 332.9, 41.7, 339.3, 30.5, 364.1, 34.0, 365.7, 26.8, 392.2,
-55.9, 700.7, 49.6, 692.7, 49.6, 692.7, 43.3, 684.7, 51.2, 675.0,
-40.9, 659.4, 28.8, 640.3, 35.6, 641.6, 35.6, 641.6, 42.5, 643.0,
-49.8, 654.0, 45.7, 656.7, 48.9, 670.5, 49.3, 672.3, 49.3, 672.3,
-49.7, 674.1, 52.8, 687.4, 61.0, 692.4, 55.9, 700.7, 782.5, 583.1,
-784.1, 591.8, 781.5, 601.4, 777.5, 602.0, 768.9, 594.4, 768.9, 594.4,
-760.4, 586.8, 759.7, 586.2, 760.7, 585.0, 760.1, 584.4, 759.3, 578.0,
-759.3, 578.0, 758.5, 571.7, 756.7, 556.1, 756.7, 556.1, 754.8, 540.6,
-751.3, 539.8, 756.0, 528.8, 752.2, 518.9, 751.4, 512.5, 751.4, 512.5,
-750.7, 506.1, 750.4, 503.8, 751.0, 503.5, 750.1, 501.5, 758.6, 521.0,
-758.0, 521.3, 765.8, 541.1, 774.1, 562.1, 778.3, 561.3, 782.5, 583.1,
-797.6, 609.5, 797.4, 609.5, 797.2, 611.1, 796.8, 612.7, 796.7, 613.2,
-796.7, 613.2, 796.5, 613.7, 796.0, 615.9, 795.4, 618.0, 795.5, 618.0,
-792.8, 613.9, 791.7, 614.6, 787.9, 611.3, 788.4, 609.3, 793.0, 608.8,
-797.6, 609.5, 741.2, 516.5, 748.0, 528.5, 745.8, 538.6, 754.8, 540.6,
-756.7, 556.1, 756.7, 556.1, 758.5, 571.7, 744.7, 547.0, 744.6, 544.7,
-741.2, 516.5, 712.4, 429.4, 728.2, 440.2, 728.2, 440.2, 744.0, 451.0,
-747.0, 452.1, 744.9, 457.9, 745.7, 464.8, 726.1, 451.4, 714.7, 448.8,
-712.4, 429.4, 790.4, 654.6, 788.9, 653.1, 787.0, 652.4, 787.3, 651.6,
-788.2, 647.9, 787.8, 644.4, 789.1, 644.2, 795.2, 639.9, 791.5, 634.7,
-793.8, 625.1, 795.5, 639.4, 793.9, 640.3, 790.4, 654.6, 864.8, 595.8,
-886.2, 616.7, 887.3, 615.6, 907.5, 637.7, 906.2, 638.7, 906.2, 638.7,
-904.9, 639.8, 903.8, 641.2, 900.4, 638.7, 895.8, 637.6, 878.7, 618.8,
-880.6, 617.1, 865.4, 596.6, 865.0, 596.2, 865.1, 596.1, 864.8, 595.8,
-867.3, 550.9, 874.2, 547.6, 877.6, 549.8, 881.1, 544.3, 882.5, 544.0,
-882.9, 545.5, 884.7, 546.7, 889.0, 549.7, 889.0, 549.7, 893.3, 552.6,
-894.4, 554.0, 894.9, 553.7, 896.4, 554.7, 898.2, 559.5, 897.2, 559.8,
-897.9, 564.9, 897.9, 565.1, 897.9, 565.1, 897.9, 565.3, 887.3, 560.5,
-887.4, 560.3, 876.8, 555.4, 872.1, 553.1, 867.2, 551.2, 867.3, 550.9,
-944.3, 587.3, 944.5, 587.5, 944.7, 587.5, 944.7, 587.6, 944.5, 594.2,
-941.1, 599.0, 944.0, 600.9, 941.0, 598.8, 944.0, 594.1, 944.3, 587.3,
-699.3, 568.1, 694.8, 574.1, 694.8, 574.1, 690.4, 580.0, 689.6, 578.7,
-683.9, 579.2, 682.0, 581.7, 676.7, 578.5, 678.1, 576.1, 674.6, 570.2,
-674.6, 570.3, 674.8, 570.2, 675.1, 570.2, 678.1, 569.9, 678.1, 569.9,
-681.0, 569.7, 683.3, 569.5, 683.3, 569.5, 685.5, 569.3, 689.4, 569.0,
-689.4, 569.0, 693.3, 568.6, 696.3, 568.4, 699.0, 569.1, 699.3, 568.1,
-902.2, 454.4, 901.6, 452.4, 906.3, 450.0, 905.6, 449.0, 911.4, 456.8,
-909.0, 458.6, 912.4, 468.1, 913.8, 472.2, 916.2, 472.8, 915.3, 476.2,
-915.9, 473.9, 913.5, 473.3, 911.8, 470.4, 907.0, 462.4, 904.7, 463.1,
-902.2, 454.4, 904.5, 446.0, 904.0, 446.7, 905.9, 447.7, 905.6, 449.0,
-906.3, 450.0, 901.6, 452.4, 902.2, 454.4, 895.7, 464.8, 895.7, 464.8,
-889.2, 475.3, 886.7, 479.4, 886.2, 479.1, 884.2, 483.4, 888.4, 474.4,
-888.9, 474.6, 893.7, 465.8, 899.1, 455.9, 898.0, 455.1, 904.5, 446.0,
-928.2, 451.2, 930.0, 463.3, 930.9, 463.2, 931.8, 475.4, 932.5, 482.0,
-932.5, 482.0, 933.3, 488.7, 930.5, 470.0, 930.2, 470.0, 928.2, 451.2,
-903.2, 344.7, 903.5, 345.5, 903.5, 345.5, 903.7, 346.4, 890.9, 348.1,
-892.3, 365.7, 883.1, 385.9, 878.4, 386.3, 876.6, 367.7, 870.1, 349.6,
-868.2, 335.8, 865.3, 336.2, 860.5, 322.8, 870.9, 319.1, 869.6, 315.5,
-878.7, 308.3, 895.8, 317.0, 891.2, 326.3, 903.2, 344.7, 878.7, 308.3,
-884.3, 303.7, 887.6, 305.1, 890.0, 299.2, 896.6, 321.9, 896.6, 321.9,
-903.2, 344.7, 891.2, 326.3, 895.8, 317.0, 878.7, 308.3, 881.9, 476.0,
-884.0, 479.6, 882.6, 480.5, 883.2, 484.9, 883.7, 488.2, 882.5, 489.1,
-884.2, 491.5, 852.8, 448.7, 850.1, 450.0, 823.9, 404.0, 822.2, 402.7,
-825.8, 398.3, 827.8, 392.5, 836.4, 396.3, 833.9, 401.9, 840.0, 411.3,
-860.9, 443.7, 862.4, 442.8, 881.9, 476.0, 818.3, 452.4, 792.2, 417.7,
-787.3, 419.8, 768.3, 381.2, 774.6, 378.8, 775.0, 379.5, 781.0, 376.4,
-782.5, 375.6, 782.6, 375.8, 784.2, 375.2, 788.2, 380.2, 786.9, 381.2,
-789.5, 387.2, 790.0, 388.3, 790.0, 388.3, 790.5, 389.3, 801.8, 415.0,
-801.8, 415.0, 813.2, 440.7, 815.7, 446.5, 814.6, 447.4, 818.3, 452.4,
-466.5, 128.1, 478.5, 122.4, 479.7, 123.8, 493.2, 122.4, 500.4, 125.4,
-501.4, 123.1, 509.6, 123.7, 499.2, 128.7, 497.4, 124.9, 485.3, 126.2,
-475.9, 127.1, 474.5, 124.3, 466.5, 128.1, 585.0, 128.1, 613.5, 142.1,
-613.5, 142.1, 641.9, 156.2, 676.6, 173.2, 676.6, 173.2, 711.3, 190.3,
-757.7, 213.1, 757.7, 213.1, 804.0, 236.0, 817.2, 242.5, 818.0, 241.3,
-830.4, 249.0, 854.6, 265.6, 854.6, 265.6, 878.8, 282.3, 875.3, 279.8,
-874.9, 280.3, 871.1, 278.3, 836.2, 260.0, 836.2, 260.0, 801.3, 241.7,
-762.4, 221.2, 762.4, 221.2, 723.5, 200.8, 706.2, 191.7, 706.2, 191.7,
-689.0, 182.7, 673.1, 174.3, 673.1, 174.3, 657.2, 166.0, 632.0, 152.8,
-632.0, 152.8, 606.8, 139.6, 596.9, 134.4, 596.9, 134.4, 587.0, 129.2,
-586.0, 128.7, 586.0, 128.6, 585.0, 128.1, 641.9, 156.2, 613.0, 150.9,
-614.5, 142.7, 587.0, 129.2, 586.0, 128.7, 586.0, 128.6, 585.0, 128.1,
-580.8, 126.0, 580.8, 126.0, 576.5, 124.0, 566.5, 119.0, 565.8, 120.1,
-556.4, 114.1, 555.2, 111.7, 555.5, 109.5, 554.1, 109.4, 561.4, 107.8,
-561.4, 107.8, 568.7, 106.2, 569.6, 106.1, 569.7, 106.9, 570.7, 107.6,
-589.3, 120.3, 589.3, 120.3, 607.9, 133.0, 624.9, 144.6, 623.4, 152.8,
-641.9, 156.2, 590.7, 210.4, 578.2, 197.1, 578.8, 196.4, 565.6, 183.9,
-548.2, 162.6, 553.1, 149.7, 530.8, 141.2, 526.6, 134.1, 522.8, 135.7,
-520.2, 128.3, 518.5, 126.3, 518.5, 126.3, 516.9, 124.3, 517.6, 122.8,
-515.0, 119.1, 512.1, 118.4, 514.9, 117.8, 514.9, 117.8, 517.7, 117.1,
-543.3, 151.0, 550.0, 147.0, 585.7, 172.0, 592.1, 178.0, 592.9, 180.0,
-594.1, 188.7, 595.5, 199.2, 590.6, 210.4, 590.7, 210.4, 594.1, 188.7,
-611.0, 203.2, 605.0, 210.3, 615.8, 231.9, 618.6, 237.3, 617.0, 239.1,
-621.3, 242.7, 607.9, 225.1, 606.0, 226.5, 590.7, 210.4, 590.6, 210.4,
-595.5, 199.2, 594.1, 188.7, 639.5, 294.1, 653.6, 308.4, 653.1, 308.9,
-667.7, 322.6, 668.5, 315.8, 652.9, 313.9, 638.2, 305.2, 631.6, 301.3,
-631.6, 301.3, 625.1, 297.5, 617.2, 292.8, 617.2, 292.8, 609.4, 288.2,
-606.9, 286.8, 606.9, 286.8, 604.4, 285.3, 563.4, 261.1, 563.4, 261.1,
-522.4, 236.9, 515.1, 232.6, 515.4, 231.9, 507.7, 228.3, 542.5, 244.8,
-542.1, 245.5, 576.5, 262.7, 583.2, 266.0, 583.2, 266.0, 589.9, 269.3,
-614.7, 281.7, 616.9, 278.6, 639.5, 294.1, 645.5, 326.8, 643.2, 325.5,
-644.4, 323.5, 643.3, 320.2, 640.7, 312.7, 641.4, 305.5, 638.2, 305.2,
-652.9, 313.9, 668.5, 315.8, 667.7, 322.6, 670.3, 325.0, 671.5, 323.8,
-674.0, 326.3, 678.1, 330.1, 680.1, 328.1, 683.8, 332.1, 690.2, 338.1,
-692.1, 336.9, 696.7, 344.0, 707.9, 354.5, 705.9, 360.5, 719.2, 365.0,
-680.3, 351.9, 681.2, 347.8, 645.5, 326.8, 719.2, 365.0, 720.8, 365.9,
-721.7, 367.9, 722.0, 367.6, 711.7, 372.6, 711.7, 372.6, 701.4, 377.5,
-691.7, 348.8, 673.6, 331.1, 647.2, 331.9, 645.5, 330.3, 647.2, 327.6,
-645.5, 326.8, 681.2, 347.8, 680.3, 351.9, 719.2, 365.0, 557.8, 293.0,
-554.0, 281.8, 548.5, 283.7, 539.3, 274.3, 538.9, 273.8, 538.9, 273.7,
-538.5, 273.3, 507.0, 241.3, 500.5, 245.8, 475.5, 209.3, 485.1, 223.3,
-491.6, 218.8, 507.7, 228.3, 515.4, 231.9, 515.1, 232.6, 522.4, 236.9,
-528.3, 242.6, 526.9, 244.1, 531.4, 251.2, 544.6, 272.1, 550.1, 270.2,
-557.8, 293.0, 642.2, 378.7, 633.8, 370.2, 634.8, 368.9, 625.4, 361.6,
-617.9, 362.6, 616.6, 352.7, 607.8, 343.7, 603.3, 334.3, 607.1, 332.5,
-606.5, 321.3, 605.9, 310.6, 602.1, 301.3, 605.3, 300.0, 605.8, 299.8,
-609.5, 309.1, 613.8, 318.3, 628.0, 348.5, 633.7, 347.0, 642.2, 378.7,
-539.3, 274.3, 568.9, 309.5, 571.0, 308.0, 598.4, 345.0, 592.2, 341.2,
-592.2, 341.2, 586.0, 337.3, 562.7, 309.6, 564.4, 308.2, 542.8, 279.0,
-542.2, 278.3, 542.2, 278.2, 541.6, 277.4, 540.5, 275.8, 540.5, 275.8,
-539.3, 274.3, 752.7, 51.9, 761.8, 53.9, 768.8, 63.8, 769.2, 63.4,
-761.8, 72.8, 753.9, 66.6, 738.7, 69.9, 734.5, 70.8, 731.7, 69.2,
-730.2, 71.7, 735.2, 63.3, 738.0, 64.9, 745.7, 58.1, 749.2, 55.0,
-750.0, 51.3, 752.7, 51.9, 646.9, 36.3, 643.1, 40.5, 643.9, 42.0,
-639.3, 44.6, 605.0, 68.1, 605.0, 68.1, 570.6, 91.6, 571.5, 91.2,
-568.6, 86.9, 569.6, 86.2, 606.8, 59.2, 607.4, 59.9, 646.9, 36.3,
-570.6, -20.1, 571.5, -18.3, 569.8, -17.4, 568.9, -14.7, 563.3, 3.6,
-558.4, 22.2, 557.7, 22.0, 548.9, 19.7, 553.8, 1.1, 549.9, -19.7,
-557.9, -30.8, 554.3, -47.9, 542.7, -58.6, 542.5, -60.0, 545.4, -61.3,
-545.1, -61.8, 559.4, -42.1, 559.6, -41.9, 570.6, -20.1, 545.1, -61.8,
-544.5, -62.9, 546.5, -63.9, 548.0, -65.9, 548.5, -66.6, 548.5, -66.6,
-549.1, -67.4, 551.3, -70.5, 551.3, -70.5, 553.5, -73.6, 555.1, -74.3,
-554.4, -76.4, 555.8, -76.8, 573.0, -82.6, 573.8, -87.4, 590.9, -86.2,
-589.5, -86.3, 589.1, -80.4, 587.3, -74.6, 582.2, -57.8, 582.2, -57.8,
-577.0, -41.0, 573.8, -30.5, 568.1, -21.8, 570.6, -20.1, 559.6, -41.9,
-559.4, -42.1, 545.1, -61.8, 372.6, 57.9, 363.0, 19.9, 364.2, 19.6,
-353.5, -18.0, 364.4, -22.7, 397.1, 8.3, 406.0, 43.4, 406.7, 46.2,
-376.1, 61.9, 372.6, 57.9, 413.0, -8.1, 406.0, -8.8, 406.1, -14.5,
-400.1, -21.7, 400.6, -21.2, 401.0, -21.6, 402.0, -21.5, 407.8, -20.9,
-407.8, -20.9, 413.6, -20.3, 432.0, -18.4, 432.0, -18.4, 450.5, -16.5,
-460.8, -15.4, 461.5, -12.2, 471.0, -14.3, 442.7, -8.0, 441.4, -5.2,
-413.0, -8.1, 376.9, -24.1, 383.0, -17.7, 390.0, -26.2, 400.1, -21.7,
-406.1, -14.5, 406.0, -8.8, 413.0, -8.1, 426.1, 5.7, 426.1, 5.7,
-439.2, 19.5, 452.4, 33.4, 452.6, 33.3, 465.6, 47.3, 464.7, 46.3,
-464.5, 46.4, 463.4, 45.6, 462.7, 45.0, 462.7, 45.0, 462.0, 44.4,
-419.5, 10.2, 413.9, 15.4, 376.9, -24.1, 543.4, -71.1, 548.5, -72.3,
-548.9, -71.4, 553.5, -73.6, 551.3, -70.5, 551.3, -70.5, 549.1, -67.4,
-546.8, -66.8, 543.5, -71.2, 543.4, -71.1, 198.8, 306.6, 206.3, 283.4,
-210.0, 283.9, 213.8, 260.1, 214.4, 260.4, 214.8, 260.9, 215.0, 260.7,
-220.4, 263.4, 226.1, 264.6, 225.8, 266.0, 222.7, 280.5, 217.0, 279.3,
-208.2, 292.5, 203.5, 299.5, 200.1, 299.0, 198.8, 306.6, 147.1, 478.3,
-146.6, 474.8, 146.6, 474.8, 146.2, 471.3, 146.7, 466.2, 147.4, 466.2,
-149.0, 461.3, 169.4, 397.4, 166.0, 396.1, 190.1, 333.6, 191.7, 329.4,
-197.8, 326.4, 200.5, 328.0, 201.3, 328.4, 198.8, 332.8, 197.1, 337.6,
-193.8, 346.9, 193.8, 346.9, 190.4, 356.3, 186.4, 367.7, 186.4, 367.7,
-182.4, 379.0, 167.7, 420.4, 167.8, 420.5, 153.1, 461.8, 153.0, 462.3,
-152.8, 462.2, 152.7, 462.6, 150.9, 467.6, 150.9, 467.6, 149.2, 472.6,
-148.1, 475.5, 146.9, 478.2, 147.1, 478.3, 154.3, 442.2, 152.4, 449.0,
-150.5, 455.9, 150.5, 455.9, 149.7, 458.6, 149.0, 461.3, 149.0, 461.3,
-147.4, 466.2, 146.7, 466.2, 146.2, 471.3, 144.2, 457.2, 144.2, 457.2,
-142.3, 443.2, 144.3, 393.2, 143.9, 393.2, 145.6, 343.2, 145.5, 345.7,
-145.8, 345.7, 146.0, 348.1, 147.8, 368.2, 147.8, 368.2, 149.5, 388.3,
-149.9, 392.5, 149.9, 392.5, 150.3, 396.7, 152.3, 419.4, 154.2, 419.4,
-154.3, 442.2, 179.6, 252.5, 179.3, 254.6, 178.6, 254.5, 177.5, 256.5,
-176.7, 258.1, 176.2, 259.8, 175.9, 259.7, 165.2, 256.7, 165.2, 255.9,
-155.5, 250.4, 156.0, 249.5, 156.0, 249.5, 156.5, 248.6, 168.7, 225.0,
-162.9, 207.3, 180.9, 201.5, 174.6, 203.5, 180.4, 221.2, 179.9, 241.0,
-179.8, 246.7, 180.5, 246.8, 179.6, 252.5, 158.1, 293.8, 157.1, 294.1,
-157.4, 294.9, 156.8, 296.1, 151.6, 306.0, 151.6, 306.0, 146.4, 316.0,
-133.8, 320.3, 129.9, 332.1, 129.3, 348.8, 126.7, 329.9, 126.7, 329.9,
-124.1, 311.0, 124.0, 309.1, 124.5, 307.9, 126.2, 307.0, 141.5, 299.2,
-141.8, 299.5, 158.1, 293.8, 126.2, 307.0, 128.3, 307.6, 131.2, 297.3,
-136.3, 287.5, 137.6, 285.0, 137.6, 285.0, 138.9, 282.6, 138.9, 282.6,
-147.2, 266.5, 155.5, 250.4, 165.2, 255.9, 165.2, 256.7, 175.9, 259.7,
-178.1, 263.9, 172.0, 267.1, 168.1, 274.5, 163.1, 284.1, 165.8, 287.7,
-158.1, 293.8, 141.8, 299.5, 141.5, 299.2, 126.2, 307.0, 136.3, 287.5,
-131.2, 297.3, 128.3, 307.6, 126.2, 307.0, 124.5, 307.9, 124.0, 309.1,
-124.1, 311.0, 121.5, 292.0, 120.5, 292.1, 118.9, 272.9, 118.7, 271.9,
-118.7, 271.9, 118.6, 270.9, 117.5, 263.1, 114.0, 261.7, 116.4, 255.3,
-129.2, 247.8, 136.6, 240.3, 134.9, 228.4, 137.5, 226.5, 136.8, 225.6,
-138.8, 222.8, 141.1, 225.7, 138.6, 227.7, 138.4, 232.7, 137.5, 255.7,
-137.5, 255.7, 136.6, 278.7, 136.5, 283.1, 137.7, 283.6, 136.3, 287.5,
-467.1, 684.1, 471.3, 693.5, 468.6, 699.9, 475.5, 702.9, 476.7, 715.9,
-476.8, 715.9, 478.0, 728.9, 480.1, 750.5, 480.0, 750.5, 482.0, 772.1,
-482.3, 775.1, 482.3, 775.1, 482.5, 778.1, 483.9, 793.3, 485.3, 808.6,
-485.3, 808.6, 486.4, 819.9, 486.4, 819.9, 487.4, 831.1, 488.3, 840.2,
-487.8, 840.3, 489.1, 849.3, 483.2, 808.5, 483.6, 808.5, 478.2, 767.6,
-477.9, 765.3, 477.9, 765.2, 477.6, 762.9, 474.2, 737.2, 474.2, 737.2,
-470.8, 711.5, 469.0, 697.8, 461.8, 693.8, 467.1, 684.1, 537.5, 359.8,
-537.4, 359.8, 528.4, 376.3, 519.2, 392.8, 519.7, 404.5, 512.2, 404.8,
-505.5, 416.9, 507.3, 414.7, 505.3, 413.0, 505.1, 409.1, 504.5, 396.8,
-498.4, 392.8, 503.9, 384.4, 514.7, 368.1, 529.8, 355.6, 537.5, 359.8,
-503.9, 384.4, 505.6, 383.9, 503.6, 377.8, 503.3, 371.1, 503.1, 368.1,
-503.1, 368.1, 503.0, 365.1, 501.6, 337.8, 501.6, 337.8, 500.3, 310.6,
-500.0, 303.7, 503.1, 301.2, 499.6, 296.9, 519.1, 327.4, 519.1, 327.4,
-538.6, 357.9, 538.9, 358.3, 538.4, 359.2, 537.5, 359.8, 529.8, 355.6,
-514.7, 368.1, 503.9, 384.4, 481.0, 448.9, 480.0, 450.8, 484.4, 452.5,
-484.1, 455.6, 483.6, 460.0, 481.8, 459.8, 479.4, 464.0, 471.6, 478.1,
-471.6, 478.1, 463.8, 492.1, 463.8, 493.9, 462.7, 493.9, 461.7, 495.7,
-471.1, 472.2, 468.8, 470.9, 481.0, 448.9, 505.1, 409.1, 505.3, 413.0,
-507.3, 414.7, 505.5, 416.9, 505.4, 417.0, 505.6, 417.1, 505.5, 417.3,
-495.2, 435.9, 495.2, 435.8, 484.8, 454.4, 484.4, 455.0, 483.9, 455.4,
-484.1, 455.6, 484.4, 452.5, 480.0, 450.8, 481.0, 448.9, 480.5, 447.8,
-480.5, 447.8, 480.0, 446.7, 467.1, 418.0, 463.1, 419.2, 454.1, 389.4,
-455.0, 392.5, 459.0, 391.3, 463.9, 393.2, 484.5, 401.1, 486.1, 398.3,
-505.1, 409.1, 180.9, 723.4, 179.3, 711.9, 179.3, 711.9, 177.7, 700.4,
-188.2, 671.9, 189.3, 670.2, 209.1, 647.2, 209.0, 655.4, 209.2, 655.4,
-209.3, 663.7, 208.7, 667.8, 207.4, 667.6, 205.6, 671.5, 199.2, 685.0,
-199.2, 685.0, 192.8, 698.4, 186.8, 710.9, 188.3, 722.5, 180.9, 723.4,
-157.5, 553.7, 156.8, 548.2, 156.8, 548.2, 156.0, 542.8, 152.2, 536.9,
-159.6, 532.1, 163.3, 521.4, 165.9, 522.6, 161.2, 532.8, 159.2, 544.2,
-158.4, 549.0, 156.4, 553.2, 157.5, 553.7, 209.5, 646.5, 209.3, 646.8,
-209.1, 646.8, 209.1, 647.2, 189.3, 670.2, 188.2, 671.9, 177.7, 700.4,
-176.4, 690.9, 177.5, 690.6, 175.1, 681.5, 173.8, 677.2, 174.5, 677.0,
-173.9, 672.6, 177.4, 657.8, 178.9, 658.2, 184.0, 643.8, 187.0, 635.3,
-187.0, 635.3, 189.9, 626.9, 194.9, 612.9, 204.3, 603.4, 199.8, 598.9,
-214.1, 613.2, 204.9, 622.6, 209.5, 646.5, 199.8, 598.9, 204.3, 563.1,
-235.1, 554.2, 224.3, 529.2, 218.6, 582.4, 217.8, 582.5, 215.7, 636.0,
-212.6, 641.2, 212.6, 641.2, 209.5, 646.5, 204.9, 622.6, 214.1, 613.2,
-199.8, 598.9, 464.9, 784.3, 465.8, 799.3, 465.8, 799.3, 466.7, 814.3,
-464.5, 813.9, 459.0, 846.5, 451.3, 878.7, 452.4, 874.2, 451.9, 874.1,
-452.6, 869.4, 453.3, 865.0, 453.3, 865.0, 453.9, 860.5, 457.1, 838.5,
-457.1, 838.5, 460.2, 816.6, 462.5, 801.0, 462.5, 801.0, 464.7, 785.5,
-464.8, 784.9, 464.9, 784.9, 464.9, 784.3, 387.9, 282.3, 363.9, 266.8,
-367.7, 256.8, 355.0, 227.9, 354.1, 225.8, 357.9, 224.1, 360.7, 220.3,
-361.3, 219.5, 361.3, 219.5, 361.9, 218.8, 364.7, 215.0, 364.7, 215.0,
-367.6, 211.2, 372.2, 205.9, 371.9, 205.6, 376.1, 199.9, 376.0, 199.9,
-376.8, 204.7, 377.5, 209.4, 377.6, 210.3, 377.6, 210.3, 377.8, 211.3,
-380.0, 227.2, 380.0, 227.2, 382.3, 243.1, 382.5, 244.4, 382.5, 244.4,
-382.7, 245.8, 385.3, 264.0, 377.8, 275.8, 387.9, 282.3, 136.9, 107.6,
-136.0, 106.7, 136.0, 106.7, 135.1, 105.7, 148.2, 91.7, 160.9, 77.5,
-159.4, 76.0, 165.9, 69.1, 164.6, 64.4, 172.3, 62.2, 172.9, 61.9,
-173.1, 61.1, 173.3, 61.2, 174.9, 61.2, 174.9, 61.8, 176.5, 62.4,
-178.2, 59.9, 187.3, 66.3, 198.1, 70.3, 196.4, 70.1, 195.9, 73.5,
-193.8, 76.7, 166.2, 93.6, 165.9, 93.3, 136.9, 107.6, 193.8, 76.7,
-181.1, 95.5, 173.7, 93.6, 168.4, 114.3, 160.3, 118.7, 160.3, 118.7,
-152.1, 123.1, 149.7, 114.0, 144.5, 115.4, 136.9, 107.6, 165.9, 93.3,
-166.2, 93.6, 193.8, 76.7, 194.6, 18.2, 195.1, 17.9, 195.6, 18.0,
-195.7, 17.5, 204.2, 15.3, 204.2, 15.3, 212.6, 13.1, 199.5, 33.8,
-205.6, 39.5, 204.7, 66.0, 203.1, 65.8, 203.1, 65.8, 201.4, 65.6,
-196.5, 42.2, 197.4, 42.0, 194.6, 18.2, 201.4, 65.6, 189.0, 64.0,
-179.9, 57.6, 176.5, 62.4, 174.9, 61.8, 174.9, 61.2, 173.3, 61.2,
-158.7, 55.1, 158.4, 55.7, 143.5, 50.2, 169.7, 35.4, 169.0, 34.2,
-194.6, 18.2, 197.4, 42.0, 196.5, 42.2, 201.4, 65.6, 169.5, 141.3,
-169.7, 143.6, 169.7, 143.6, 169.9, 145.9, 135.0, 185.0, 141.7, 191.0,
-113.8, 236.3, 122.6, 230.0, 103.4, 212.0, 107.5, 190.5, 109.2, 182.0,
-116.5, 183.4, 125.4, 176.3, 147.5, 158.8, 146.3, 157.1, 169.5, 141.3,
-157.8, 679.7, 171.7, 714.9, 171.3, 715.1, 184.6, 750.6, 184.7, 751.0,
-184.6, 751.1, 184.7, 751.5, 185.4, 756.6, 185.4, 756.6, 186.1, 761.7,
-175.0, 733.1, 176.1, 732.7, 166.1, 703.6, 162.0, 691.7, 162.5, 691.5,
-157.8, 679.7, 120.7, 617.0, 117.1, 625.4, 113.4, 625.4, 113.5, 633.8,
-118.6, 641.1, 107.0, 649.1, 100.4, 664.5, 100.9, 641.9, 104.9, 640.9,
-100.1, 619.4, 102.4, 610.2, 102.4, 610.2, 104.7, 601.1, 126.7, 560.0,
-129.0, 559.9, 141.9, 515.4, 141.9, 517.7, 141.9, 517.7, 141.9, 520.0,
-131.8, 568.6, 132.7, 568.8, 120.7, 617.0, 141.9, 520.0, 142.0, 543.5,
-142.0, 543.5, 142.0, 567.0, 142.1, 567.7, 141.4, 567.7, 141.4, 568.5,
-144.0, 585.9, 125.7, 587.3, 125.1, 606.5, 126.2, 611.0, 122.9, 611.8,
-120.7, 617.0, 132.7, 568.8, 131.8, 568.6, 141.9, 520.0, 69.2, 152.0,
-67.3, 142.3, 67.1, 140.6, 70.8, 131.7, 69.4, 135.0, 72.3, 136.2,
-73.9, 140.7, 79.7, 157.5, 83.2, 157.1, 85.5, 174.4, 84.6, 167.9,
-81.1, 168.4, 76.7, 162.3, 73.0, 157.2, 70.3, 157.7, 69.2, 152.0,
-67.4, 174.6, 67.4, 174.8, 67.4, 174.8, 67.4, 175.0, 67.2, 178.0,
-67.2, 178.0, 66.9, 181.0, 64.6, 210.9, 69.8, 212.3, 62.3, 240.9,
-58.8, 233.2, 59.1, 225.6, 55.3, 225.4, 53.3, 220.0, 53.3, 220.0,
-51.4, 214.6, 54.3, 199.5, 57.2, 200.1, 63.0, 185.6, 63.0, 185.5,
-63.0, 185.5, 63.0, 185.5, 65.2, 180.0, 65.2, 180.0, 67.4, 174.6,
-55.5, 87.2, 51.3, 86.0, 53.0, 79.9, 50.5, 72.6, 49.1, 68.4,
-49.1, 68.4, 47.6, 64.1, 47.2, 62.9, 46.6, 62.8, 46.8, 61.7,
-47.1, 58.6, 46.5, 57.3, 48.5, 55.6, 51.1, 57.0, 52.5, 54.8,
-56.4, 53.5, 71.2, 48.0, 71.7, 49.5, 87.1, 45.6, 87.3, 45.5,
-87.3, 45.5, 87.6, 45.5, 84.6, 48.1, 88.5, 52.6, 89.5, 59.8,
-88.8, 71.2, 92.0, 76.9, 85.1, 82.4, 75.0, 90.6, 68.6, 90.9,
-55.5, 87.2, 85.1, 82.4, 93.5, 106.7, 82.1, 112.3, 73.9, 140.7,
-72.3, 136.2, 69.4, 135.0, 70.8, 131.7, 65.7, 116.8, 65.7, 116.8,
-60.6, 101.9, 58.2, 95.1, 58.2, 95.1, 55.9, 88.2, 55.7, 87.7,
-55.6, 87.2, 55.5, 87.2, 68.6, 90.9, 75.0, 90.6, 85.1, 82.4,
-93.3, 87.3, 94.0, 92.2, 96.3, 96.3, 94.7, 97.2, 92.1, 120.2,
-99.2, 144.7, 101.2, 144.6, 100.2, 147.0, 102.6, 150.4, 102.0, 150.6,
-104.8, 170.5, 104.8, 170.5, 107.5, 190.5, 103.4, 212.0, 122.6, 230.0,
-113.8, 236.3, 113.7, 236.5, 114.0, 236.7, 113.9, 236.9, 113.1, 237.7,
-114.8, 240.2, 114.4, 240.4, 111.2, 244.9, 118.9, 253.8, 116.4, 255.3,
-114.0, 261.7, 117.5, 263.1, 118.6, 270.9, 119.2, 266.7, 117.0, 266.4,
-115.5, 261.9, 104.1, 228.6, 97.0, 229.5, 92.6, 195.2, 85.9, 142.1,
-92.2, 141.2, 93.3, 87.3, 92.6, 195.2, 92.7, 191.9, 91.4, 191.9,
-90.3, 188.5, 87.9, 181.5, 87.9, 181.5, 85.5, 174.4, 83.2, 157.1,
-79.7, 157.5, 73.9, 140.7, 82.1, 112.3, 93.5, 106.7, 85.1, 82.4,
-92.0, 76.9, 88.8, 71.2, 89.5, 59.8, 91.4, 73.5, 91.4, 73.5,
-93.3, 87.3, 92.2, 141.2, 85.9, 142.1, 92.6, 195.2, 75.0, 344.2,
-75.5, 328.2, 75.6, 328.2, 76.0, 312.1, 76.6, 299.7, 83.2, 291.6,
-77.7, 287.3, 84.3, 305.5, 84.3, 305.5, 90.8, 323.7, 90.3, 334.3,
-75.0, 344.2, 75.0, 344.2, 75.7, 317.2, 73.9, 344.1, 72.8, 344.1,
-72.1, 371.0, 66.5, 363.4, 66.5, 363.4, 60.9, 355.8, 62.3, 336.1,
-82.3, 326.3, 75.7, 317.2, 114.9, 486.1, 99.0, 457.2, 106.5, 437.0,
-83.1, 428.3, 79.5, 419.1, 73.3, 416.9, 75.8, 409.9, 76.1, 393.5,
-76.7, 393.4, 76.5, 377.0, 75.7, 380.0, 79.3, 381.0, 82.2, 384.9,
-82.6, 385.4, 82.7, 385.3, 82.9, 385.9, 88.9, 404.1, 88.8, 404.2,
-94.6, 422.5, 104.7, 454.3, 119.4, 483.8, 114.9, 486.1, 74.0, 508.4,
-74.5, 479.7, 74.5, 479.7, 75.1, 451.0, 75.5, 454.7, 78.2, 454.3,
-81.3, 457.6, 76.1, 468.4, 90.3, 475.2, 99.3, 492.8, 97.9, 502.2,
-73.8, 508.0, 74.0, 508.4, 99.3, 492.8, 105.6, 505.0, 102.1, 512.9,
-111.8, 517.1, 106.8, 534.3, 97.8, 531.6, 83.8, 546.1, 81.2, 548.7,
-81.6, 549.3, 78.7, 551.4, 78.6, 550.6, 78.8, 550.4, 78.4, 549.9,
-76.2, 547.2, 79.2, 544.8, 77.0, 541.9, 71.5, 538.3, 75.4, 532.3,
-73.7, 522.7, 72.5, 516.8, 74.7, 516.4, 73.9, 510.3, 73.7, 509.4,
-74.0, 509.4, 74.0, 508.4, 73.8, 508.0, 97.9, 502.2, 99.3, 492.8,
-115.1, 546.9, 107.5, 568.2, 104.7, 567.6, 100.0, 589.5, 99.8, 594.3,
-98.3, 594.2, 96.7, 598.9, 93.8, 582.6, 92.0, 581.1, 81.6, 567.8,
-80.6, 562.5, 82.9, 560.1, 79.7, 557.1, 78.0, 556.0, 79.2, 554.2,
-78.7, 551.4, 81.6, 549.3, 81.2, 548.7, 83.8, 546.1, 99.1, 544.2,
-113.0, 541.4, 115.1, 546.9, 83.8, 546.1, 97.8, 531.6, 106.8, 534.3,
-111.8, 517.1, 114.8, 518.5, 118.5, 510.7, 124.8, 503.8, 125.4, 503.4,
-128.5, 505.7, 128.8, 508.0, 127.4, 512.0, 127.1, 511.9, 126.0, 515.9,
-124.2, 531.8, 120.5, 531.4, 115.1, 546.9, 113.0, 541.4, 99.1, 544.2,
-83.8, 546.1, -27.0, 410.9, -28.8, 406.8, -30.4, 406.9, -30.6, 402.7,
--32.6, 389.3, -29.2, 377.4, -34.5, 375.9, -34.7, 373.3, -32.7, 373.0,
--33.2, 370.6, -29.2, 388.7, -30.4, 389.0, -27.5, 407.4, -27.2, 409.2,
--27.8, 409.6, -27.0, 410.9, -22.3, 363.3, -25.0, 355.2, -24.5, 355.0,
--27.6, 347.1, -27.8, 346.5, -27.1, 346.3, -27.3, 345.7, -24.5, 354.4,
--20.5, 355.6, -22.3, 363.3, 2.2, 282.6, 9.2, 297.5, 18.3, 298.8,
-16.3, 312.3, 16.4, 326.7, 16.4, 326.7, 16.6, 341.0, 6.2, 338.8,
-1.5, 340.8, -6.7, 348.2, -16.5, 346.7, -15.9, 341.8, -24.8, 335.0,
--24.8, 335.0, -24.7, 334.8, -24.7, 334.6, -23.4, 329.3, -23.3, 329.4,
--22.1, 324.1, -11.1, 302.8, -14.7, 287.8, 2.2, 282.6, -22.1, 324.1,
--32.6, 302.0, -22.3, 289.0, -7.1, 263.0, -6.8, 272.9, -2.5, 272.8,
-2.2, 282.6, -14.7, 287.8, -11.1, 302.8, -22.1, 324.1, 48.9, 670.5,
-45.7, 656.7, 49.8, 654.0, 42.5, 643.0, 47.9, 644.1, 53.2, 643.6,
-53.4, 645.1, 59.0, 650.8, 62.8, 647.0, 72.2, 648.9, 70.0, 661.3,
-58.1, 672.3, 48.9, 670.5, 749.0, 492.6, 747.0, 491.5, 749.8, 485.2,
-748.1, 484.6, 762.9, 499.3, 767.1, 495.1, 786.1, 505.6, 785.1, 497.0,
-766.0, 502.0, 749.0, 492.6, 804.0, 583.1, 804.0, 596.3, 804.0, 598.2,
-797.6, 609.5, 793.0, 608.8, 788.4, 609.3, 787.9, 611.3, 783.2, 607.1,
-780.2, 601.8, 778.4, 602.8, 778.5, 602.6, 778.0, 602.4, 777.5, 602.0,
-781.5, 601.4, 784.1, 591.8, 782.5, 583.1, 787.8, 562.4, 787.8, 562.4,
-793.2, 541.7, 795.3, 533.5, 799.3, 532.4, 797.4, 525.2, 804.7, 553.1,
-803.9, 554.2, 804.0, 583.1, 797.4, 525.2, 797.1, 519.5, 798.1, 513.8,
-800.5, 513.5, 808.6, 518.0, 809.9, 516.5, 816.7, 522.4, 817.5, 523.1,
-818.2, 523.9, 818.4, 523.8, 815.5, 535.4, 814.9, 535.3, 812.7, 547.1,
-810.7, 555.2, 810.7, 555.2, 808.8, 563.4, 806.4, 573.2, 801.5, 574.7,
-804.0, 583.1, 803.9, 554.2, 804.7, 553.1, 797.4, 525.2, 713.5, 490.2,
-713.2, 490.0, 713.6, 489.3, 713.3, 489.1, 717.8, 492.9, 718.2, 492.3,
-723.2, 495.6, 722.6, 492.1, 718.1, 493.2, 713.5, 490.2, 744.7, 514.0,
-740.9, 511.5, 738.4, 508.1, 737.1, 509.1, 734.5, 506.4, 735.2, 505.7,
-733.3, 502.3, 732.5, 501.9, 732.8, 501.5, 732.3, 500.6, 738.7, 507.1,
-740.3, 506.3, 744.7, 514.0, 840.1, 624.8, 859.1, 643.0, 856.0, 656.1,
-878.0, 661.2, 875.3, 663.4, 875.3, 663.4, 872.6, 665.6, 862.1, 657.6,
-864.1, 655.0, 855.7, 644.3, 849.0, 635.9, 849.0, 635.9, 842.2, 627.4,
-841.2, 626.1, 841.3, 625.9, 840.1, 624.8, 839.5, 570.9, 839.5, 570.9,
-847.4, 578.7, 855.2, 586.5, 855.4, 586.6, 855.4, 586.6, 855.5, 586.8,
-860.1, 591.3, 860.2, 591.2, 864.8, 595.8, 865.1, 596.1, 865.0, 596.2,
-865.4, 596.6, 860.4, 591.7, 860.4, 591.7, 855.5, 586.8, 855.4, 586.6,
-855.4, 586.6, 855.2, 586.5, 847.4, 578.7, 839.5, 570.9, 839.5, 570.9,
-877.5, 603.6, 857.1, 585.8, 857.1, 585.8, 836.7, 568.0, 838.3, 567.7,
-839.8, 566.4, 839.6, 565.9, 839.5, 565.7, 842.7, 563.6, 845.9, 561.2,
-851.4, 552.7, 856.6, 556.1, 867.3, 550.9, 867.2, 551.2, 872.1, 553.1,
-876.8, 555.4, 881.3, 578.7, 884.1, 601.5, 877.5, 603.6, 876.8, 555.4,
-887.4, 560.3, 887.3, 560.5, 897.9, 565.3, 900.5, 583.4, 900.4, 583.4,
-903.1, 601.5, 904.2, 615.5, 904.8, 615.5, 907.1, 629.4, 892.3, 616.5,
-892.3, 616.5, 877.5, 603.6, 884.1, 601.5, 881.3, 578.7, 876.8, 555.4,
-924.9, 574.1, 934.6, 580.7, 934.6, 580.7, 944.3, 587.3, 944.0, 594.1,
-941.0, 598.8, 944.0, 600.9, 943.8, 604.9, 945.7, 606.7, 943.6, 608.8,
-926.1, 612.3, 927.9, 621.4, 912.2, 633.9, 912.3, 632.1, 910.0, 632.0,
-907.8, 630.0, 907.5, 626.4, 907.2, 626.4, 906.6, 622.8, 904.2, 604.5,
-903.8, 604.5, 901.1, 586.3, 904.6, 577.0, 913.1, 573.8, 924.9, 574.1,
-901.1, 586.3, 896.6, 584.8, 899.5, 575.8, 897.9, 565.3, 897.9, 565.1,
-897.9, 565.1, 897.9, 564.9, 897.2, 559.8, 898.2, 559.5, 896.4, 554.7,
-903.9, 559.8, 903.7, 560.0, 911.3, 564.9, 913.1, 566.1, 913.1, 566.1,
-915.0, 567.3, 915.1, 570.9, 919.9, 570.7, 924.9, 574.1, 913.1, 573.8,
-904.6, 577.0, 901.1, 586.3, 556.4, 358.5, 563.7, 373.2, 565.8, 372.2,
-575.2, 385.9, 582.9, 397.1, 582.9, 397.1, 590.6, 408.4, 612.9, 440.9,
-613.2, 440.7, 635.2, 473.4, 635.6, 474.9, 636.0, 474.9, 636.1, 476.4,
-637.2, 490.9, 632.9, 492.8, 638.3, 505.4, 638.4, 507.7, 638.1, 507.7,
-637.8, 510.0, 637.6, 511.1, 638.0, 511.3, 637.5, 512.3, 637.6, 512.1,
-637.2, 511.8, 636.9, 511.4, 596.6, 435.0, 594.5, 436.0, 556.4, 358.5,
-636.9, 511.4, 631.2, 500.0, 630.0, 500.6, 623.1, 489.8, 602.2, 457.1,
-602.2, 457.1, 581.3, 424.5, 580.7, 423.6, 580.7, 423.6, 580.1, 422.7,
-576.4, 416.8, 576.4, 416.8, 572.6, 410.9, 568.0, 403.6, 568.0, 403.6,
-563.3, 396.4, 554.4, 382.5, 554.4, 382.5, 545.5, 368.5, 542.6, 364.1,
-540.9, 364.5, 539.8, 359.6, 538.8, 344.7, 538.3, 344.7, 536.7, 329.8,
-545.6, 329.2, 548.0, 343.3, 556.4, 358.5, 594.5, 436.0, 596.6, 435.0,
-636.9, 511.4, 675.1, 570.2, 674.8, 570.2, 674.6, 570.3, 674.6, 570.2,
-665.5, 556.2, 665.7, 556.0, 656.7, 541.9, 653.1, 536.2, 653.0, 536.3,
-649.4, 530.7, 645.6, 524.9, 641.9, 519.1, 641.9, 519.1, 641.9, 519.1,
-645.6, 524.9, 649.4, 530.7, 653.0, 536.3, 653.1, 536.2, 656.7, 541.9,
-665.9, 556.0, 666.1, 555.9, 675.1, 570.2, 899.8, 548.7, 895.3, 542.3,
-895.6, 542.1, 890.9, 536.0, 885.0, 514.4, 887.5, 513.7, 884.2, 491.5,
-882.5, 489.1, 883.7, 488.2, 883.2, 484.9, 883.2, 484.2, 883.7, 484.2,
-884.2, 483.4, 886.2, 479.1, 886.7, 479.4, 889.2, 475.3, 894.8, 486.7,
-891.1, 488.4, 893.0, 501.6, 896.4, 525.1, 901.3, 525.5, 899.8, 548.7,
-884.2, 389.0, 889.3, 403.4, 884.3, 409.7, 894.4, 417.8, 899.5, 431.9,
-904.7, 432.0, 904.5, 446.0, 898.0, 455.1, 899.1, 455.9, 893.7, 465.8,
-881.0, 430.2, 883.6, 427.3, 884.2, 389.0, 893.7, 465.8, 888.9, 474.6,
-888.4, 474.4, 884.2, 483.4, 883.7, 484.2, 883.2, 484.2, 883.2, 484.9,
-882.6, 480.5, 884.0, 479.6, 881.9, 476.0, 881.7, 474.5, 881.7, 474.5,
-881.4, 472.9, 881.6, 432.1, 876.0, 432.0, 869.9, 391.2, 870.0, 370.4,
-872.9, 370.0, 870.1, 349.6, 876.6, 367.7, 878.4, 386.3, 883.1, 385.9,
-882.6, 387.0, 883.6, 387.4, 884.2, 389.0, 883.6, 427.3, 881.0, 430.2,
-893.7, 465.8, 912.4, 468.1, 909.0, 458.6, 911.4, 456.8, 905.6, 449.0,
-905.9, 447.7, 904.0, 446.7, 904.5, 446.0, 904.7, 432.0, 899.5, 431.9,
-894.4, 417.8, 896.0, 419.1, 901.1, 412.8, 907.7, 407.8, 917.5, 435.3,
-913.9, 438.2, 912.4, 468.1, 907.7, 407.8, 913.4, 403.5, 917.7, 404.6,
-919.1, 399.2, 920.4, 403.4, 920.4, 403.4, 921.6, 407.7, 923.3, 429.6,
-924.9, 429.4, 928.2, 451.2, 930.2, 470.0, 930.5, 470.0, 933.3, 488.7,
-936.3, 516.2, 934.7, 516.5, 939.4, 543.8, 931.7, 522.3, 935.4, 520.1,
-924.1, 500.9, 921.1, 492.4, 921.1, 492.4, 918.1, 484.0, 916.7, 480.1,
-916.7, 480.1, 915.3, 476.2, 916.2, 472.8, 913.8, 472.2, 912.4, 468.1,
-913.9, 438.2, 917.5, 435.3, 907.7, 407.8, 869.3, 391.2, 869.6, 393.4,
-869.6, 395.5, 869.9, 395.5, 875.4, 434.2, 881.6, 434.2, 881.4, 472.9,
-881.7, 474.5, 881.7, 474.5, 881.9, 476.0, 862.4, 442.8, 860.9, 443.7,
-840.0, 411.3, 838.8, 403.6, 853.7, 399.5, 869.3, 391.2, 840.0, 411.3,
-833.9, 401.9, 836.4, 396.3, 827.8, 392.5, 834.3, 373.1, 846.5, 358.5,
-840.8, 353.8, 844.2, 352.5, 844.2, 352.5, 847.6, 351.2, 847.8, 352.0,
-856.3, 353.2, 863.2, 350.6, 866.2, 370.9, 866.2, 370.9, 869.3, 391.2,
-853.7, 399.5, 838.8, 403.6, 840.0, 411.3, 797.4, 463.4, 818.1, 481.9,
-832.6, 485.1, 832.8, 507.0, 815.2, 491.3, 815.2, 491.3, 797.5, 475.5,
-794.5, 471.9, 800.4, 466.1, 797.4, 463.4, 797.5, 475.5, 781.5, 461.2,
-783.7, 457.2, 765.4, 446.9, 763.2, 449.1, 743.6, 417.7, 714.5, 401.6,
-727.0, 396.9, 727.0, 396.9, 739.4, 392.2, 746.0, 393.0, 745.1, 399.2,
-750.9, 406.3, 764.3, 422.8, 764.3, 422.8, 777.8, 439.4, 787.6, 451.4,
-790.1, 450.1, 797.4, 463.4, 800.4, 466.1, 794.5, 471.9, 797.5, 475.5,
-764.0, 382.8, 766.2, 382.0, 766.2, 382.0, 768.3, 381.2, 787.3, 419.8,
-792.2, 417.7, 818.3, 452.4, 839.0, 481.8, 837.6, 483.0, 859.8, 511.3,
-811.2, 449.2, 812.7, 448.1, 765.5, 384.9, 764.8, 383.9, 763.8, 383.1,
-764.0, 382.8, 875.4, 533.5, 871.8, 528.1, 871.7, 528.3, 868.0, 523.0,
-863.9, 517.2, 863.9, 517.2, 859.8, 511.3, 837.6, 483.0, 839.0, 481.8,
-818.3, 452.4, 814.6, 447.4, 815.7, 446.5, 813.2, 440.7, 831.1, 465.0,
-830.0, 465.8, 846.8, 490.9, 848.1, 492.9, 848.1, 492.9, 849.5, 494.8,
-862.4, 514.2, 862.6, 514.1, 875.4, 533.5, 544.1, 175.8, 556.5, 200.5,
-554.9, 201.4, 569.0, 225.3, 561.9, 229.4, 547.8, 205.6, 526.7, 186.0,
-525.3, 184.7, 524.4, 183.1, 523.9, 183.4, 533.0, 178.0, 540.5, 172.5,
-544.1, 175.8, 526.7, 186.0, 547.8, 205.6, 561.9, 229.4, 569.0, 225.3,
-572.1, 230.5, 576.1, 228.6, 578.3, 234.0, 586.1, 245.8, 588.9, 243.9,
-599.6, 253.8, 619.4, 274.2, 619.6, 274.0, 639.5, 294.1, 616.9, 278.6,
-614.7, 281.7, 589.9, 269.3, 577.6, 260.4, 580.3, 256.7, 570.7, 244.0,
-560.1, 230.0, 560.1, 230.0, 549.5, 216.0, 544.8, 209.8, 544.8, 209.8,
-540.0, 203.6, 538.5, 201.6, 538.5, 201.6, 537.0, 199.6, 531.9, 192.8,
-533.2, 191.2, 526.7, 186.0, 606.5, 321.3, 607.1, 332.5, 603.3, 334.3,
-607.8, 343.7, 582.8, 318.3, 582.8, 318.3, 557.8, 293.0, 550.1, 270.2,
-544.6, 272.1, 531.4, 251.2, 574.7, 276.3, 574.1, 282.0, 606.5, 321.3,
-531.4, 251.2, 526.9, 244.1, 528.3, 242.6, 522.4, 236.9, 563.4, 261.1,
-563.4, 261.1, 604.4, 285.3, 606.6, 286.8, 604.7, 289.6, 604.9, 294.0,
-605.1, 297.0, 605.1, 297.0, 605.3, 300.0, 602.1, 301.3, 605.9, 310.6,
-606.5, 321.3, 574.1, 282.0, 574.7, 276.3, 531.4, 251.2, 604.9, 294.0,
-604.7, 289.6, 606.6, 286.8, 604.4, 285.3, 606.9, 286.8, 606.9, 286.8,
-609.4, 288.2, 609.6, 291.0, 605.3, 294.2, 604.9, 294.0, 542.8, 279.0,
-564.4, 308.2, 562.7, 309.6, 586.0, 337.3, 543.6, 311.2, 543.6, 311.2,
-501.2, 285.0, 505.9, 288.8, 510.0, 283.7, 518.8, 282.5, 530.8, 280.7,
-536.5, 273.8, 542.8, 279.0, 567.3, 73.7, 569.0, 78.4, 568.2, 78.7,
-569.1, 83.6, 569.4, 84.9, 569.4, 84.9, 569.6, 86.2, 568.6, 86.9,
-571.5, 91.2, 570.6, 91.6, 566.7, 94.4, 566.7, 94.4, 562.7, 97.1,
-561.8, 97.0, 561.9, 94.1, 561.1, 91.2, 553.1, 61.2, 553.1, 61.2,
-545.1, 31.1, 543.1, 23.6, 543.1, 23.6, 541.1, 16.0, 535.7, -4.2,
-538.8, -5.6, 530.3, -24.4, 551.9, 23.2, 549.6, 24.4, 567.3, 73.7,
-530.3, -24.4, 529.7, -26.0, 529.8, -26.1, 529.4, -27.8, 528.2, -32.2,
-527.2, -32.2, 527.0, -36.7, 526.9, -37.9, 528.8, -39.2, 528.8, -39.2,
-530.9, -27.9, 550.9, -21.1, 549.9, -19.7, 553.8, 1.1, 548.9, 19.7,
-557.7, 22.0, 560.4, 36.7, 560.4, 36.7, 563.1, 51.4, 565.2, 62.6,
-562.9, 63.6, 567.3, 73.7, 549.6, 24.4, 551.9, 23.2, 530.3, -24.4,
-682.2, -11.8, 682.8, -12.2, 687.1, -7.7, 686.9, -7.4, 662.7, 7.7,
-666.9, 14.4, 646.9, 36.3, 607.4, 59.9, 606.8, 59.2, 569.6, 86.2,
-569.4, 84.9, 569.4, 84.9, 569.1, 83.6, 588.0, 66.3, 588.8, 67.1,
-608.4, 50.5, 624.1, 37.2, 624.1, 37.2, 639.9, 23.9, 661.0, 6.1,
-659.3, 3.5, 682.2, -11.8, 376.8, 74.3, 374.7, 66.1, 374.7, 66.1,
-372.6, 57.9, 376.1, 61.9, 406.7, 46.2, 406.0, 43.4, 413.5, 43.8,
-421.0, 59.2, 420.2, 60.1, 406.4, 74.7, 398.1, 75.3, 376.8, 74.3,
-439.2, 19.5, 426.1, 5.7, 426.1, 5.7, 413.0, -8.1, 441.4, -5.2,
-442.7, -8.0, 471.0, -14.3, 488.5, -14.8, 498.8, -2.9, 506.1, -10.7,
-482.9, 14.0, 473.1, 18.6, 439.2, 19.5, 506.1, -10.7, 506.9, -11.0,
-507.9, -10.1, 508.1, -10.5, 487.9, 19.2, 487.4, 18.9, 466.1, 47.9,
-466.2, 47.8, 465.9, 47.6, 465.6, 47.3, 452.6, 33.3, 452.4, 33.4,
-439.2, 19.5, 473.1, 18.6, 482.9, 14.0, 506.1, -10.7, 424.5, 65.0,
-422.7, 62.3, 422.4, 62.5, 420.2, 60.1, 421.0, 59.2, 413.5, 43.8,
-406.0, 43.4, 397.1, 8.3, 364.4, -22.7, 353.5, -18.0, 352.8, -20.5,
-351.7, -22.3, 349.8, -22.3, 355.9, -23.9, 355.9, -23.9, 362.0, -25.4,
-371.9, -18.7, 369.3, -14.8, 376.6, -4.2, 383.0, 5.0, 383.0, 5.0,
-389.3, 14.2, 396.6, 24.7, 396.6, 24.7, 403.8, 35.1, 414.2, 50.1,
-414.5, 49.8, 424.5, 65.0, 414.0, -38.8, 421.4, -40.7, 421.3, -40.9,
-428.6, -42.8, 449.2, -48.0, 449.2, -47.9, 469.8, -53.0, 471.6, -53.4,
-471.6, -53.4, 473.5, -53.9, 443.7, -46.3, 443.8, -46.2, 414.0, -38.8,
-208.2, 292.5, 217.0, 279.3, 222.7, 280.5, 225.8, 266.0, 239.8, 263.1,
-242.0, 274.1, 258.3, 282.1, 260.9, 283.4, 260.9, 283.4, 263.4, 284.6,
-267.9, 286.8, 272.4, 286.8, 272.4, 289.1, 272.4, 291.5, 267.9, 291.5,
-263.4, 293.9, 252.2, 300.0, 252.2, 300.0, 241.0, 306.0, 240.2, 306.5,
-239.9, 307.2, 239.3, 307.0, 223.5, 300.4, 211.9, 303.7, 208.2, 292.5,
-239.3, 307.0, 240.1, 309.9, 227.5, 313.4, 215.6, 319.8, 208.1, 323.9,
-208.1, 323.9, 200.5, 328.0, 197.8, 326.4, 191.7, 329.4, 190.1, 333.6,
-194.5, 320.1, 194.5, 320.1, 198.8, 306.6, 200.1, 299.0, 203.5, 299.5,
-208.2, 292.5, 211.9, 303.7, 223.5, 300.4, 239.3, 307.0, 238.5, 111.6,
-244.2, 108.1, 247.0, 109.7, 249.8, 104.6, 245.6, 119.3, 245.6, 119.3,
-241.5, 134.0, 240.6, 137.6, 239.4, 137.2, 238.0, 140.7, 230.1, 155.8,
-230.1, 155.8, 222.2, 171.0, 200.9, 211.7, 203.3, 213.2, 179.6, 252.5,
-180.5, 246.8, 179.8, 246.7, 179.9, 241.0, 207.3, 175.5, 206.2, 174.7,
-238.5, 111.6, 179.9, 241.0, 180.4, 221.2, 174.6, 203.5, 180.9, 201.5,
-201.5, 161.7, 201.5, 161.7, 222.1, 121.8, 224.7, 114.7, 230.3, 116.7,
-238.5, 111.6, 206.2, 174.7, 207.3, 175.5, 179.9, 241.0, 199.0, 163.7,
-180.0, 201.5, 180.0, 201.5, 161.1, 239.4, 150.1, 261.1, 150.0, 261.0,
-138.9, 282.6, 137.6, 285.0, 137.6, 285.0, 136.3, 287.5, 137.7, 283.6,
-136.5, 283.1, 136.6, 278.7, 146.3, 257.4, 147.8, 258.1, 159.0, 237.4,
-179.0, 200.6, 206.9, 171.3, 199.0, 163.7, 477.6, 762.9, 483.4, 806.1,
-483.5, 806.0, 489.1, 849.3, 489.8, 854.9, 489.6, 854.9, 490.1, 860.6,
-490.8, 868.4, 490.2, 868.5, 491.6, 876.2, 489.4, 864.4, 490.1, 864.3,
-488.6, 852.4, 483.4, 810.0, 483.4, 810.0, 478.2, 767.6, 477.9, 765.3,
-477.9, 765.2, 477.6, 762.9, 491.9, 847.9, 491.7, 854.3, 493.4, 859.1,
-490.1, 860.6, 489.6, 854.9, 489.8, 854.9, 489.1, 849.3, 487.8, 840.3,
-488.3, 840.2, 487.4, 831.1, 485.8, 836.4, 489.1, 837.4, 490.8, 843.6,
-491.4, 845.8, 492.0, 845.8, 491.9, 847.9, 501.5, 451.5, 496.1, 456.3,
-485.1, 452.0, 484.8, 454.4, 495.2, 435.8, 495.2, 435.9, 505.5, 417.3,
-512.4, 405.1, 519.8, 404.6, 519.2, 392.8, 528.4, 376.3, 537.4, 359.8,
-537.5, 359.8, 538.4, 359.2, 538.9, 358.3, 538.6, 357.9, 539.2, 358.7,
-539.7, 358.7, 539.8, 359.6, 540.9, 364.5, 542.6, 364.1, 545.5, 368.5,
-533.3, 400.4, 529.4, 398.9, 513.3, 429.3, 507.4, 440.4, 510.3, 443.7,
-501.5, 451.5, 468.2, 621.6, 466.6, 603.5, 466.5, 603.5, 464.8, 585.3,
-484.5, 550.0, 465.4, 538.7, 463.8, 492.1, 471.6, 478.1, 471.6, 478.1,
-479.4, 464.0, 488.2, 493.2, 477.1, 496.5, 474.8, 529.0, 474.7, 530.5,
-474.7, 530.5, 474.6, 531.9, 472.3, 563.6, 472.3, 563.6, 470.1, 595.2,
-469.2, 607.8, 469.2, 607.8, 468.3, 620.3, 468.2, 621.0, 468.1, 621.0,
-468.2, 621.6, 458.7, 501.2, 458.0, 502.4, 457.3, 502.5, 457.3, 503.6,
-456.5, 494.1, 456.5, 494.1, 455.6, 484.5, 452.4, 490.2, 457.9, 492.8,
-458.7, 501.2, 480.2, 266.5, 481.8, 271.2, 482.9, 270.8, 485.7, 275.1,
-492.4, 286.2, 492.6, 286.0, 499.6, 296.9, 503.1, 301.2, 500.0, 303.7,
-500.3, 310.6, 492.2, 303.8, 495.4, 300.0, 490.6, 289.4, 485.4, 277.9,
-484.3, 278.3, 480.2, 266.5, 205.6, 671.5, 207.4, 667.6, 208.7, 667.8,
-209.3, 663.7, 209.5, 676.0, 209.5, 676.0, 209.6, 688.4, 212.5, 682.3,
-205.7, 680.0, 205.6, 671.5, 173.8, 490.6, 180.4, 471.0, 174.1, 457.5,
-187.1, 451.5, 206.4, 425.2, 203.9, 422.9, 225.7, 398.9, 231.9, 390.5,
-230.2, 388.0, 238.3, 382.2, 236.2, 383.7, 239.4, 387.0, 237.7, 390.2,
-229.6, 406.0, 228.1, 405.3, 218.5, 420.3, 211.9, 430.8, 211.9, 430.8,
-205.2, 441.3, 189.5, 466.0, 196.2, 478.0, 173.8, 490.6, 434.6, 322.4,
-437.2, 344.4, 439.3, 344.4, 439.9, 366.4, 440.0, 367.4, 440.0, 367.4,
-440.0, 368.4, 432.0, 356.0, 432.4, 355.7, 424.7, 343.1, 424.2, 342.3,
-424.2, 342.3, 423.8, 341.6, 419.6, 334.6, 419.6, 334.6, 415.3, 327.6,
-405.7, 311.6, 405.7, 311.6, 396.0, 295.6, 392.0, 289.0, 389.9, 289.5,
-387.9, 282.3, 377.8, 275.8, 385.3, 264.0, 382.7, 245.8, 379.9, 250.3,
-390.0, 256.5, 397.3, 267.3, 407.0, 281.7, 407.0, 281.7, 416.8, 296.1,
-417.2, 296.7, 417.2, 296.7, 417.5, 297.2, 420.5, 301.6, 420.5, 301.6,
-423.4, 305.9, 429.0, 314.1, 432.1, 313.3, 434.6, 322.4, 209.1, 881.3,
-209.0, 881.8, 205.6, 882.1, 202.6, 881.2, 203.0, 880.7, 202.4, 880.2,
-202.3, 879.2, 215.2, 875.8, 205.3, 838.2, 208.2, 797.2, 203.1, 821.6,
-208.5, 822.8, 208.8, 848.4, 209.0, 864.8, 212.1, 865.4, 209.1, 881.3,
-322.4, 303.2, 317.5, 312.0, 320.3, 313.4, 316.6, 322.9, 314.1, 329.5,
-313.2, 329.1, 309.8, 335.3, 309.5, 336.0, 309.4, 336.0, 309.1, 336.7,
-315.6, 319.9, 313.8, 318.9, 322.4, 303.2, 309.8, 335.3, 313.2, 329.1,
-314.1, 329.5, 316.6, 322.9, 311.6, 347.8, 309.5, 347.3, 302.4, 371.7,
-301.0, 376.6, 301.0, 376.6, 299.6, 381.6, 296.0, 393.7, 296.0, 393.7,
-292.5, 405.8, 292.3, 406.5, 292.3, 406.5, 292.1, 407.2, 291.4, 409.5,
-291.4, 409.5, 290.7, 411.9, 283.9, 435.5, 283.9, 435.5, 277.0, 459.0,
-274.5, 467.6, 274.5, 467.6, 272.0, 476.1, 270.8, 480.4, 270.8, 480.4,
-269.5, 484.6, 256.2, 529.7, 256.2, 529.6, 242.9, 574.7, 241.7, 578.5,
-241.8, 578.5, 240.7, 582.4, 236.3, 598.2, 231.9, 614.0, 231.9, 614.0,
-231.9, 614.0, 236.3, 598.2, 240.7, 582.4, 241.8, 578.5, 241.7, 578.5,
-242.9, 574.7, 267.7, 486.1, 267.8, 486.1, 292.4, 397.5, 300.9, 367.2,
-300.6, 367.1, 309.1, 336.7, 309.4, 336.0, 309.5, 336.0, 309.8, 335.3,
-144.7, 133.3, 156.7, 133.2, 156.7, 133.2, 168.8, 133.0, 168.1, 133.2,
-169.2, 137.2, 169.5, 141.3, 146.3, 157.1, 147.5, 158.8, 125.4, 176.3,
-127.9, 177.1, 129.1, 148.9, 144.7, 133.3, 125.4, 176.3, 116.5, 183.4,
-109.2, 182.0, 107.5, 190.5, 104.8, 170.5, 104.8, 170.5, 102.0, 150.6,
-118.6, 144.8, 117.6, 142.0, 133.2, 133.5, 133.7, 132.2, 137.8, 135.0,
-140.7, 133.4, 142.0, 132.4, 142.7, 133.4, 144.7, 133.3, 129.1, 148.9,
-127.9, 177.1, 125.4, 176.3, 115.5, 261.9, 117.0, 266.4, 119.2, 266.7,
-118.6, 270.9, 118.7, 271.9, 118.7, 271.9, 118.9, 272.9, 123.6, 317.8,
-123.5, 317.8, 128.3, 362.6, 128.7, 366.0, 129.2, 369.3, 129.2, 369.3,
-129.2, 369.3, 128.7, 366.0, 128.3, 362.6, 121.9, 312.3, 120.9, 312.4,
-115.5, 261.9, 60.6, 101.9, 65.7, 116.8, 65.7, 116.8, 70.8, 131.7,
-67.1, 140.6, 67.3, 142.3, 69.2, 152.0, 68.3, 163.3, 69.5, 163.5,
-67.4, 174.6, 65.2, 180.0, 65.2, 180.0, 63.0, 185.5, 63.2, 185.1,
-63.0, 185.0, 63.0, 184.6, 62.5, 168.3, 62.5, 168.3, 62.1, 152.1,
-61.3, 127.0, 51.6, 122.9, 60.6, 101.9, 129.6, 436.3, 133.6, 448.4,
-133.2, 448.6, 137.6, 460.5, 122.5, 453.7, 126.3, 445.1, 115.1, 429.8,
-105.8, 417.1, 108.9, 409.5, 96.5, 404.4, 115.6, 412.2, 112.5, 419.8,
-128.4, 435.2, 129.0, 435.8, 129.3, 435.7, 129.6, 436.3, 38.9, 323.2,
-38.5, 321.0, 38.5, 321.0, 38.1, 318.9, 53.0, 296.7, 49.7, 294.5,
-61.2, 270.1, 65.4, 294.0, 51.2, 297.2, 38.9, 323.2, 115.1, 429.8,
-126.3, 445.1, 122.5, 453.7, 137.6, 460.5, 138.0, 461.7, 139.3, 461.7,
-139.2, 462.7, 139.8, 464.7, 142.0, 464.7, 141.8, 466.3, 141.8, 468.7,
-141.8, 468.7, 141.9, 471.0, 142.0, 471.5, 141.7, 471.6, 141.5, 472.1,
-130.0, 454.6, 130.4, 454.3, 119.3, 436.5, 117.2, 433.1, 117.5, 432.9,
-115.1, 429.8, -27.5, 407.4, -30.4, 389.0, -29.2, 388.7, -33.2, 370.6,
--33.3, 359.7, -34.8, 355.3, -28.1, 348.9, -26.1, 355.1, -25.7, 355.0,
--23.3, 361.1, -23.0, 384.2, -14.8, 395.3, -27.5, 407.4, -23.3, 361.1,
--22.7, 362.5, -22.7, 362.5, -22.1, 363.9, -20.4, 368.4, -20.4, 368.4,
--18.6, 372.9, -4.0, 410.0, -0.8, 409.0, 10.6, 447.0, 15.8, 451.1,
-10.4, 458.2, 10.2, 469.4, -3.1, 439.7, -25.9, 441.5, -25.5, 414.1,
--26.2, 412.5, -26.2, 412.5, -27.0, 410.9, -27.8, 409.6, -27.2, 409.2,
--27.5, 407.4, -14.8, 395.3, -23.0, 384.2, -23.3, 361.1, -15.8, 379.3,
--17.1, 376.1, -18.6, 372.9, -18.6, 372.9, -20.4, 368.4, -20.4, 368.4,
--22.1, 363.9, -22.2, 363.6, -22.2, 363.6, -22.3, 363.3, -20.5, 355.6,
--24.5, 354.4, -27.3, 345.7, -27.8, 340.5, -25.4, 335.0, -24.8, 335.0,
--15.9, 341.8, -16.5, 346.7, -6.7, 348.2, -5.9, 347.4, -2.9, 353.3,
-1.7, 354.3, 1.8, 359.9, 9.7, 365.8, 16.8, 365.3, 17.9, 368.2,
-19.8, 367.5, 22.8, 369.6, 22.8, 369.7, 22.8, 369.7, 22.8, 369.7,
-22.9, 371.5, 22.8, 371.5, 22.8, 373.4, 3.9, 378.1, 3.5, 379.5,
--15.8, 379.3, 22.8, 373.4, 22.9, 387.5, 22.9, 387.5, 22.9, 401.7,
-21.1, 397.3, -5.3, 402.7, -5.3, 403.6, -10.6, 391.4, -10.6, 391.4,
--15.8, 379.3, 3.5, 379.5, 3.9, 378.1, 22.8, 373.4, 89.4, 652.2,
-89.7, 652.3, 89.9, 652.3, 89.9, 652.3, 91.2, 668.6, 91.2, 668.6,
-92.5, 684.9, 87.9, 684.0, 90.7, 668.6, 89.4, 652.2, 765.8, 541.1,
-758.0, 521.3, 758.6, 521.0, 750.1, 501.5, 748.7, 497.4, 750.1, 492.7,
-749.0, 492.6, 766.0, 502.0, 785.1, 497.0, 786.1, 505.6, 793.3, 509.5,
-793.3, 509.5, 800.5, 513.5, 798.1, 513.8, 797.1, 519.5, 797.4, 525.2,
-799.3, 532.4, 795.3, 533.5, 793.2, 541.7, 782.4, 547.1, 773.3, 548.1,
-765.8, 541.1, 793.2, 541.7, 787.8, 562.4, 787.8, 562.4, 782.5, 583.1,
-778.3, 561.3, 774.1, 562.1, 765.8, 541.1, 773.3, 548.1, 782.4, 547.1,
-793.2, 541.7, 748.5, 575.4, 744.8, 572.5, 744.4, 572.8, 741.0, 569.6,
-734.7, 564.0, 734.7, 564.0, 728.5, 558.4, 727.5, 551.0, 726.0, 551.2,
-723.5, 543.9, 738.5, 556.7, 737.2, 558.8, 748.5, 575.4, 723.5, 543.9,
-723.0, 542.4, 722.7, 542.5, 722.5, 540.9, 722.2, 539.4, 721.3, 538.6,
-722.0, 537.9, 720.3, 528.5, 720.3, 528.5, 718.6, 519.2, 716.1, 504.7,
-710.9, 503.7, 713.5, 490.2, 718.1, 493.2, 722.6, 492.1, 723.2, 495.6,
-728.2, 499.0, 728.0, 499.4, 733.3, 502.3, 735.2, 505.7, 734.5, 506.4,
-737.1, 509.1, 736.7, 509.4, 739.2, 512.8, 741.2, 516.5, 744.6, 544.7,
-744.7, 547.0, 758.5, 571.7, 759.3, 578.0, 759.3, 578.0, 760.1, 584.4,
-754.8, 579.3, 754.3, 579.9, 748.5, 575.4, 737.2, 558.8, 738.5, 556.7,
-723.5, 543.9, 750.7, 506.1, 751.4, 512.5, 751.4, 512.5, 752.2, 518.9,
-750.9, 515.5, 748.4, 516.4, 744.7, 514.0, 740.3, 506.3, 738.7, 507.1,
-732.3, 500.6, 719.9, 478.6, 726.2, 469.7, 707.6, 456.6, 706.9, 452.6,
-706.9, 452.6, 706.2, 448.6, 730.0, 476.0, 730.8, 475.8, 750.7, 506.1,
-706.2, 448.6, 703.8, 435.3, 705.6, 434.7, 701.5, 422.0, 706.9, 425.7,
-706.9, 425.7, 712.4, 429.4, 714.7, 448.8, 726.1, 451.4, 745.7, 464.8,
-745.7, 465.1, 745.6, 465.3, 745.8, 465.5, 750.7, 468.2, 742.7, 479.3,
-748.1, 484.6, 749.8, 485.2, 747.0, 491.5, 749.0, 492.6, 750.1, 492.7,
-748.7, 497.4, 750.1, 501.5, 751.0, 503.5, 750.4, 503.8, 750.7, 506.1,
-730.8, 475.8, 730.0, 476.0, 706.2, 448.6, 835.7, 623.1, 836.7, 624.3,
-837.6, 623.4, 839.3, 624.0, 839.8, 624.1, 839.7, 624.4, 840.1, 624.8,
-841.3, 625.9, 841.2, 626.1, 842.2, 627.4, 838.6, 626.1, 838.1, 626.0,
-835.7, 623.1, 855.5, 586.8, 860.4, 591.7, 860.4, 591.7, 865.4, 596.6,
-880.6, 617.1, 878.7, 618.8, 895.8, 637.6, 867.6, 630.8, 867.6, 630.5,
-839.3, 624.0, 837.6, 623.4, 836.7, 624.3, 835.7, 623.1, 831.7, 622.2,
-828.2, 620.5, 827.8, 621.3, 835.7, 605.4, 839.2, 607.1, 850.6, 593.0,
-853.0, 589.9, 853.9, 586.4, 855.5, 586.8, 575.2, 385.9, 565.8, 372.2,
-563.7, 373.2, 556.4, 358.5, 548.0, 343.3, 545.6, 329.2, 536.7, 329.8,
-536.4, 326.7, 536.4, 326.7, 536.1, 323.7, 544.7, 334.1, 543.4, 335.2,
-550.6, 346.8, 562.9, 366.3, 565.0, 365.3, 575.2, 385.9, 626.3, 445.3,
-630.7, 459.4, 630.7, 459.4, 635.2, 473.4, 613.2, 440.7, 612.9, 440.9,
-590.6, 408.4, 585.9, 399.5, 595.0, 392.5, 589.2, 386.5, 612.9, 411.0,
-610.1, 414.7, 626.3, 445.3, 589.2, 386.5, 586.2, 380.6, 588.8, 379.2,
-588.3, 372.0, 587.4, 357.9, 582.3, 356.2, 586.5, 343.8, 591.1, 346.9,
-591.1, 346.9, 595.7, 350.0, 597.0, 350.8, 596.5, 351.7, 597.3, 353.4,
-586.5, 392.3, 611.8, 399.4, 626.3, 445.3, 610.1, 414.7, 612.9, 411.0,
-589.2, 386.5, 718.6, 519.2, 720.3, 528.5, 720.3, 528.5, 722.0, 537.9,
-711.8, 549.5, 701.7, 552.1, 703.4, 562.7, 704.0, 563.8, 701.3, 565.4,
-699.3, 568.1, 699.0, 569.1, 696.3, 568.4, 693.3, 568.6, 692.5, 565.5,
-695.3, 564.7, 697.3, 560.8, 700.6, 554.3, 700.6, 554.3, 704.0, 547.8,
-711.3, 533.5, 707.0, 525.6, 718.6, 519.2, 910.3, 563.5, 905.1, 556.1,
-905.1, 556.1, 899.8, 548.7, 901.3, 525.5, 896.4, 525.1, 893.0, 501.6,
-910.5, 526.3, 905.8, 531.9, 910.3, 563.5, 842.9, 516.0, 837.8, 511.5,
-837.8, 511.5, 832.8, 507.0, 832.6, 485.1, 818.1, 481.9, 797.4, 463.4,
-790.1, 450.1, 787.6, 451.4, 777.8, 439.4, 810.7, 477.4, 811.2, 477.0,
-842.9, 516.0, 846.8, 490.9, 830.0, 465.8, 831.1, 465.0, 813.2, 440.7,
-801.8, 415.0, 801.8, 415.0, 790.5, 389.3, 819.3, 429.5, 814.6, 432.8,
-838.7, 476.3, 842.8, 483.6, 842.0, 484.2, 846.8, 490.9, 485.3, 126.2,
-497.4, 124.9, 499.2, 128.7, 509.6, 123.7, 513.3, 124.0, 516.4, 125.4,
-516.9, 124.3, 518.5, 126.3, 518.5, 126.3, 520.2, 128.3, 527.6, 149.4,
-530.3, 148.5, 540.5, 168.7, 511.7, 166.9, 504.0, 153.5, 485.3, 126.2,
-540.5, 168.7, 542.3, 172.2, 542.3, 172.2, 544.1, 175.8, 540.5, 172.5,
-533.0, 178.0, 523.9, 183.4, 497.6, 169.5, 501.3, 162.4, 478.7, 141.4,
-471.8, 134.9, 471.2, 135.4, 464.8, 128.5, 465.1, 128.8, 465.7, 128.2,
-466.5, 128.1, 474.5, 124.3, 475.9, 127.1, 485.3, 126.2, 504.0, 153.5,
-511.7, 166.9, 540.5, 168.7, 804.5, 87.9, 824.8, 103.2, 825.5, 102.3,
-846.3, 117.0, 857.7, 124.9, 857.5, 125.2, 868.7, 133.4, 863.2, 129.3,
-863.1, 129.5, 857.5, 125.5, 831.0, 106.7, 830.4, 107.5, 804.5, 87.9,
-936.1, 245.9, 931.1, 239.5, 929.4, 240.9, 922.7, 235.8, 918.0, 232.3,
-918.1, 232.3, 913.4, 228.8, 876.6, 201.0, 876.6, 201.0, 839.8, 173.3,
-834.8, 169.5, 834.0, 165.0, 829.8, 165.7, 840.9, 163.7, 841.7, 168.3,
-853.6, 170.8, 864.6, 173.1, 868.4, 168.9, 875.6, 175.5, 909.7, 206.5,
-907.6, 209.3, 936.1, 245.9, 686.0, 149.5, 684.1, 135.7, 669.1, 137.8,
-652.1, 126.1, 638.8, 117.0, 638.8, 117.0, 625.6, 107.8, 618.0, 102.6,
-613.6, 104.6, 610.4, 97.3, 615.1, 96.3, 615.1, 96.3, 619.9, 95.3,
-629.9, 99.9, 628.7, 102.5, 637.5, 109.8, 644.5, 115.4, 644.5, 115.4,
-651.4, 121.1, 668.7, 135.3, 683.8, 133.2, 686.0, 149.5, 576.5, 124.0,
-580.8, 126.0, 580.8, 126.0, 585.0, 128.1, 586.0, 128.6, 586.0, 128.7,
-587.0, 129.2, 581.8, 126.6, 581.7, 126.7, 576.5, 124.0, 795.1, 271.6,
-794.1, 271.2, 796.8, 263.4, 798.5, 255.3, 799.9, 248.5, 802.0, 241.9,
-801.3, 241.7, 836.2, 260.0, 836.2, 260.0, 871.1, 278.3, 867.9, 276.4,
-867.0, 277.9, 862.9, 277.6, 829.0, 274.6, 826.3, 282.4, 795.1, 271.6,
-820.2, 241.9, 825.3, 245.5, 825.3, 245.5, 830.4, 249.0, 818.0, 241.3,
-817.2, 242.5, 804.0, 236.0, 810.9, 240.7, 812.5, 238.1, 820.2, 241.9,
-707.8, 186.5, 709.9, 187.9, 709.2, 189.3, 711.3, 190.3, 676.6, 173.2,
-676.6, 173.2, 641.9, 156.2, 623.4, 152.8, 624.9, 144.6, 607.9, 133.0,
-634.7, 139.2, 633.0, 146.5, 658.2, 159.9, 674.4, 168.6, 674.4, 168.6,
-690.7, 177.3, 699.2, 181.9, 699.6, 181.4, 707.8, 186.5, 625.1, 297.5,
-631.6, 301.3, 631.6, 301.3, 638.2, 305.2, 641.4, 305.5, 640.7, 312.7,
-643.3, 320.2, 631.5, 313.3, 629.5, 310.4, 625.1, 297.5, 444.3, 210.5,
-441.2, 208.2, 439.3, 206.5, 439.9, 203.6, 441.9, 192.6, 444.6, 193.1,
-449.3, 182.6, 449.3, 182.6, 449.3, 182.6, 449.3, 182.6, 449.3, 182.6,
-449.3, 182.6, 449.3, 182.6, 462.4, 196.0, 462.4, 196.0, 475.5, 209.3,
-500.5, 245.8, 507.0, 241.3, 538.5, 273.3, 538.9, 273.7, 538.9, 273.8,
-539.3, 274.3, 540.5, 275.8, 540.5, 275.8, 541.6, 277.4, 492.6, 244.5,
-492.1, 245.1, 444.3, 210.5, 626.5, 73.3, 662.7, 57.4, 662.7, 57.4,
-698.9, 41.5, 692.2, 43.1, 696.0, 54.8, 688.7, 58.0, 659.8, 70.7,
-638.4, 53.9, 626.5, 73.3, 688.7, 58.0, 684.0, 56.9, 681.7, 71.7,
-672.7, 84.0, 671.9, 85.1, 670.9, 84.4, 669.1, 84.8, 646.1, 89.7,
-646.1, 94.6, 623.1, 94.6, 612.1, 88.8, 611.6, 89.7, 600.1, 84.9,
-613.5, 79.6, 613.3, 79.1, 626.5, 73.3, 638.4, 53.9, 659.8, 70.7,
-688.7, 58.0, 682.9, 81.8, 678.3, 83.9, 673.3, 81.8, 672.7, 84.0,
-681.7, 71.7, 684.0, 56.9, 688.7, 58.0, 696.0, 54.8, 692.2, 43.1,
-698.9, 41.5, 701.1, 40.5, 701.1, 40.5, 703.4, 39.5, 695.5, 59.7,
-693.9, 59.1, 684.5, 78.6, 683.7, 80.2, 684.2, 81.2, 682.9, 81.8,
-438.1, 128.0, 441.8, 124.7, 441.4, 124.4, 444.8, 120.8, 470.4, 92.8,
-470.4, 92.8, 496.1, 64.9, 506.3, 53.8, 506.3, 53.8, 516.5, 42.7,
-528.8, 29.4, 525.8, 22.1, 541.1, 16.0, 543.1, 23.6, 543.1, 23.6,
-545.1, 31.1, 545.2, 32.4, 543.6, 32.5, 542.1, 33.9, 490.1, 80.9,
-490.4, 81.3, 438.1, 128.0, 444.8, 120.8, 441.4, 124.4, 441.8, 124.7,
-438.1, 128.0, 436.1, 130.2, 436.4, 132.0, 434.0, 132.5, 424.1, 132.5,
-424.1, 132.5, 414.2, 132.6, 424.2, 121.8, 428.9, 123.9, 444.8, 120.8,
-428.3, 100.5, 430.0, 102.1, 417.9, 114.9, 407.5, 129.4, 406.3, 131.1,
-406.3, 131.1, 405.1, 132.7, 401.3, 134.8, 401.5, 136.3, 399.5, 140.5,
-395.8, 140.0, 395.9, 136.0, 393.4, 131.0, 388.3, 125.4, 390.3, 123.5,
-387.3, 116.0, 385.9, 112.6, 386.4, 112.4, 385.5, 108.7, 405.6, 101.1,
-419.0, 91.7, 428.3, 100.5, 376.6, -4.2, 369.3, -14.8, 371.9, -18.7,
-362.0, -25.4, 362.3, -25.5, 362.3, -25.5, 362.6, -25.6, 369.8, -25.0,
-371.8, -27.7, 376.9, -24.1, 413.9, 15.4, 419.5, 10.2, 462.0, 44.4,
-443.6, 22.3, 435.3, 29.2, 408.7, 14.0, 392.6, 4.9, 390.5, 7.5,
-376.6, -4.2, 354.9, 111.6, 352.6, 104.8, 354.4, 104.1, 353.9, 96.6,
-353.5, 89.0, 353.5, 89.0, 353.0, 81.4, 352.5, 73.8, 356.0, 70.2,
-352.0, 66.3, 363.7, 84.6, 379.1, 99.0, 375.4, 102.9, 382.3, 117.9,
-382.3, 118.8, 393.4, 131.0, 395.9, 136.0, 395.8, 140.0, 399.5, 140.5,
-399.3, 141.0, 400.0, 142.2, 400.6, 142.2, 400.6, 148.2, 404.3, 148.1,
-408.1, 154.0, 408.2, 154.1, 408.0, 154.2, 407.9, 154.3, 404.6, 151.9,
-404.7, 151.7, 401.4, 149.1, 381.1, 132.7, 381.1, 132.7, 360.7, 116.3,
-357.8, 114.0, 355.9, 114.6, 354.9, 111.6, 354.1, 229.1, 355.0, 230.2,
-349.9, 234.6, 345.7, 240.1, 343.2, 243.5, 340.1, 246.3, 340.6, 246.9,
-334.1, 239.5, 330.2, 231.4, 333.8, 226.6, 336.9, 222.5, 349.0, 223.4,
-354.1, 229.1, 180.4, 458.9, 165.2, 479.0, 164.5, 478.5, 150.0, 499.1,
-148.8, 490.4, 148.8, 490.4, 147.6, 481.7, 151.1, 474.2, 155.4, 476.2,
-163.2, 470.8, 171.8, 464.8, 176.5, 467.1, 180.4, 458.9, 215.6, 319.8,
-227.5, 313.4, 240.1, 309.9, 239.3, 307.0, 239.9, 307.2, 240.2, 306.5,
-241.0, 306.0, 240.7, 308.1, 240.5, 309.0, 238.9, 309.9, 227.8, 315.9,
-216.7, 313.2, 215.6, 319.8, 222.2, 171.0, 230.1, 155.8, 230.1, 155.8,
-238.0, 140.7, 236.5, 144.5, 236.9, 144.6, 235.8, 148.5, 229.8, 160.1,
-225.6, 158.8, 222.2, 171.0, 176.4, 362.5, 165.4, 402.3, 165.4, 402.3,
-154.3, 442.2, 154.2, 419.4, 152.3, 419.4, 150.3, 396.7, 150.3, 396.6,
-150.3, 396.6, 150.4, 396.6, 163.4, 379.5, 177.8, 378.3, 176.4, 362.5,
-138.4, 232.7, 138.6, 227.7, 141.1, 225.7, 138.8, 222.8, 153.2, 201.8,
-147.7, 192.0, 167.7, 180.7, 169.5, 178.8, 169.6, 178.8, 170.7, 176.4,
-170.6, 175.3, 172.0, 175.3, 172.4, 174.0, 183.0, 160.3, 182.2, 159.7,
-192.0, 145.4, 212.5, 119.2, 212.1, 118.9, 232.3, 92.4, 204.5, 142.4,
-200.4, 140.1, 168.4, 187.8, 153.4, 210.2, 155.7, 212.2, 138.4, 232.7,
-470.8, 711.5, 474.2, 737.2, 474.2, 737.2, 477.6, 762.9, 477.9, 765.2,
-477.9, 765.3, 478.2, 767.6, 474.5, 739.6, 474.2, 739.6, 470.8, 711.5,
-498.0, 805.1, 500.3, 782.9, 501.2, 783.0, 504.3, 760.8, 504.4, 760.3,
-504.4, 760.3, 504.4, 759.9, 513.1, 698.6, 512.1, 698.4, 521.8, 637.3,
-523.2, 628.6, 524.2, 628.7, 526.6, 620.2, 535.0, 590.1, 535.0, 590.1,
-543.4, 560.1, 544.6, 555.9, 545.0, 555.9, 545.8, 551.6, 524.2, 668.1,
-523.8, 668.0, 501.9, 784.4, 500.0, 794.8, 499.1, 794.7, 498.0, 805.1,
-504.3, 760.8, 501.2, 783.0, 500.3, 782.9, 498.0, 805.1, 495.0, 826.5,
-495.9, 826.7, 491.9, 847.9, 492.0, 845.8, 491.4, 845.8, 490.8, 843.6,
-496.7, 802.1, 496.6, 802.0, 504.3, 760.8, 580.1, 422.7, 580.7, 423.6,
-580.7, 423.6, 581.3, 424.5, 581.4, 425.1, 580.6, 425.6, 580.8, 426.0,
-580.0, 424.7, 579.7, 424.1, 580.1, 422.7, 448.7, 409.5, 446.9, 389.4,
-446.9, 389.4, 445.0, 369.4, 445.1, 370.9, 445.7, 370.9, 446.4, 372.4,
-447.4, 374.6, 447.4, 374.6, 448.4, 376.8, 449.8, 380.1, 449.8, 380.1,
-451.3, 383.3, 452.7, 386.4, 452.7, 386.4, 454.1, 389.4, 463.1, 419.2,
-467.1, 418.0, 480.0, 446.7, 483.6, 433.2, 458.4, 430.8, 448.7, 409.5,
-480.0, 446.7, 480.5, 447.8, 480.5, 447.8, 481.0, 448.9, 468.8, 470.9,
-471.1, 472.2, 461.7, 495.7, 460.2, 498.5, 460.2, 498.5, 458.7, 501.2,
-457.9, 492.8, 452.4, 490.2, 455.6, 484.5, 452.1, 447.0, 452.1, 447.0,
-448.7, 409.5, 458.4, 430.8, 483.6, 433.2, 480.0, 446.7, 192.8, 698.4,
-199.2, 685.0, 199.2, 685.0, 205.6, 671.5, 205.7, 680.0, 212.5, 682.3,
-209.6, 688.4, 210.1, 726.6, 221.5, 730.2, 210.6, 764.9, 210.6, 767.8,
-209.7, 770.5, 210.2, 770.6, 208.8, 765.3, 204.7, 766.3, 199.2, 762.1,
-191.8, 731.2, 190.6, 729.9, 192.8, 698.4, 199.2, 762.1, 191.9, 756.3,
-192.1, 756.1, 184.6, 750.6, 182.7, 737.0, 182.7, 737.0, 180.9, 723.4,
-188.3, 722.5, 186.8, 710.9, 192.8, 698.4, 190.6, 729.9, 191.8, 731.2,
-199.2, 762.1, 236.2, 411.3, 233.8, 419.9, 235.6, 420.4, 234.9, 429.5,
-234.5, 434.5, 234.5, 434.5, 234.2, 439.5, 233.2, 453.4, 233.2, 453.4,
-232.2, 467.3, 231.7, 473.0, 231.7, 473.0, 231.3, 478.7, 229.9, 497.9,
-231.2, 498.1, 228.5, 517.2, 227.6, 517.0, 225.0, 523.0, 224.3, 529.2,
-235.1, 554.2, 204.3, 563.1, 199.8, 598.9, 204.3, 603.4, 194.9, 612.9,
-189.9, 626.9, 193.1, 620.6, 191.5, 619.8, 193.0, 612.6, 197.7, 591.0,
-197.7, 591.0, 202.3, 569.3, 204.0, 561.3, 204.0, 561.3, 205.8, 553.2,
-209.1, 537.8, 209.1, 537.8, 212.4, 522.3, 218.1, 495.7, 218.1, 495.7,
-223.8, 469.2, 230.0, 440.3, 228.3, 439.8, 236.2, 411.3, 348.6, 878.3,
-346.2, 840.7, 363.8, 822.4, 343.8, 803.1, 345.5, 776.0, 350.3, 776.3,
-356.8, 749.4, 361.1, 731.7, 358.3, 730.5, 365.4, 714.0, 361.6, 722.8,
-364.4, 724.0, 363.4, 734.1, 362.4, 743.8, 362.4, 743.8, 361.4, 753.6,
-360.9, 758.8, 360.9, 758.8, 360.3, 764.1, 360.0, 767.1, 360.0, 767.1,
-359.7, 770.2, 359.2, 775.3, 359.1, 775.3, 358.6, 780.4, 354.5, 820.5,
-354.5, 820.5, 350.4, 860.7, 349.5, 869.5, 347.6, 869.7, 348.6, 878.3,
-424.8, 241.2, 429.7, 281.8, 429.7, 281.8, 434.6, 322.4, 432.1, 313.3,
-429.0, 314.1, 423.4, 305.9, 419.6, 275.8, 424.1, 275.2, 424.7, 244.6,
-424.8, 242.9, 425.0, 242.8, 424.8, 241.2, 278.9, 391.8, 258.1, 432.7,
-256.9, 432.0, 234.8, 472.2, 233.1, 475.5, 230.4, 476.9, 231.3, 478.7,
-231.7, 473.0, 231.7, 473.0, 232.2, 467.3, 244.9, 442.6, 246.9, 443.6,
-261.6, 419.8, 270.2, 405.8, 271.4, 406.4, 278.9, 391.8, 142.6, 812.3,
-142.0, 745.0, 143.1, 745.0, 143.6, 677.7, 143.8, 660.2, 144.9, 660.2,
-143.9, 642.7, 143.9, 642.7, 143.9, 642.7, 143.9, 642.6, 144.5, 656.6,
-149.1, 656.4, 154.3, 670.2, 155.2, 672.8, 155.2, 673.1, 155.0, 675.9,
-150.4, 732.9, 149.8, 732.8, 144.7, 789.8, 143.7, 801.1, 142.5, 801.1,
-142.6, 812.3, 166.1, 703.6, 176.1, 732.7, 175.0, 733.1, 186.1, 761.7,
-187.3, 770.3, 187.3, 770.3, 188.5, 778.9, 183.8, 801.5, 180.9, 800.9,
-173.4, 823.0, 173.4, 823.1, 173.5, 823.2, 173.5, 823.2, 173.5, 823.2,
-173.4, 823.1, 173.4, 823.0, 171.5, 807.5, 171.5, 807.5, 169.5, 791.9,
-165.2, 757.5, 162.3, 757.6, 160.9, 723.1, 160.5, 713.5, 169.8, 709.3,
-166.1, 703.6, 160.9, 723.1, 152.3, 701.7, 157.9, 699.5, 155.0, 675.9,
-155.2, 673.1, 155.2, 672.8, 154.3, 670.2, 156.0, 674.9, 156.0, 674.9,
-157.8, 679.7, 162.5, 691.5, 162.0, 691.7, 166.1, 703.6, 169.8, 709.3,
-160.5, 713.5, 160.9, 723.1, 90.3, 188.5, 91.4, 191.9, 92.7, 191.9,
-92.6, 195.2, 97.0, 229.5, 104.1, 228.6, 115.5, 261.9, 120.9, 312.4,
-121.9, 312.3, 128.3, 362.6, 127.0, 342.9, 124.1, 343.2, 119.8, 323.7,
-119.2, 321.0, 119.2, 321.0, 118.7, 318.3, 114.6, 299.8, 114.6, 299.8,
-110.6, 281.3, 100.4, 234.9, 100.0, 235.0, 90.3, 188.5, 55.9, 88.2,
-58.2, 95.1, 58.2, 95.1, 60.6, 101.9, 51.6, 122.9, 61.3, 127.0,
-62.1, 152.1, 51.9, 122.6, 56.8, 120.2, 55.9, 88.2, 128.4, 435.2,
-112.5, 419.8, 115.6, 412.2, 96.5, 404.4, 88.8, 396.0, 89.7, 395.1,
-82.9, 385.9, 82.7, 385.3, 82.6, 385.4, 82.2, 384.9, 88.2, 391.3,
-88.1, 391.4, 94.0, 397.8, 111.2, 416.5, 120.2, 413.2, 128.4, 435.2,
-59.1, 353.3, 49.3, 339.9, 51.9, 336.6, 39.5, 326.5, 39.3, 325.6,
-39.4, 325.6, 39.1, 324.7, 38.9, 324.0, 39.0, 324.0, 38.9, 323.2,
-51.2, 297.2, 65.4, 294.0, 61.2, 270.1, 62.8, 266.8, 62.8, 266.8,
-64.4, 263.4, 63.2, 308.4, 74.8, 313.5, 59.1, 353.3, 64.4, 263.4,
-65.7, 260.7, 67.4, 260.4, 67.0, 257.9, 72.4, 272.6, 72.4, 272.6,
-77.7, 287.3, 83.2, 291.6, 76.6, 299.7, 76.0, 312.1, 76.0, 314.7,
-75.8, 314.6, 75.7, 317.2, 82.3, 326.3, 62.3, 336.1, 60.9, 355.8,
-60.0, 354.6, 60.0, 354.6, 59.1, 353.3, 74.8, 313.5, 63.2, 308.4,
-64.4, 263.4, 94.6, 422.5, 88.8, 404.2, 88.9, 404.1, 82.9, 385.9,
-89.7, 395.1, 88.8, 396.0, 96.5, 404.4, 108.9, 409.5, 105.8, 417.1,
-115.1, 429.8, 117.5, 432.9, 117.2, 433.1, 119.3, 436.5, 106.1, 431.9,
-102.1, 433.0, 94.6, 422.5, 119.3, 436.5, 130.4, 454.3, 130.0, 454.6,
-141.5, 472.1, 135.1, 490.1, 135.1, 490.1, 128.8, 508.0, 128.5, 505.7,
-125.4, 503.4, 124.8, 503.8, 124.8, 503.8, 124.6, 503.6, 124.4, 503.4,
-117.4, 500.8, 119.6, 494.7, 114.9, 486.1, 119.4, 483.8, 104.7, 454.3,
-94.6, 422.5, 102.1, 433.0, 106.1, 431.9, 119.3, 436.5, 93.3, 695.5,
-93.8, 702.6, 91.2, 708.1, 94.4, 709.6, 89.1, 714.5, 89.1, 714.5,
-83.8, 719.4, 83.9, 719.1, 79.8, 717.4, 75.8, 715.5, 68.6, 706.3,
-67.0, 706.5, 56.3, 701.2, 56.1, 701.0, 56.1, 701.0, 55.9, 700.7,
-61.0, 692.4, 52.8, 687.4, 49.7, 674.1, 69.7, 671.4, 74.7, 680.8,
-93.3, 695.5, 49.7, 674.1, 49.3, 672.3, 49.3, 672.3, 48.9, 670.5,
-58.1, 672.3, 70.0, 661.3, 72.2, 648.9, 80.8, 650.5, 80.8, 650.5,
-89.4, 652.2, 90.7, 668.6, 87.9, 684.0, 92.5, 684.9, 92.9, 690.2,
-92.9, 690.2, 93.3, 695.5, 74.7, 680.8, 69.7, 671.4, 49.7, 674.1,
-855.7, 644.3, 864.1, 655.0, 862.1, 657.6, 872.6, 665.6, 867.3, 669.8,
-867.3, 669.8, 861.9, 674.1, 855.1, 664.1, 839.5, 674.7, 817.1, 675.3,
-814.8, 664.3, 834.4, 648.1, 855.7, 644.3, 850.6, 593.0, 839.2, 607.1,
-835.7, 605.4, 827.8, 621.3, 824.4, 623.7, 821.5, 619.7, 815.2, 618.2,
-805.9, 616.0, 805.7, 616.5, 796.5, 613.7, 796.7, 613.2, 796.7, 613.2,
-796.8, 612.7, 806.7, 608.6, 806.9, 609.0, 817.0, 605.3, 833.8, 599.1,
-848.1, 589.4, 850.6, 593.0, 550.6, 346.8, 543.4, 335.2, 544.7, 334.1,
-536.1, 323.7, 535.4, 316.0, 538.8, 312.6, 534.6, 308.4, 560.5, 326.1,
-560.5, 326.1, 586.5, 343.8, 582.3, 356.2, 587.4, 357.9, 588.3, 372.0,
-570.6, 373.5, 567.0, 362.0, 550.6, 346.8, 588.3, 372.0, 588.8, 379.2,
-586.2, 380.6, 589.2, 386.5, 595.0, 392.5, 585.9, 399.5, 590.6, 408.4,
-582.9, 397.1, 582.9, 397.1, 575.2, 385.9, 565.0, 365.3, 562.9, 366.3,
-550.6, 346.8, 567.0, 362.0, 570.6, 373.5, 588.3, 372.0, 706.7, 478.9,
-709.8, 483.0, 713.1, 483.1, 713.0, 487.0, 713.1, 488.1, 712.7, 488.6,
-713.3, 489.1, 713.6, 489.3, 713.2, 490.0, 713.5, 490.2, 710.9, 503.7,
-716.1, 504.7, 718.6, 519.2, 707.0, 525.6, 711.3, 533.5, 704.0, 547.8,
-694.7, 516.5, 701.7, 512.8, 706.7, 478.9, 922.2, 514.6, 918.6, 541.0,
-913.8, 541.2, 915.0, 567.3, 913.1, 566.1, 913.1, 566.1, 911.3, 564.9,
-910.8, 564.5, 910.9, 564.3, 910.5, 563.7, 912.9, 551.4, 913.4, 551.5,
-916.3, 539.2, 916.9, 536.7, 916.9, 536.7, 917.5, 534.2, 919.9, 524.4,
-921.4, 524.5, 922.2, 514.6, 868.0, 523.0, 871.7, 528.3, 871.8, 528.1,
-875.4, 533.5, 880.0, 540.1, 880.9, 539.6, 884.7, 546.7, 882.9, 545.5,
-882.5, 544.0, 881.1, 544.3, 881.2, 544.2, 876.3, 539.0, 874.5, 539.8,
-875.5, 535.3, 864.1, 532.8, 853.8, 525.7, 847.5, 522.2, 848.3, 520.8,
-842.9, 516.0, 811.2, 477.0, 810.7, 477.4, 777.8, 439.4, 764.3, 422.8,
-764.3, 422.8, 750.9, 406.3, 794.4, 444.7, 792.0, 447.3, 833.2, 488.3,
-850.6, 505.7, 851.2, 505.1, 868.0, 523.0, 800.2, 369.8, 812.1, 386.9,
-808.4, 391.3, 823.9, 404.0, 850.1, 450.0, 852.8, 448.7, 884.2, 491.5,
-887.5, 513.7, 885.0, 514.4, 890.9, 536.0, 891.2, 536.4, 890.9, 536.6,
-891.0, 537.3, 856.2, 473.4, 856.3, 473.3, 821.7, 409.3, 810.9, 389.5,
-794.8, 382.7, 800.2, 369.8, 906.3, 160.9, 920.0, 170.9, 919.3, 171.9,
-933.6, 180.8, 935.5, 182.7, 933.6, 187.9, 934.2, 187.9, 907.8, 185.9,
-908.1, 182.4, 882.0, 176.8, 878.8, 176.1, 878.8, 176.1, 875.6, 175.5,
-868.4, 168.9, 864.6, 173.1, 853.6, 170.8, 877.1, 159.7, 881.0, 157.7,
-906.3, 160.9, 938.0, 227.0, 943.7, 234.1, 941.1, 238.1, 940.0, 248.8,
-940.2, 247.6, 937.7, 247.7, 936.1, 245.9, 907.6, 209.3, 909.7, 206.5,
-875.6, 175.5, 878.8, 176.1, 878.8, 176.1, 882.0, 176.8, 910.9, 200.7,
-914.7, 198.1, 938.0, 227.0, 882.0, 176.8, 908.1, 182.4, 907.8, 185.9,
-934.2, 187.9, 945.0, 197.5, 932.2, 225.8, 938.0, 227.0, 914.7, 198.1,
-910.9, 200.7, 882.0, 176.8, 913.4, 228.8, 924.8, 237.3, 924.8, 237.3,
-936.1, 245.9, 937.7, 247.7, 940.2, 247.6, 940.0, 248.8, 940.1, 248.9,
-940.0, 249.0, 940.1, 249.1, 934.5, 244.9, 934.5, 244.9, 929.0, 240.6,
-925.8, 238.2, 925.8, 238.2, 922.7, 235.8, 918.0, 232.3, 918.1, 232.3,
-913.4, 228.8, 681.9, 99.4, 674.2, 94.0, 674.0, 93.0, 669.1, 84.8,
-670.9, 84.4, 671.9, 85.1, 672.7, 84.0, 673.3, 81.8, 678.3, 83.9,
-682.9, 81.8, 696.7, 78.9, 697.8, 73.4, 710.6, 75.9, 721.9, 78.2,
-720.8, 83.6, 731.1, 91.4, 735.2, 94.5, 735.9, 98.2, 739.3, 97.6,
-715.3, 102.1, 714.6, 98.4, 689.9, 99.1, 685.9, 99.3, 684.6, 101.2,
-681.9, 99.4, 767.4, 197.3, 774.3, 201.8, 772.5, 209.7, 778.7, 210.2,
-766.2, 203.2, 766.9, 201.7, 753.8, 196.2, 720.3, 174.2, 722.5, 153.6,
-687.8, 150.7, 729.3, 154.2, 728.8, 172.1, 767.4, 197.3, 862.9, 277.6,
-867.0, 277.9, 867.9, 276.4, 871.1, 278.3, 874.9, 280.3, 875.3, 279.8,
-878.8, 282.3, 883.0, 285.2, 883.2, 288.4, 887.3, 288.2, 887.1, 288.3,
-886.8, 288.3, 886.8, 288.4, 870.8, 290.2, 867.9, 292.0, 856.1, 303.1,
-856.0, 302.9, 853.8, 304.2, 851.6, 305.3, 816.2, 322.3, 817.1, 324.5,
-780.8, 339.3, 782.3, 338.7, 780.3, 335.4, 782.0, 333.8, 789.5, 326.7,
-790.6, 327.8, 799.3, 321.8, 802.4, 319.6, 802.4, 319.6, 805.6, 317.4,
-834.2, 297.5, 833.0, 295.4, 862.9, 277.6, 657.9, 132.4, 654.5, 130.0,
-655.6, 128.2, 652.1, 126.1, 669.1, 137.8, 684.1, 135.7, 686.0, 149.5,
-686.9, 150.1, 686.9, 150.1, 687.8, 150.7, 720.3, 173.2, 720.2, 173.3,
-752.8, 195.8, 753.2, 196.1, 753.4, 195.9, 753.8, 196.2, 761.2, 199.3,
-760.5, 200.8, 767.2, 205.4, 764.9, 203.8, 764.9, 203.9, 762.5, 202.3,
-757.6, 199.0, 757.6, 199.0, 752.8, 195.8, 705.4, 164.1, 704.8, 164.9,
-657.9, 132.4, 625.6, 107.8, 638.8, 117.0, 638.8, 117.0, 652.1, 126.1,
-655.6, 128.2, 654.5, 130.0, 657.9, 132.4, 661.1, 135.9, 661.1, 135.9,
-664.3, 139.4, 666.3, 141.5, 666.0, 142.0, 668.3, 143.7, 662.0, 139.2,
-662.4, 138.7, 656.5, 133.7, 646.2, 125.1, 646.2, 125.1, 635.9, 116.5,
-630.8, 112.2, 631.3, 111.2, 625.6, 107.8, 529.6, 223.2, 534.4, 238.6,
-552.7, 230.3, 570.7, 244.0, 580.3, 256.7, 577.6, 260.4, 589.9, 269.3,
-583.2, 266.0, 583.2, 266.0, 576.5, 262.7, 552.2, 244.1, 537.3, 247.9,
-529.6, 223.2, 576.5, 262.7, 542.1, 245.5, 542.5, 244.8, 507.7, 228.3,
-491.6, 218.8, 485.1, 223.3, 475.5, 209.3, 462.4, 196.0, 462.4, 196.0,
-449.3, 182.6, 451.0, 184.5, 451.8, 183.9, 454.2, 185.1, 491.9, 204.2,
-494.1, 200.7, 529.6, 223.2, 537.3, 247.9, 552.2, 244.1, 576.5, 262.7,
-454.2, 185.1, 451.8, 183.9, 451.0, 184.5, 449.3, 182.6, 449.3, 182.6,
-449.3, 182.6, 449.3, 182.6, 436.6, 157.6, 430.6, 159.3, 408.0, 140.6,
-408.6, 140.5, 408.6, 140.5, 409.3, 140.3, 415.1, 145.5, 414.8, 145.9,
-420.4, 151.4, 434.4, 165.4, 434.4, 165.4, 448.4, 179.4, 451.3, 182.2,
-453.2, 181.7, 454.2, 185.1, 613.8, 318.3, 609.5, 309.1, 605.8, 299.8,
-605.3, 300.0, 605.1, 297.0, 605.1, 297.0, 604.9, 294.0, 605.3, 294.2,
-609.6, 291.0, 609.4, 288.2, 617.2, 292.8, 617.2, 292.8, 625.1, 297.5,
-629.5, 310.4, 631.5, 313.3, 643.3, 320.2, 644.4, 323.5, 643.2, 325.5,
-645.5, 326.8, 647.2, 327.6, 645.5, 330.3, 647.2, 331.9, 654.4, 331.7,
-655.2, 355.4, 663.1, 378.8, 631.4, 365.8, 636.9, 349.7, 613.8, 318.3,
-663.1, 378.8, 665.6, 386.2, 665.9, 393.6, 668.1, 393.5, 665.6, 394.7,
-663.0, 395.4, 663.1, 395.9, 657.0, 391.8, 657.0, 391.8, 650.9, 387.6,
-645.7, 384.7, 646.5, 383.2, 642.2, 378.7, 633.7, 347.0, 628.0, 348.5,
-613.8, 318.3, 636.9, 349.7, 631.4, 365.8, 663.1, 378.8, 499.3, 283.8,
-494.8, 281.0, 494.6, 281.3, 490.3, 278.3, 488.5, 277.1, 488.5, 277.1,
-486.8, 275.9, 493.1, 279.8, 493.2, 279.7, 499.3, 283.8, 745.7, 58.1,
-738.0, 64.9, 735.2, 63.3, 730.2, 71.7, 721.6, 76.1, 720.4, 73.8,
-710.6, 75.9, 697.8, 73.4, 696.7, 78.9, 682.9, 81.8, 684.2, 81.2,
-683.7, 80.2, 684.5, 78.6, 714.6, 67.2, 714.3, 62.8, 745.7, 58.1,
-684.5, 78.6, 693.9, 59.1, 695.5, 59.7, 703.4, 39.5, 715.2, 34.3,
-715.7, 35.3, 727.1, 29.1, 740.2, 32.1, 738.4, 39.7, 750.0, 50.0,
-751.2, 51.1, 752.8, 51.7, 752.7, 51.9, 750.0, 51.3, 749.2, 55.0,
-745.7, 58.1, 714.3, 62.8, 714.6, 67.2, 684.5, 78.6, 542.1, 33.9,
-543.6, 32.5, 545.2, 32.4, 545.1, 31.1, 553.1, 61.2, 553.1, 61.2,
-561.1, 91.2, 561.8, 66.9, 553.0, 66.6, 544.8, 42.1, 543.5, 38.0,
-542.0, 37.9, 542.1, 33.9, 407.5, 129.4, 417.9, 114.9, 430.0, 102.1,
-428.3, 100.5, 434.4, 92.1, 434.4, 92.1, 440.4, 83.6, 447.0, 74.6,
-447.0, 74.6, 453.5, 65.5, 459.8, 56.7, 459.8, 56.7, 466.1, 47.9,
-487.4, 18.9, 487.9, 19.2, 508.1, -10.5, 509.0, -11.6, 509.0, -11.6,
-509.8, -12.8, 518.4, -24.7, 515.8, -28.1, 527.0, -36.7, 527.2, -32.2,
-528.2, -32.2, 529.4, -27.8, 519.7, -10.1, 516.9, -11.6, 504.3, 4.5,
-492.4, 20.0, 492.4, 20.0, 480.4, 35.4, 462.3, 58.7, 462.3, 58.7,
-444.3, 82.0, 425.9, 105.7, 427.1, 106.7, 407.5, 129.4, 638.1, -51.9,
-648.3, -56.7, 681.7, -32.3, 682.2, -11.8, 659.3, 3.5, 661.0, 6.1,
-639.9, 23.9, 642.7, 22.6, 639.7, 16.2, 639.5, 8.4, 638.8, -21.7,
-627.0, -46.6, 638.1, -51.9, 590.4, 20.7, 590.0, 21.0, 591.9, 23.2,
-593.4, 25.8, 600.9, 38.2, 611.7, 42.7, 608.4, 50.5, 588.8, 67.1,
-588.0, 66.3, 569.1, 83.6, 568.2, 78.7, 569.0, 78.4, 567.3, 73.7,
-562.9, 63.6, 565.2, 62.6, 563.1, 51.4, 570.9, 33.5, 574.9, 33.8,
-590.4, 20.7, 563.1, 51.4, 560.4, 36.7, 560.4, 36.7, 557.7, 22.0,
-558.4, 22.2, 563.3, 3.6, 568.9, -14.7, 567.4, -13.1, 573.7, -6.8,
-578.5, 1.0, 583.6, 9.6, 583.6, 9.6, 588.8, 18.1, 589.6, 19.4,
-590.7, 20.3, 590.4, 20.7, 574.9, 33.8, 570.9, 33.5, 563.1, 51.4,
-381.2, 91.7, 379.0, 83.0, 379.0, 83.0, 376.8, 74.3, 398.1, 75.3,
-406.4, 74.7, 420.2, 60.1, 422.4, 62.5, 422.7, 62.3, 424.5, 65.0,
-424.7, 65.3, 424.7, 65.3, 424.9, 65.5, 429.1, 70.4, 432.4, 75.9,
-433.3, 75.3, 410.5, 89.0, 407.1, 92.2, 381.2, 91.7, 433.3, 75.3,
-436.2, 74.9, 441.1, 80.3, 440.4, 83.6, 434.4, 92.1, 434.4, 92.1,
-428.3, 100.5, 419.0, 91.7, 405.6, 101.1, 385.5, 108.7, 383.3, 100.2,
-383.3, 100.2, 381.2, 91.7, 407.1, 92.2, 410.5, 89.0, 433.3, 75.3,
-389.3, 14.2, 383.0, 5.0, 383.0, 5.0, 376.6, -4.2, 390.5, 7.5,
-392.6, 4.9, 408.7, 14.0, 405.6, 9.6, 396.6, 18.3, 389.3, 14.2,
-436.9, -32.1, 422.6, -36.7, 419.5, -26.5, 402.0, -21.5, 401.0, -21.6,
-400.6, -21.2, 400.1, -21.7, 390.0, -26.2, 383.0, -17.7, 376.9, -24.1,
-371.8, -27.7, 369.8, -25.0, 362.6, -25.6, 370.0, -27.5, 370.0, -27.5,
-377.4, -29.4, 407.0, -32.0, 410.3, -40.7, 436.9, -32.1, 377.4, -29.4,
-388.0, -32.1, 387.8, -33.8, 398.6, -34.9, 399.3, -35.1, 399.3, -34.9,
-400.0, -35.1, 407.0, -36.9, 407.0, -37.0, 414.0, -38.8, 441.9, -46.0,
-441.9, -45.9, 469.8, -53.0, 471.6, -53.4, 471.6, -53.4, 473.5, -53.9,
-508.4, -62.5, 508.4, -62.5, 543.4, -71.1, 543.5, -71.2, 546.8, -66.8,
-549.1, -67.4, 548.5, -66.6, 548.5, -66.6, 548.0, -65.9, 523.9, -58.0,
-523.8, -58.5, 499.5, -51.2, 493.8, -49.4, 493.8, -49.4, 488.0, -47.7,
-474.0, -43.4, 474.0, -43.4, 460.0, -39.1, 448.4, -35.6, 448.7, -33.5,
-436.9, -32.1, 410.3, -40.7, 407.0, -32.0, 377.4, -29.4, 413.6, -20.3,
-407.8, -20.9, 407.8, -20.9, 402.0, -21.5, 419.5, -26.5, 422.6, -36.7,
-436.9, -32.1, 448.7, -33.5, 448.4, -35.6, 460.0, -39.1, 437.7, -27.9,
-437.4, -27.6, 413.6, -20.3, 262.6, 59.6, 266.1, 47.2, 266.1, 47.2,
-269.6, 34.9, 275.0, 35.4, 273.9, 47.9, 278.3, 61.0, 280.9, 68.7,
-282.6, 68.5, 283.5, 76.5, 283.3, 74.8, 281.6, 75.0, 279.7, 73.4,
-278.0, 72.0, 278.0, 72.0, 276.3, 70.7, 269.4, 65.1, 263.8, 66.2,
-262.6, 59.6, 258.3, 282.1, 242.0, 274.1, 239.8, 263.1, 225.8, 266.0,
-226.1, 264.6, 220.4, 263.4, 215.0, 260.7, 215.6, 260.1, 215.2, 259.7,
-215.5, 258.6, 231.4, 266.1, 230.9, 267.1, 246.4, 275.6, 252.4, 278.8,
-252.2, 279.3, 258.3, 282.1, 328.2, 263.3, 327.4, 271.4, 317.3, 278.9,
-316.7, 278.6, 304.2, 270.5, 309.3, 262.4, 302.0, 246.3, 292.6, 225.6,
-289.8, 226.5, 283.1, 204.9, 281.7, 200.4, 287.8, 196.8, 285.8, 194.3,
-306.2, 219.1, 302.8, 221.9, 319.8, 249.5, 324.0, 256.4, 328.9, 256.9,
-328.2, 263.3, 302.0, 246.3, 309.3, 262.4, 304.2, 270.5, 316.7, 278.6,
-317.4, 281.6, 313.8, 282.4, 310.9, 286.3, 304.9, 294.2, 305.5, 301.5,
-298.9, 302.1, 287.0, 303.2, 286.3, 295.9, 273.8, 289.7, 273.2, 289.5,
-272.7, 289.1, 272.7, 289.2, 286.8, 267.4, 283.3, 250.8, 302.0, 246.3,
-272.7, 289.2, 272.7, 289.2, 272.6, 289.1, 272.4, 289.1, 272.4, 286.8,
-267.9, 286.8, 263.4, 284.6, 262.5, 271.2, 266.8, 270.9, 270.2, 257.1,
-276.7, 231.0, 269.4, 209.6, 283.1, 204.9, 289.8, 226.5, 292.6, 225.6,
-302.0, 246.3, 283.3, 250.8, 286.8, 267.4, 272.7, 289.2, 355.1, 114.2,
-354.4, 113.6, 355.4, 111.8, 354.9, 111.6, 355.9, 114.6, 357.8, 114.0,
-360.7, 116.3, 360.6, 115.1, 357.3, 116.0, 355.1, 114.2, 290.3, 313.5,
-264.4, 347.9, 264.3, 347.9, 238.3, 382.2, 230.2, 388.0, 231.9, 390.5,
-225.7, 398.9, 200.5, 426.6, 203.0, 428.9, 180.4, 458.9, 176.5, 467.1,
-171.8, 464.8, 163.2, 470.8, 180.2, 443.2, 183.7, 445.4, 204.3, 420.0,
-243.4, 371.5, 243.4, 371.5, 282.5, 323.1, 284.3, 320.9, 284.3, 320.9,
-286.0, 318.8, 288.1, 316.1, 288.2, 316.2, 290.3, 313.5, 176.4, 420.6,
-168.2, 442.5, 164.8, 441.2, 153.1, 461.8, 153.0, 462.3, 152.8, 462.2,
-152.7, 462.6, 167.5, 420.8, 166.8, 420.5, 182.4, 379.0, 181.0, 382.6,
-181.8, 382.9, 181.3, 386.7, 178.8, 403.7, 182.3, 404.9, 176.4, 420.6,
-177.5, 256.5, 178.6, 254.5, 179.3, 254.6, 179.6, 252.5, 203.3, 213.2,
-200.9, 211.7, 222.2, 171.0, 225.6, 158.8, 229.8, 160.1, 235.8, 148.5,
-235.5, 149.5, 235.5, 149.5, 235.3, 150.5, 230.0, 160.7, 229.8, 160.6,
-224.3, 170.6, 214.9, 187.9, 214.9, 187.9, 205.5, 205.2, 192.6, 228.8,
-192.5, 228.8, 179.6, 252.5, 179.3, 254.6, 178.6, 254.5, 177.5, 256.5,
-146.0, 348.1, 145.8, 345.7, 145.5, 345.7, 145.6, 343.2, 146.0, 329.6,
-141.9, 317.5, 146.4, 316.0, 151.6, 306.0, 151.6, 306.0, 156.8, 296.1,
-155.4, 298.3, 156.2, 298.9, 155.7, 301.6, 154.8, 305.8, 154.8, 305.8,
-154.0, 309.9, 150.0, 329.0, 150.8, 329.2, 146.0, 348.1, 159.0, 237.4,
-147.8, 258.1, 146.3, 257.4, 136.6, 278.7, 137.5, 255.7, 137.5, 255.7,
-138.4, 232.7, 155.7, 212.2, 153.4, 210.2, 168.4, 187.8, 169.4, 188.0,
-167.3, 213.8, 159.0, 237.4, 168.4, 187.8, 200.4, 140.1, 204.5, 142.4,
-232.3, 92.4, 235.7, 87.8, 236.4, 88.2, 239.2, 83.3, 219.1, 123.5,
-219.1, 123.5, 199.0, 163.7, 206.9, 171.3, 179.0, 200.6, 159.0, 237.4,
-167.3, 213.8, 169.4, 188.0, 168.4, 187.8, 471.9, 840.0, 468.5, 791.8,
-468.5, 791.8, 465.1, 743.6, 463.7, 718.3, 464.4, 718.2, 463.6, 692.9,
-463.5, 690.2, 463.4, 690.2, 463.3, 687.6, 463.2, 686.9, 463.2, 686.2,
-463.2, 686.2, 463.2, 686.2, 463.2, 686.9, 463.3, 687.6, 463.4, 690.2,
-463.5, 690.2, 463.6, 692.9, 467.8, 766.4, 469.7, 766.4, 471.9, 840.0,
-704.6, 772.1, 709.6, 768.3, 709.0, 767.6, 713.4, 763.0, 716.6, 759.7,
-716.6, 759.7, 719.8, 756.4, 725.4, 750.5, 725.4, 750.5, 731.1, 744.7,
-735.2, 740.4, 735.2, 740.4, 739.3, 736.1, 751.8, 723.2, 750.1, 721.0,
-764.3, 710.3, 765.7, 712.6, 766.5, 712.4, 767.2, 714.9, 768.1, 717.4,
-768.7, 717.2, 770.2, 719.5, 739.2, 747.8, 738.0, 746.6, 704.6, 772.1,
-530.8, 680.6, 529.6, 688.2, 529.9, 688.2, 529.0, 695.8, 526.4, 716.5,
-526.4, 716.5, 523.8, 737.3, 519.5, 772.2, 519.5, 772.2, 515.2, 807.1,
-512.6, 828.3, 512.6, 828.3, 510.0, 849.6, 508.0, 865.3, 511.1, 866.3,
-506.1, 880.9, 505.7, 882.1, 499.2, 880.7, 499.2, 881.1, 505.3, 820.4,
-508.7, 820.8, 518.2, 760.4, 524.5, 720.5, 524.2, 720.5, 530.8, 680.6,
-504.4, 759.9, 504.4, 760.3, 504.4, 760.3, 504.3, 760.8, 496.6, 802.0,
-496.7, 802.1, 490.8, 843.6, 489.1, 837.4, 485.8, 836.4, 487.4, 831.1,
-486.4, 819.9, 486.4, 819.9, 485.3, 808.6, 485.3, 808.6, 483.9, 793.3,
-482.5, 778.1, 485.1, 756.8, 480.5, 747.8, 494.2, 736.4, 491.4, 738.7,
-499.5, 748.0, 504.4, 759.9, 494.2, 736.4, 501.4, 685.9, 537.8, 673.8,
-521.8, 637.3, 512.1, 698.4, 513.1, 698.6, 504.4, 759.9, 499.5, 748.0,
-491.4, 738.7, 494.2, 736.4, 572.6, 410.9, 576.4, 416.8, 576.4, 416.8,
-580.1, 422.7, 579.7, 424.1, 580.0, 424.7, 580.8, 426.0, 580.2, 430.4,
-579.6, 430.3, 578.5, 434.6, 577.9, 436.5, 578.4, 438.1, 577.4, 438.4,
-563.8, 442.5, 563.3, 440.9, 549.3, 443.3, 545.6, 443.9, 543.5, 442.4,
-541.9, 444.6, 555.1, 426.2, 553.8, 421.7, 572.6, 410.9, 482.0, 772.1,
-480.0, 750.5, 480.1, 750.5, 478.0, 728.9, 478.3, 721.1, 484.7, 720.8,
-484.0, 713.4, 486.7, 742.4, 492.0, 746.3, 482.0, 772.1, 446.9, 345.2,
-448.3, 351.9, 446.0, 352.4, 445.1, 359.6, 444.8, 361.9, 444.1, 362.0,
-444.5, 364.1, 443.9, 357.8, 443.9, 357.8, 443.4, 351.4, 443.8, 348.2,
-447.5, 347.8, 446.9, 345.2, 406.2, 718.4, 412.9, 726.6, 407.7, 747.1,
-403.8, 747.8, 396.2, 749.3, 393.5, 735.4, 383.3, 722.9, 376.1, 714.2,
-374.3, 704.6, 369.0, 705.6, 385.7, 702.3, 395.6, 705.4, 406.2, 718.4,
-451.5, 559.9, 451.9, 567.7, 451.9, 567.7, 452.4, 575.5, 452.6, 578.7,
-452.6, 578.7, 452.8, 581.9, 453.1, 588.3, 453.1, 588.3, 453.5, 594.6,
-455.3, 625.3, 455.3, 625.3, 457.1, 655.9, 457.9, 669.3, 457.9, 669.3,
-458.7, 682.6, 460.2, 708.3, 460.1, 708.3, 461.7, 734.0, 463.2, 759.1,
-463.3, 759.1, 464.9, 784.3, 464.9, 784.9, 464.8, 784.9, 464.7, 785.5,
-463.1, 759.8, 463.2, 759.7, 461.7, 734.0, 460.1, 708.3, 460.2, 708.3,
-458.7, 682.6, 457.9, 669.3, 457.9, 669.3, 457.1, 655.9, 455.3, 625.3,
-455.3, 625.3, 453.5, 594.6, 453.1, 588.3, 453.1, 588.3, 452.8, 581.9,
-452.6, 578.7, 452.6, 578.7, 452.4, 575.5, 451.9, 567.7, 451.9, 567.7,
-451.5, 559.9, 358.6, 780.4, 359.1, 775.3, 359.2, 775.3, 359.7, 770.2,
-360.0, 767.1, 360.0, 767.1, 360.3, 764.1, 360.9, 758.8, 360.9, 758.8,
-361.4, 753.6, 362.4, 743.8, 362.4, 743.8, 363.4, 734.1, 364.4, 724.0,
-361.6, 722.8, 365.4, 714.0, 365.5, 713.7, 365.5, 713.7, 365.5, 713.5,
-364.5, 723.8, 364.5, 723.8, 363.4, 734.1, 362.4, 743.8, 362.4, 743.8,
-361.4, 753.6, 360.9, 758.8, 360.9, 758.8, 360.3, 764.1, 360.0, 767.1,
-360.0, 767.1, 359.7, 770.2, 359.2, 775.3, 359.1, 775.3, 358.6, 780.4,
-419.4, 196.3, 422.1, 218.7, 422.1, 218.7, 424.8, 241.2, 425.0, 242.8,
-424.8, 242.9, 424.7, 244.6, 423.4, 234.8, 423.6, 234.8, 422.5, 225.0,
-421.0, 210.6, 421.3, 210.6, 419.4, 196.3, 356.8, 749.4, 350.3, 776.3,
-345.5, 776.0, 343.8, 803.1, 354.5, 813.4, 336.9, 831.8, 329.9, 860.4,
-330.6, 857.7, 330.0, 857.6, 330.6, 854.9, 343.4, 802.1, 343.4, 802.1,
-356.8, 749.4, 369.0, 519.0, 376.4, 514.0, 386.1, 528.3, 403.2, 537.7,
-403.4, 537.8, 403.4, 537.8, 403.6, 538.0, 405.6, 539.1, 407.7, 539.3,
-407.6, 540.2, 405.2, 559.0, 409.8, 571.4, 398.6, 577.3, 394.5, 579.5,
-387.8, 566.8, 377.0, 556.3, 376.7, 556.1, 376.5, 556.1, 376.5, 555.8,
-372.5, 537.4, 363.0, 523.0, 369.0, 519.0, 376.5, 555.8, 376.3, 552.5,
-373.2, 552.6, 370.0, 549.5, 362.3, 542.1, 362.3, 542.1, 354.7, 534.6,
-341.8, 522.1, 341.8, 522.1, 329.0, 509.6, 314.1, 495.1, 316.5, 484.7,
-299.2, 480.6, 336.5, 489.3, 341.5, 492.2, 369.0, 519.0, 363.0, 523.0,
-372.5, 537.4, 376.5, 555.8, 403.2, 537.7, 386.1, 528.3, 376.4, 514.0,
-369.0, 519.0, 341.5, 492.2, 336.5, 489.3, 299.2, 480.6, 295.0, 478.2,
-296.3, 475.1, 292.1, 473.7, 302.0, 476.9, 301.3, 479.0, 310.5, 484.3,
-356.8, 511.0, 357.2, 510.5, 403.2, 537.7, 324.0, 409.5, 317.7, 409.2,
-311.5, 396.8, 312.2, 396.0, 316.9, 390.7, 323.6, 396.7, 334.9, 397.3,
-338.5, 397.5, 340.5, 399.4, 342.0, 397.7, 335.1, 405.5, 332.6, 410.0,
-324.0, 409.5, 278.7, 425.6, 285.6, 411.6, 288.9, 412.4, 292.4, 397.5,
-267.8, 486.1, 267.7, 486.1, 242.9, 574.7, 250.8, 548.1, 249.4, 547.7,
-255.8, 520.7, 267.2, 473.2, 267.2, 473.2, 278.6, 425.7, 278.7, 425.6,
-278.7, 425.6, 278.7, 425.6, 278.6, 425.7, 275.1, 429.0, 276.4, 430.3,
-274.1, 435.0, 273.4, 436.3, 273.4, 436.3, 272.8, 437.6, 262.3, 459.0,
-262.3, 459.0, 251.8, 480.4, 239.7, 505.1, 242.2, 506.7, 227.6, 529.8,
-228.1, 523.5, 229.2, 517.3, 228.5, 517.2, 231.2, 498.1, 229.9, 497.9,
-231.3, 478.7, 230.4, 476.9, 233.1, 475.5, 234.8, 472.2, 256.1, 448.4,
-255.5, 447.6, 278.6, 425.7, 234.8, 472.2, 256.9, 432.0, 258.1, 432.7,
-278.9, 391.8, 294.0, 364.3, 294.0, 364.3, 309.1, 336.7, 309.4, 336.0,
-309.5, 336.0, 309.8, 335.3, 301.3, 366.5, 302.9, 367.1, 292.4, 397.5,
-288.9, 412.4, 285.6, 411.6, 278.7, 425.6, 278.7, 425.6, 278.7, 425.6,
-278.6, 425.7, 255.5, 447.6, 256.1, 448.4, 234.8, 472.2, 173.4, 823.0,
-173.4, 823.1, 173.5, 823.2, 173.5, 823.2, 169.0, 836.5, 163.8, 836.8,
-164.5, 849.8, 156.3, 851.7, 151.6, 841.8, 142.6, 830.7, 142.7, 830.7,
-142.6, 826.8, 142.6, 822.9, 142.6, 817.6, 142.3, 817.6, 142.6, 812.3,
-142.5, 801.1, 143.7, 801.1, 144.7, 789.8, 143.9, 791.3, 147.5, 793.0,
-150.3, 796.2, 161.8, 809.6, 161.9, 809.6, 173.4, 823.0, 119.8, 323.7,
-124.1, 343.2, 127.0, 342.9, 128.3, 362.6, 128.7, 366.0, 129.2, 369.3,
-129.2, 369.3, 130.6, 382.7, 130.6, 382.7, 132.1, 396.2, 124.8, 369.2,
-120.5, 370.3, 108.8, 344.5, 107.3, 335.3, 122.1, 325.8, 119.8, 323.7,
-63.0, 185.6, 57.2, 200.1, 54.3, 199.5, 51.4, 214.6, 49.9, 210.5,
-49.9, 210.5, 48.4, 206.4, 53.0, 194.9, 65.5, 192.5, 63.0, 185.6,
-105.4, 363.9, 106.3, 366.5, 106.3, 366.5, 107.3, 369.1, 122.3, 400.9,
-118.4, 402.7, 129.6, 436.3, 129.3, 435.7, 129.0, 435.8, 128.4, 435.2,
-120.2, 413.2, 111.2, 416.5, 94.0, 397.8, 89.6, 384.1, 97.9, 380.0,
-105.4, 363.9, 94.0, 397.8, 88.1, 391.4, 88.2, 391.3, 82.2, 384.9,
-79.3, 381.0, 75.7, 380.0, 76.5, 377.0, 76.4, 376.3, 75.1, 375.7,
-75.3, 375.5, 75.5, 375.2, 74.8, 374.8, 74.3, 374.1, 74.1, 374.0,
-74.2, 373.9, 74.1, 373.8, 75.7, 359.1, 74.5, 359.0, 75.0, 344.2,
-75.0, 344.2, 90.3, 334.3, 90.8, 323.7, 98.1, 343.8, 98.1, 343.8,
-105.4, 363.9, 97.9, 380.0, 89.6, 384.1, 94.0, 397.8, 804.3, 668.0,
-797.3, 661.3, 797.3, 661.3, 790.4, 654.6, 793.9, 640.3, 795.5, 639.4,
-793.8, 625.1, 794.2, 623.3, 794.7, 621.4, 794.7, 621.4, 795.2, 621.3,
-796.2, 619.0, 795.5, 618.0, 795.4, 618.0, 796.0, 615.9, 796.5, 613.7,
-805.7, 616.5, 805.9, 616.0, 815.2, 618.2, 818.6, 641.9, 817.6, 648.5,
-804.3, 668.0, 815.2, 618.2, 821.5, 619.7, 824.4, 623.7, 827.8, 621.3,
-828.2, 620.5, 831.7, 622.2, 835.7, 623.1, 838.1, 626.0, 838.6, 626.1,
-842.2, 627.4, 849.0, 635.9, 849.0, 635.9, 855.7, 644.3, 834.4, 648.1,
-814.8, 664.3, 817.1, 675.3, 814.5, 675.3, 814.5, 675.3, 811.9, 675.4,
-809.7, 676.2, 808.1, 671.7, 804.3, 668.0, 817.6, 648.5, 818.6, 641.9,
-815.2, 618.2, 813.9, 548.1, 824.6, 557.5, 824.6, 557.5, 835.3, 566.8,
-837.5, 568.8, 837.4, 568.9, 839.5, 570.9, 839.5, 570.9, 847.4, 578.7,
-855.2, 586.5, 834.2, 567.7, 833.9, 567.9, 813.9, 548.1, 703.1, 474.3,
-704.9, 476.6, 704.9, 476.6, 706.7, 478.9, 701.7, 512.8, 694.7, 516.5,
-704.0, 547.8, 700.6, 554.3, 700.6, 554.3, 697.3, 560.8, 694.3, 542.7,
-698.6, 542.0, 699.8, 523.1, 700.3, 515.6, 700.3, 515.6, 700.8, 508.2,
-701.6, 497.2, 701.6, 497.2, 702.3, 486.2, 702.5, 483.1, 702.5, 483.1,
-702.7, 480.0, 702.8, 478.7, 702.8, 478.7, 702.9, 477.3, 703.0, 475.8,
-703.5, 474.5, 703.1, 474.3, 918.1, 484.0, 921.1, 492.4, 921.1, 492.4,
-924.1, 500.9, 926.8, 505.5, 923.1, 507.7, 922.2, 514.6, 921.4, 524.5,
-919.9, 524.4, 917.5, 534.2, 914.2, 509.6, 913.3, 508.2, 918.1, 484.0,
-765.5, 384.9, 812.7, 448.1, 811.2, 449.2, 859.8, 511.3, 863.9, 517.2,
-863.9, 517.2, 868.0, 523.0, 851.2, 505.1, 850.6, 505.7, 833.2, 488.3,
-796.5, 438.8, 810.5, 423.8, 765.5, 384.9, 833.2, 488.3, 792.0, 447.3,
-794.4, 444.7, 750.9, 406.3, 745.1, 399.2, 746.0, 393.0, 739.4, 392.2,
-751.7, 387.5, 751.7, 387.5, 764.0, 382.8, 763.8, 383.1, 764.8, 383.9,
-765.5, 384.9, 810.5, 423.8, 796.5, 438.8, 833.2, 488.3, 789.5, 387.2,
-786.9, 381.2, 788.2, 380.2, 784.2, 375.2, 792.1, 372.2, 792.1, 372.2,
-799.9, 369.3, 800.0, 369.2, 800.1, 369.5, 800.2, 369.8, 794.8, 382.7,
-810.9, 389.5, 821.7, 409.3, 820.1, 403.3, 814.9, 404.7, 808.2, 400.0,
-798.9, 393.6, 797.2, 395.2, 789.5, 387.2, 875.3, 138.2, 890.8, 149.6,
-890.8, 149.6, 906.3, 160.9, 881.0, 157.7, 877.1, 159.7, 853.6, 170.8,
-841.7, 168.3, 840.9, 163.7, 829.8, 165.7, 822.6, 162.9, 818.5, 154.8,
-816.9, 156.1, 832.1, 143.9, 836.9, 149.9, 857.0, 143.8, 866.1, 141.0,
-868.0, 135.7, 875.3, 138.2, 839.8, 173.3, 876.6, 201.0, 876.6, 201.0,
-913.4, 228.8, 918.1, 232.3, 918.0, 232.3, 922.7, 235.8, 881.2, 204.6,
-881.1, 204.8, 839.8, 173.3, 774.9, 157.7, 800.5, 192.0, 799.6, 193.6,
-817.9, 232.4, 812.6, 229.4, 812.6, 229.4, 807.2, 226.4, 799.9, 216.7,
-801.9, 215.2, 796.7, 204.0, 785.8, 180.8, 789.9, 177.8, 774.9, 157.7,
-742.1, 168.4, 748.6, 172.2, 747.3, 174.3, 752.5, 180.3, 759.9, 188.8,
-758.0, 193.0, 767.4, 197.3, 728.8, 172.1, 729.3, 154.2, 687.8, 150.7,
-686.9, 150.1, 686.9, 150.1, 686.0, 149.5, 683.8, 133.2, 668.7, 135.3,
-651.4, 121.1, 699.3, 137.2, 698.0, 142.6, 742.1, 168.4, 799.3, 321.8,
-790.6, 327.8, 789.5, 326.7, 782.0, 333.8, 782.8, 333.4, 782.3, 332.4,
-782.6, 330.9, 783.7, 325.5, 781.7, 321.8, 784.9, 320.1, 790.0, 317.2,
-799.1, 322.4, 799.3, 321.8, 664.3, 139.4, 661.1, 135.9, 661.1, 135.9,
-657.9, 132.4, 704.8, 164.9, 705.4, 164.1, 752.8, 195.8, 716.3, 163.2,
-711.0, 169.1, 669.2, 142.5, 666.8, 140.9, 666.5, 141.3, 664.3, 139.4,
-658.2, 159.9, 633.0, 146.5, 634.7, 139.2, 607.9, 133.0, 589.3, 120.3,
-589.3, 120.3, 570.7, 107.6, 572.4, 108.8, 572.5, 108.7, 574.2, 109.7,
-593.2, 121.1, 593.2, 121.1, 612.2, 132.4, 635.2, 146.2, 637.3, 162.6,
-658.2, 159.9, 549.5, 216.0, 560.1, 230.0, 560.1, 230.0, 570.7, 244.0,
-552.7, 230.3, 534.4, 238.6, 529.6, 223.2, 494.1, 200.7, 491.9, 204.2,
-454.2, 185.1, 453.2, 181.7, 451.3, 182.2, 448.4, 179.4, 466.8, 183.8,
-466.3, 185.9, 484.2, 192.4, 511.4, 202.2, 511.4, 202.2, 538.5, 212.0,
-544.0, 214.0, 545.7, 212.3, 549.5, 216.0, 468.4, 248.2, 463.1, 244.0,
-464.6, 242.2, 460.7, 236.1, 452.5, 223.3, 456.0, 216.4, 444.3, 210.5,
-492.1, 245.1, 492.6, 244.5, 541.6, 277.4, 542.2, 278.2, 542.2, 278.3,
-542.8, 279.0, 536.5, 273.8, 530.8, 280.7, 518.8, 282.5, 491.3, 271.0,
-492.2, 267.1, 468.4, 248.2, 518.8, 282.5, 510.0, 283.7, 505.9, 288.8,
-501.2, 285.0, 500.2, 284.4, 500.2, 284.4, 499.3, 283.8, 493.2, 279.7,
-493.1, 279.8, 486.8, 275.9, 486.2, 275.5, 486.0, 275.6, 485.7, 275.1,
-482.9, 270.8, 481.8, 271.2, 480.2, 266.5, 477.7, 262.6, 477.7, 262.6,
-475.1, 258.7, 471.8, 253.4, 473.2, 250.8, 468.4, 248.2, 492.2, 267.1,
-491.3, 271.0, 518.8, 282.5, 504.3, 4.5, 516.9, -11.6, 519.7, -10.1,
-529.4, -27.8, 529.8, -26.1, 529.7, -26.0, 530.3, -24.4, 538.8, -5.6,
-535.7, -4.2, 541.1, 16.0, 525.8, 22.1, 528.8, 29.4, 516.5, 42.7,
-516.9, 42.3, 516.0, 41.4, 515.6, 40.0, 510.5, 23.9, 510.5, 23.9,
-505.4, 7.7, 504.9, 6.1, 503.8, 5.4, 504.3, 4.5, 639.5, 8.4,
-639.7, 16.2, 642.7, 22.6, 639.9, 23.9, 624.1, 37.2, 624.1, 37.2,
-608.4, 50.5, 611.7, 42.7, 600.9, 38.2, 593.4, 25.8, 593.3, 25.3,
-597.4, 24.3, 601.4, 22.8, 610.8, 19.2, 610.8, 19.2, 620.2, 15.7,
-624.8, 14.0, 624.8, 14.0, 629.3, 12.3, 634.4, 10.4, 638.2, 7.0,
-639.5, 8.4, 453.5, 65.5, 447.0, 74.6, 447.0, 74.6, 440.4, 83.6,
-441.1, 80.3, 436.2, 74.9, 433.3, 75.3, 432.4, 75.9, 429.1, 70.4,
-424.9, 65.5, 436.5, 59.9, 447.5, 58.4, 453.5, 65.5, 450.5, -16.5,
-432.0, -18.4, 432.0, -18.4, 413.6, -20.3, 437.4, -27.6, 437.7, -27.9,
-460.0, -39.1, 474.0, -43.4, 474.0, -43.4, 488.0, -47.7, 479.7, -27.7,
-472.1, -24.4, 450.5, -16.5, 265.1, 182.1, 248.9, 202.2, 226.0, 217.1,
-225.3, 216.3, 232.4, 185.6, 232.4, 185.6, 239.6, 154.9, 239.5, 155.4,
-240.3, 155.6, 240.9, 156.3, 249.7, 165.6, 249.7, 165.6, 258.5, 175.0,
-261.8, 178.5, 265.5, 181.5, 265.1, 182.1, 286.3, 163.8, 287.4, 159.2,
-290.1, 157.2, 295.2, 156.1, 293.8, 156.4, 295.6, 160.6, 293.7, 162.2,
-291.1, 164.4, 286.7, 162.2, 286.3, 163.8, 319.8, 249.5, 302.8, 221.9,
-306.2, 219.1, 285.8, 194.3, 281.7, 180.7, 289.7, 178.2, 293.7, 162.2,
-295.6, 160.6, 293.8, 156.4, 295.2, 156.1, 298.4, 143.3, 298.4, 143.3,
-301.6, 130.4, 301.6, 130.4, 301.5, 130.3, 301.5, 130.3, 301.5, 130.3,
-301.6, 130.4, 301.6, 130.4, 310.7, 190.0, 333.2, 195.5, 319.8, 249.5,
-301.6, 130.4, 302.9, 144.6, 306.2, 144.2, 310.9, 158.1, 320.4, 186.5,
-320.4, 186.5, 329.9, 214.9, 331.8, 220.7, 331.8, 220.7, 333.8, 226.6,
-330.2, 231.4, 334.1, 239.5, 340.6, 246.9, 340.9, 248.6, 339.1, 248.9,
-337.6, 250.9, 332.9, 257.1, 332.4, 263.6, 328.2, 263.3, 328.9, 256.9,
-324.0, 256.4, 319.8, 249.5, 333.2, 195.5, 310.7, 190.0, 301.6, 130.4,
-356.7, 139.2, 350.2, 134.3, 353.0, 126.2, 355.1, 114.2, 357.3, 116.0,
-360.6, 115.1, 360.7, 116.3, 381.1, 132.7, 381.1, 132.7, 401.4, 149.1,
-401.6, 148.1, 373.4, 151.7, 356.7, 139.2, 299.7, 125.0, 289.1, 108.1,
-282.8, 103.1, 286.7, 86.0, 287.4, 82.9, 297.8, 85.2, 308.9, 84.4,
-315.9, 83.9, 321.9, 81.1, 323.0, 83.4, 325.0, 87.7, 319.0, 90.5,
-315.0, 97.6, 310.1, 106.4, 310.1, 106.4, 305.2, 115.3, 302.5, 120.1,
-298.3, 122.7, 299.7, 125.0, 181.3, 386.7, 181.8, 382.9, 181.0, 382.6,
-182.4, 379.0, 186.4, 367.7, 186.4, 367.7, 190.4, 356.3, 188.2, 371.8,
-186.6, 371.8, 181.3, 386.7, 224.3, 170.6, 229.8, 160.6, 230.0, 160.7,
-235.3, 150.5, 231.1, 165.6, 231.1, 165.6, 226.9, 180.6, 227.0, 180.2,
-226.8, 180.1, 226.7, 179.6, 225.5, 175.1, 223.2, 174.4, 224.3, 170.6,
-155.7, 301.6, 156.2, 298.9, 155.4, 298.3, 156.8, 296.1, 157.4, 294.9,
-157.1, 294.1, 158.1, 293.8, 165.8, 287.7, 163.1, 284.1, 168.1, 274.5,
-182.5, 266.1, 189.3, 262.0, 202.7, 267.7, 200.1, 277.3, 200.1, 277.3,
-197.4, 286.9, 194.8, 290.7, 192.0, 288.8, 186.7, 290.7, 179.3, 293.3,
-179.3, 293.3, 172.0, 295.9, 171.2, 296.2, 171.2, 296.2, 170.5, 296.4,
-164.9, 298.4, 164.9, 298.4, 159.2, 300.4, 157.5, 301.0, 155.8, 301.9,
-155.7, 301.6, 474.7, 878.3, 473.3, 859.1, 473.3, 859.1, 471.9, 840.0,
-469.7, 766.4, 467.8, 766.4, 463.6, 692.9, 463.5, 690.2, 463.4, 690.2,
-463.3, 687.6, 463.4, 690.2, 463.5, 690.2, 463.6, 692.9, 467.8, 766.4,
-469.7, 766.4, 471.9, 840.0, 473.3, 859.1, 473.3, 859.1, 474.7, 878.3,
-703.6, 773.3, 704.1, 772.7, 704.0, 772.6, 704.6, 772.1, 738.0, 746.6,
-739.2, 747.8, 770.2, 719.5, 770.4, 719.9, 770.8, 720.0, 770.7, 720.3,
-771.7, 726.6, 776.6, 732.6, 778.2, 732.1, 769.4, 744.7, 763.0, 739.6,
-750.0, 750.0, 696.0, 793.3, 704.4, 809.3, 644.3, 839.4, 681.2, 820.9,
-673.9, 806.3, 703.6, 773.3, 644.3, 839.4, 633.2, 850.9, 632.6, 850.6,
-619.8, 860.2, 624.5, 856.6, 623.9, 855.9, 628.1, 851.5, 661.0, 817.4,
-661.0, 817.4, 693.8, 783.4, 698.7, 778.3, 698.9, 778.5, 703.6, 773.3,
-673.9, 806.3, 681.2, 820.9, 644.3, 839.4, 518.2, 760.4, 508.7, 820.8,
-505.3, 820.4, 499.2, 881.1, 499.0, 882.0, 494.5, 882.9, 492.0, 881.3,
-490.7, 880.5, 491.8, 878.8, 491.6, 876.2, 490.2, 868.5, 490.8, 868.4,
-490.1, 860.6, 493.4, 859.1, 491.7, 854.3, 491.9, 847.9, 495.9, 826.7,
-495.0, 826.5, 498.0, 805.1, 499.1, 794.7, 500.0, 794.8, 501.9, 784.4,
-507.8, 771.4, 517.9, 772.6, 518.2, 760.4, 501.9, 784.4, 516.1, 671.5,
-522.3, 672.2, 543.4, 560.1, 544.6, 555.9, 545.0, 555.9, 545.8, 551.6,
-546.7, 548.5, 546.1, 548.2, 547.5, 545.3, 546.7, 546.9, 547.3, 547.2,
-547.1, 549.0, 545.2, 564.5, 545.2, 564.5, 543.2, 580.0, 542.6, 585.6,
-542.6, 585.6, 541.9, 591.3, 540.1, 605.1, 540.1, 605.1, 538.4, 619.0,
-537.3, 627.8, 537.3, 627.8, 536.3, 636.7, 533.8, 656.3, 533.8, 656.3,
-531.4, 675.9, 531.1, 678.3, 531.2, 678.3, 530.8, 680.6, 524.2, 720.5,
-524.5, 720.5, 518.2, 760.4, 517.9, 772.6, 507.8, 771.4, 501.9, 784.4,
-563.3, 396.4, 568.0, 403.6, 568.0, 403.6, 572.6, 410.9, 553.8, 421.7,
-555.1, 426.2, 541.9, 444.6, 541.1, 445.4, 540.4, 444.8, 539.0, 445.1,
-528.2, 446.9, 528.2, 446.9, 517.4, 448.8, 509.5, 450.2, 501.5, 451.9,
-501.5, 451.5, 510.3, 443.7, 507.4, 440.4, 513.3, 429.3, 535.4, 409.6,
-535.8, 404.9, 563.3, 396.4, 513.3, 429.3, 529.4, 398.9, 533.3, 400.4,
-545.5, 368.5, 554.4, 382.5, 554.4, 382.5, 563.3, 396.4, 535.8, 404.9,
-535.4, 409.6, 513.3, 429.3, 526.6, 620.2, 524.2, 628.7, 523.2, 628.6,
-521.8, 637.3, 537.8, 673.8, 501.4, 685.9, 494.2, 736.4, 480.5, 747.8,
-485.1, 756.8, 482.5, 778.1, 482.3, 775.1, 482.3, 775.1, 482.0, 772.1,
-492.0, 746.3, 486.7, 742.4, 484.0, 713.4, 490.1, 684.0, 495.0, 685.1,
-506.0, 656.7, 507.2, 653.4, 506.8, 653.2, 508.5, 650.2, 517.1, 634.9,
-514.4, 631.9, 526.6, 620.2, 508.5, 650.2, 506.3, 648.9, 514.9, 633.7,
-521.3, 617.1, 524.2, 609.7, 524.2, 609.7, 527.1, 602.3, 535.2, 581.2,
-542.9, 581.4, 543.4, 560.1, 535.0, 590.1, 535.0, 590.1, 526.6, 620.2,
-514.4, 631.9, 517.1, 634.9, 508.5, 650.2, 451.2, 311.6, 452.2, 312.4,
-450.9, 313.9, 450.6, 316.3, 448.7, 330.7, 449.8, 331.0, 446.9, 345.2,
-447.5, 347.8, 443.8, 348.2, 443.4, 351.4, 441.3, 329.1, 441.3, 329.1,
-439.3, 306.7, 439.0, 307.9, 446.5, 307.6, 451.2, 311.6, 490.6, 289.4,
-495.4, 300.0, 492.2, 303.8, 500.3, 310.6, 501.6, 337.8, 501.6, 337.8,
-503.0, 365.1, 487.6, 331.4, 492.5, 327.4, 490.6, 289.4, 453.6, 292.6,
-451.1, 287.9, 456.2, 280.0, 455.2, 279.7, 461.1, 281.5, 459.3, 287.6,
-463.5, 295.5, 465.0, 298.4, 464.4, 300.7, 466.5, 301.3, 459.4, 299.2,
-456.8, 298.7, 453.6, 292.6, 184.0, 643.8, 178.9, 658.2, 177.4, 657.8,
-173.9, 672.6, 169.9, 643.5, 169.9, 643.5, 165.9, 614.5, 163.2, 624.8,
-174.0, 627.6, 182.2, 640.8, 183.1, 642.3, 184.3, 642.6, 184.0, 643.8,
-218.5, 420.3, 228.1, 405.3, 229.6, 406.0, 237.7, 390.2, 232.9, 392.7,
-238.0, 401.0, 236.2, 411.3, 228.3, 439.8, 230.0, 440.3, 223.8, 469.2,
-233.1, 461.9, 221.4, 447.0, 219.0, 424.9, 218.8, 422.6, 217.7, 422.0,
-218.5, 420.3, 421.1, 484.6, 422.3, 473.1, 423.9, 473.2, 426.6, 461.9,
-427.4, 458.4, 428.0, 458.4, 428.3, 454.9, 425.3, 497.4, 424.7, 497.4,
-421.2, 539.9, 420.9, 543.2, 420.6, 543.2, 420.6, 546.5, 420.4, 532.8,
-420.7, 532.8, 420.8, 519.2, 421.0, 501.9, 419.4, 501.7, 421.1, 484.6,
-422.5, 225.0, 423.6, 234.8, 423.4, 234.8, 424.7, 244.6, 424.1, 275.2,
-419.6, 275.8, 423.4, 305.9, 420.5, 301.6, 420.5, 301.6, 417.5, 297.2,
-417.2, 261.1, 417.7, 260.8, 422.5, 225.0, 355.0, 647.4, 355.7, 641.6,
-358.4, 641.9, 358.8, 636.1, 356.5, 665.5, 360.6, 667.3, 351.3, 694.7,
-358.7, 672.9, 352.0, 670.9, 355.0, 647.4, 376.3, 669.4, 377.1, 669.7,
-372.0, 686.8, 367.8, 704.1, 366.7, 708.8, 366.7, 708.8, 365.5, 713.5,
-365.5, 713.7, 365.5, 713.7, 365.4, 714.0, 358.3, 730.5, 361.1, 731.7,
-356.8, 749.4, 343.4, 802.1, 343.4, 802.1, 330.6, 854.9, 337.9, 833.6,
-333.6, 832.1, 336.5, 809.4, 337.2, 803.9, 337.2, 803.9, 337.9, 798.5,
-338.4, 794.6, 338.4, 794.6, 338.9, 790.7, 339.9, 783.2, 339.9, 783.2,
-340.8, 775.8, 345.8, 737.4, 338.7, 735.0, 350.7, 699.0, 356.4, 681.9,
-368.6, 667.1, 376.3, 669.4, 292.5, 405.8, 296.0, 393.7, 296.0, 393.7,
-299.6, 381.6, 301.7, 380.5, 305.9, 388.8, 312.2, 396.0, 311.5, 396.8,
-317.7, 409.2, 324.0, 409.5, 326.5, 412.4, 326.5, 412.4, 329.1, 415.3,
-332.3, 419.0, 331.6, 421.7, 335.5, 422.7, 313.3, 417.0, 306.0, 421.3,
-292.5, 405.8, 302.4, 371.7, 309.5, 347.3, 311.6, 347.8, 316.6, 322.9,
-320.3, 313.4, 317.5, 312.0, 322.4, 303.2, 327.4, 285.8, 327.4, 285.8,
-332.5, 268.4, 332.7, 267.9, 333.0, 267.6, 332.8, 267.4, 338.5, 275.2,
-344.3, 276.1, 343.5, 283.5, 341.6, 301.3, 335.5, 300.7, 327.5, 317.9,
-326.6, 319.9, 326.6, 319.9, 325.6, 322.0, 319.1, 335.8, 319.1, 335.8,
-312.7, 349.7, 310.3, 354.7, 310.3, 354.7, 308.0, 359.7, 305.2, 365.7,
-303.9, 365.4, 302.4, 371.7, 420.4, 487.6, 421.6, 491.2, 419.3, 491.9,
-418.3, 496.3, 418.2, 496.3, 418.2, 496.3, 418.2, 496.4, 416.2, 504.6,
-411.6, 510.8, 414.3, 512.8, 385.3, 491.1, 389.9, 484.9, 365.6, 457.1,
-362.0, 453.0, 362.0, 453.0, 358.5, 448.9, 350.7, 440.1, 352.6, 437.1,
-343.0, 431.2, 380.2, 454.0, 378.3, 457.0, 413.7, 482.7, 417.0, 485.2,
-419.3, 484.4, 420.4, 487.6, 303.1, 319.5, 315.6, 292.9, 311.4, 286.3,
-332.5, 268.4, 327.4, 285.8, 327.4, 285.8, 322.4, 303.2, 313.8, 318.9,
-315.6, 319.9, 309.1, 336.7, 294.0, 364.3, 294.0, 364.3, 278.9, 391.8,
-271.4, 406.4, 270.2, 405.8, 261.6, 419.8, 278.8, 368.5, 280.1, 368.6,
-303.1, 319.5, 261.6, 419.8, 246.9, 443.6, 244.9, 442.6, 232.2, 467.3,
-233.2, 453.4, 233.2, 453.4, 234.2, 439.5, 264.1, 377.3, 252.0, 356.3,
-303.1, 319.5, 280.1, 368.6, 278.8, 368.5, 261.6, 419.8, 234.9, 429.5,
-235.6, 420.4, 233.8, 419.9, 236.2, 411.3, 238.0, 401.0, 232.9, 392.7,
-237.7, 390.2, 239.4, 387.0, 236.2, 383.7, 238.3, 382.2, 258.8, 351.6,
-260.3, 352.6, 282.5, 323.1, 284.3, 320.9, 284.3, 320.9, 286.0, 318.8,
-288.1, 316.1, 288.2, 316.2, 290.3, 313.5, 294.6, 307.8, 294.6, 307.8,
-298.9, 302.1, 305.5, 301.5, 304.9, 294.2, 310.9, 286.3, 274.5, 358.7,
-276.4, 360.0, 234.9, 429.5, 310.9, 286.3, 313.8, 282.4, 317.4, 281.6,
-316.7, 278.6, 317.3, 278.9, 327.4, 271.4, 328.2, 263.3, 332.4, 263.6,
-332.9, 257.1, 337.6, 250.9, 340.4, 253.4, 335.2, 259.1, 332.8, 267.4,
-333.0, 267.6, 332.7, 267.9, 332.5, 268.4, 311.4, 286.3, 315.6, 292.9,
-303.1, 319.5, 252.0, 356.3, 264.1, 377.3, 234.2, 439.5, 234.5, 434.5,
-234.5, 434.5, 234.9, 429.5, 276.4, 360.0, 274.5, 358.7, 310.9, 286.3,
-240.7, 582.4, 236.3, 598.2, 231.9, 614.0, 231.9, 614.0, 226.4, 633.0,
-226.3, 633.0, 220.8, 652.1, 219.4, 656.7, 217.9, 656.8, 218.1, 661.3,
-219.1, 648.1, 219.1, 648.1, 220.0, 634.9, 225.6, 614.0, 228.0, 614.6,
-236.0, 594.4, 238.4, 588.4, 239.4, 588.6, 240.7, 582.4, 169.5, 791.9,
-171.5, 807.5, 171.5, 807.5, 173.4, 823.0, 161.9, 809.6, 161.8, 809.6,
-150.3, 796.2, 150.1, 795.3, 166.5, 788.4, 169.5, 791.9, 150.3, 796.2,
-147.5, 793.0, 143.9, 791.3, 144.7, 789.8, 149.8, 732.8, 150.4, 732.9,
-155.0, 675.9, 157.9, 699.5, 152.3, 701.7, 160.9, 723.1, 162.3, 757.6,
-165.2, 757.5, 169.5, 791.9, 166.5, 788.4, 150.1, 795.3, 150.3, 796.2,
-76.7, 162.3, 81.1, 168.4, 84.6, 167.9, 85.5, 174.4, 87.9, 181.5,
-87.9, 181.5, 90.3, 188.5, 100.0, 235.0, 100.4, 234.9, 110.6, 281.3,
-108.8, 272.7, 108.2, 272.8, 105.7, 264.3, 104.5, 259.8, 104.5, 259.8,
-103.2, 255.3, 89.9, 208.8, 87.0, 209.4, 76.7, 162.3, 50.5, 72.6,
-53.0, 79.9, 51.3, 86.0, 55.5, 87.2, 55.6, 87.2, 55.7, 87.7,
-55.9, 88.2, 56.8, 120.2, 51.9, 122.6, 62.1, 152.1, 62.5, 168.3,
-62.5, 168.3, 63.0, 184.6, 66.0, 173.1, 61.6, 171.9, 60.2, 159.3,
-55.4, 116.0, 53.3, 116.1, 50.5, 72.6, 817.0, 605.3, 806.9, 609.0,
-806.7, 608.6, 796.8, 612.7, 797.2, 611.1, 797.4, 609.5, 797.6, 609.5,
-804.0, 598.2, 804.0, 596.3, 804.0, 583.1, 801.5, 574.7, 806.4, 573.2,
-808.8, 563.4, 819.0, 580.8, 821.5, 586.4, 817.0, 605.3, 808.8, 563.4,
-810.7, 555.2, 810.7, 555.2, 812.7, 547.1, 812.6, 547.5, 813.3, 547.6,
-813.9, 548.1, 833.9, 567.9, 834.2, 567.7, 855.2, 586.5, 855.4, 586.6,
-855.4, 586.6, 855.5, 586.8, 853.9, 586.4, 853.0, 589.9, 850.6, 593.0,
-848.1, 589.4, 833.8, 599.1, 817.0, 605.3, 821.5, 586.4, 819.0, 580.8,
-808.8, 563.4, 911.8, 470.4, 913.5, 473.3, 915.9, 473.9, 915.3, 476.2,
-916.7, 480.1, 916.7, 480.1, 918.1, 484.0, 913.3, 508.2, 914.2, 509.6,
-917.5, 534.2, 916.9, 536.7, 916.9, 536.7, 916.3, 539.2, 913.2, 504.9,
-912.4, 504.8, 911.8, 470.4, 916.3, 539.2, 913.4, 551.5, 912.9, 551.4,
-910.5, 563.7, 910.4, 563.6, 910.4, 563.6, 910.3, 563.5, 905.8, 531.9,
-910.5, 526.3, 893.0, 501.6, 891.1, 488.4, 894.8, 486.7, 889.2, 475.3,
-895.7, 464.8, 895.7, 464.8, 902.2, 454.4, 904.7, 463.1, 907.0, 462.4,
-911.8, 470.4, 912.4, 504.8, 913.2, 504.9, 916.3, 539.2, 849.5, 494.8,
-848.1, 492.9, 848.1, 492.9, 846.8, 490.9, 842.0, 484.2, 842.8, 483.6,
-838.7, 476.3, 844.7, 485.2, 844.3, 485.5, 849.5, 494.8, 738.7, 69.9,
-753.9, 66.6, 761.8, 72.8, 769.2, 63.4, 788.7, 68.7, 786.9, 75.6,
-804.5, 87.9, 830.4, 107.5, 831.0, 106.7, 857.5, 125.5, 854.9, 123.5,
-854.5, 124.1, 851.4, 122.6, 813.2, 104.8, 813.2, 104.8, 775.0, 86.9,
-756.8, 78.4, 741.7, 82.2, 738.7, 69.9, 760.7, 133.2, 746.8, 120.3,
-752.8, 100.3, 740.9, 98.7, 768.4, 102.3, 766.4, 118.0, 791.8, 137.2,
-792.9, 137.9, 792.8, 138.7, 793.9, 138.7, 788.0, 138.5, 788.0, 137.7,
-782.2, 136.8, 771.4, 135.0, 767.4, 139.3, 760.7, 133.2, 684.7, 102.6,
-683.4, 102.7, 682.1, 99.2, 681.9, 99.4, 684.6, 101.2, 685.9, 99.3,
-689.9, 99.1, 689.7, 98.8, 687.4, 102.5, 684.7, 102.6, 705.7, 126.7,
-727.5, 138.7, 723.1, 146.6, 740.5, 166.5, 741.3, 167.5, 741.1, 167.9,
-742.1, 168.4, 698.0, 142.6, 699.3, 137.2, 651.4, 121.1, 644.5, 115.4,
-644.5, 115.4, 637.5, 109.8, 672.1, 113.3, 676.0, 110.3, 705.7, 126.7,
-637.5, 109.8, 628.7, 102.5, 629.9, 99.9, 619.9, 95.3, 621.5, 95.0,
-622.0, 94.0, 623.1, 94.6, 646.1, 94.6, 646.1, 89.7, 669.1, 84.8,
-674.0, 93.0, 674.2, 94.0, 681.9, 99.4, 682.1, 99.2, 683.4, 102.7,
-684.7, 102.6, 692.8, 111.8, 692.8, 111.8, 700.8, 121.1, 703.3, 123.9,
-702.9, 126.2, 705.7, 126.7, 676.0, 110.3, 672.1, 113.3, 637.5, 109.8,
-629.3, 214.7, 629.4, 214.6, 627.9, 213.2, 626.6, 211.7, 620.0, 204.5,
-620.0, 204.5, 613.4, 197.3, 608.6, 192.1, 608.6, 192.1, 603.8, 186.8,
-591.9, 173.9, 591.5, 174.3, 580.1, 161.0, 579.1, 158.9, 579.1, 158.9,
-578.0, 156.8, 578.1, 157.0, 578.3, 156.9, 578.7, 157.1, 580.9, 157.7,
-580.9, 157.7, 583.1, 158.4, 618.0, 168.9, 623.6, 160.4, 653.0, 179.5,
-652.8, 179.4, 647.2, 188.0, 641.5, 196.5, 635.4, 205.6, 636.9, 207.0,
-629.3, 214.7, 689.0, 182.7, 706.2, 191.7, 706.2, 191.7, 723.5, 200.8,
-715.9, 194.0, 712.7, 197.5, 701.9, 194.3, 698.4, 193.2, 697.4, 194.4,
-695.0, 192.2, 691.0, 188.6, 693.0, 183.9, 689.0, 182.7, 626.8, 212.0,
-626.7, 211.8, 626.7, 211.8, 626.6, 211.7, 627.9, 213.2, 629.4, 214.6,
-629.3, 214.7, 633.7, 219.4, 633.7, 219.4, 638.0, 224.2, 638.4, 224.6,
-638.4, 224.6, 638.7, 224.9, 645.6, 232.5, 645.6, 232.5, 652.5, 240.0,
-665.2, 253.8, 665.2, 253.8, 677.8, 267.5, 681.5, 271.6, 681.5, 271.6,
-685.2, 275.6, 685.8, 276.2, 685.8, 276.2, 686.3, 276.8, 688.5, 279.2,
-688.5, 279.2, 690.7, 281.6, 697.1, 288.6, 697.1, 288.6, 703.6, 295.6,
-710.4, 303.0, 710.4, 303.0, 717.1, 310.4, 720.6, 314.2, 720.6, 314.2,
-724.0, 317.9, 730.1, 324.6, 736.2, 331.2, 736.2, 331.2, 736.2, 331.2,
-730.1, 324.6, 724.0, 317.9, 720.6, 314.2, 720.6, 314.2, 717.1, 310.4,
-710.4, 303.0, 710.4, 303.0, 703.6, 295.6, 697.1, 288.6, 697.1, 288.6,
-690.7, 281.6, 688.5, 279.2, 688.5, 279.2, 686.3, 276.8, 685.8, 276.2,
-685.8, 276.2, 685.2, 275.6, 681.5, 271.6, 681.5, 271.6, 677.8, 267.5,
-665.2, 253.8, 665.2, 253.8, 652.5, 240.0, 645.6, 232.5, 645.6, 232.5,
-638.7, 224.9, 638.4, 224.6, 638.4, 224.6, 638.0, 224.2, 633.7, 219.4,
-633.7, 219.4, 629.3, 214.7, 628.1, 213.3, 628.0, 213.3, 626.8, 212.0,
-626.8, 212.0, 626.8, 212.0, 626.8, 212.0, 645.8, 239.4, 690.1, 300.2,
-690.2, 300.2, 731.8, 362.9, 730.3, 363.7, 730.3, 363.7, 728.7, 364.4,
-716.2, 348.6, 717.6, 347.6, 706.4, 330.7, 696.0, 315.0, 696.0, 315.0,
-685.6, 299.3, 665.7, 269.4, 667.0, 268.4, 645.8, 239.4, 792.6, 283.1,
-791.4, 277.9, 793.4, 271.7, 795.1, 271.6, 826.3, 282.4, 829.0, 274.6,
-862.9, 277.6, 833.0, 295.4, 834.2, 297.5, 805.6, 317.4, 800.5, 317.8,
-796.7, 300.8, 792.6, 283.1, 805.6, 317.4, 802.4, 319.6, 802.4, 319.6,
-799.3, 321.8, 799.1, 322.4, 790.0, 317.2, 784.9, 320.1, 784.8, 320.1,
-785.1, 318.9, 785.4, 317.7, 789.0, 300.4, 788.8, 283.1, 792.6, 283.1,
-796.7, 300.8, 800.5, 317.8, 805.6, 317.4, 669.2, 142.5, 711.0, 169.1,
-716.3, 163.2, 752.8, 195.8, 757.6, 199.0, 757.6, 199.0, 762.5, 202.3,
-715.8, 172.5, 715.3, 173.2, 669.2, 142.5, 656.5, 133.7, 662.4, 138.7,
-662.0, 139.2, 668.3, 143.7, 682.3, 157.8, 681.8, 158.3, 695.4, 173.0,
-701.6, 179.8, 707.8, 186.6, 707.8, 186.5, 699.6, 181.4, 699.2, 181.9,
-690.7, 177.3, 677.9, 165.3, 679.7, 163.4, 668.8, 149.5, 662.6, 141.6,
-657.2, 142.1, 656.5, 133.7, 484.2, 192.4, 466.3, 185.9, 466.8, 183.8,
-448.4, 179.4, 434.4, 165.4, 434.4, 165.4, 420.4, 151.4, 423.0, 154.3,
-423.8, 153.6, 427.2, 155.8, 427.8, 156.2, 427.8, 156.2, 428.4, 156.5,
-441.0, 164.6, 441.0, 164.6, 453.6, 172.7, 468.9, 182.5, 483.2, 193.7,
-484.2, 192.4, 511.2, 117.2, 506.6, 118.9, 503.0, 121.8, 502.0, 120.5,
-497.6, 121.5, 496.6, 123.8, 493.2, 122.4, 479.7, 123.8, 478.5, 122.4,
-466.5, 128.1, 465.7, 128.2, 465.1, 128.8, 464.8, 128.5, 464.3, 128.6,
-464.0, 128.4, 463.7, 128.7, 497.3, 92.4, 497.5, 92.6, 531.3, 56.5,
-537.7, 49.7, 541.4, 50.9, 544.1, 42.8, 531.4, 81.3, 530.5, 81.6,
-511.2, 117.2, 544.1, 42.8, 544.3, 42.4, 544.9, 42.3, 544.8, 42.1,
-553.0, 66.6, 561.8, 66.9, 561.1, 91.2, 561.9, 94.1, 561.8, 97.0,
-562.7, 97.1, 560.1, 98.9, 560.1, 98.9, 557.4, 100.7, 533.6, 105.7,
-534.3, 109.0, 511.2, 117.2, 530.5, 81.6, 531.4, 81.3, 544.1, 42.8,
-436.8, 132.4, 435.4, 132.4, 435.4, 132.4, 434.0, 132.5, 436.4, 132.0,
-436.1, 130.2, 438.1, 128.0, 490.4, 81.3, 490.1, 80.9, 542.1, 33.9,
-542.0, 37.9, 543.5, 38.0, 544.8, 42.1, 544.9, 42.3, 544.3, 42.4,
-544.1, 42.8, 541.4, 50.9, 537.7, 49.7, 531.3, 56.5, 484.8, 95.3,
-484.6, 95.1, 436.8, 132.4, 531.3, 56.5, 497.5, 92.6, 497.3, 92.4,
-463.7, 128.7, 458.1, 133.7, 455.3, 131.1, 446.7, 132.3, 442.2, 133.8,
-441.7, 132.4, 436.8, 132.4, 484.6, 95.1, 484.8, 95.3, 531.3, 56.5,
-612.3, -75.3, 626.2, -73.9, 633.4, -66.3, 638.1, -51.9, 627.0, -46.6,
-638.8, -21.7, 639.5, 8.4, 638.2, 7.0, 634.4, 10.4, 629.3, 12.3,
-619.7, -9.4, 624.7, -11.6, 620.1, -35.4, 618.2, -44.7, 618.2, -44.7,
-616.4, -54.1, 614.4, -64.7, 615.4, -75.0, 612.3, -75.3, 403.8, 35.1,
-396.6, 24.7, 396.6, 24.7, 389.3, 14.2, 396.6, 18.3, 405.6, 9.6,
-408.7, 14.0, 435.3, 29.2, 443.6, 22.3, 462.0, 44.4, 462.7, 45.0,
-462.7, 45.0, 463.4, 45.6, 433.6, 40.8, 431.0, 46.6, 403.8, 35.1,
-463.4, 45.6, 464.5, 46.4, 464.7, 46.3, 465.6, 47.3, 465.9, 47.6,
-466.2, 47.8, 466.1, 47.9, 459.8, 56.7, 459.8, 56.7, 453.5, 65.5,
-447.5, 58.4, 436.5, 59.9, 424.9, 65.5, 424.7, 65.3, 424.7, 65.3,
-424.5, 65.0, 414.5, 49.8, 414.2, 50.1, 403.8, 35.1, 431.0, 46.6,
-433.6, 40.8, 463.4, 45.6, 509.8, -12.8, 509.0, -11.6, 509.0, -11.6,
-508.1, -10.5, 507.9, -10.1, 506.9, -11.0, 506.1, -10.7, 498.8, -2.9,
-488.5, -14.8, 471.0, -14.3, 461.5, -12.2, 460.8, -15.4, 450.5, -16.5,
-472.1, -24.4, 479.7, -27.7, 488.0, -47.7, 493.8, -49.4, 493.8, -49.4,
-499.5, -51.2, 509.6, -35.0, 505.7, -32.2, 509.8, -12.8, 499.5, -51.2,
-523.8, -58.5, 523.9, -58.0, 548.0, -65.9, 546.5, -63.9, 544.5, -62.9,
-545.1, -61.8, 545.4, -61.3, 542.5, -60.0, 542.7, -58.6, 543.8, -57.6,
-527.3, -47.3, 528.8, -39.2, 528.8, -39.2, 526.9, -37.9, 527.0, -36.7,
-515.8, -28.1, 518.4, -24.7, 509.8, -12.8, 505.7, -32.2, 509.6, -35.0,
-499.5, -51.2, 284.2, 78.5, 283.5, 81.8, 285.4, 82.2, 286.7, 86.0,
-282.8, 103.1, 289.1, 108.1, 299.7, 125.0, 300.6, 127.6, 301.9, 127.8,
-301.5, 130.3, 299.6, 143.4, 300.6, 144.3, 295.2, 156.1, 290.1, 157.2,
-287.4, 159.2, 286.3, 163.8, 280.3, 169.0, 280.3, 169.0, 274.3, 174.1,
-271.1, 176.8, 268.3, 176.5, 268.0, 179.5, 273.3, 128.7, 274.2, 128.6,
-284.2, 78.5, 373.3, 203.2, 370.5, 207.2, 370.8, 207.5, 367.6, 211.2,
-364.7, 215.0, 364.7, 215.0, 361.9, 218.8, 356.5, 189.2, 344.2, 177.1,
-358.0, 158.3, 349.9, 169.3, 369.1, 180.1, 373.3, 203.2, 358.0, 158.3,
-356.2, 151.9, 357.5, 151.5, 357.1, 144.7, 356.9, 141.9, 357.2, 139.2,
-356.7, 139.2, 373.4, 151.7, 401.6, 148.1, 401.4, 149.1, 404.7, 151.7,
-404.6, 151.9, 407.9, 154.3, 390.6, 178.7, 390.6, 178.7, 373.3, 203.2,
-369.1, 180.1, 349.9, 169.3, 358.0, 158.3, 308.9, 84.4, 297.8, 85.2,
-287.4, 82.9, 286.7, 86.0, 285.4, 82.2, 283.5, 81.8, 284.2, 78.5,
-283.8, 77.5, 283.8, 77.5, 283.5, 76.5, 282.6, 68.5, 280.9, 68.7,
-278.3, 61.0, 282.4, 55.0, 292.3, 52.8, 297.3, 56.6, 307.6, 64.5,
-312.6, 74.0, 308.9, 84.4, 297.3, 56.6, 297.3, 55.1, 303.3, 55.2,
-309.4, 53.8, 320.2, 51.3, 320.2, 51.3, 331.0, 48.8, 335.2, 47.8,
-337.5, 45.1, 339.5, 46.8, 345.7, 56.6, 345.7, 56.6, 352.0, 66.3,
-356.0, 70.2, 352.5, 73.8, 353.0, 81.4, 343.1, 87.8, 339.5, 82.3,
-326.0, 83.2, 324.5, 83.3, 324.5, 83.3, 323.0, 83.4, 321.9, 81.1,
-315.9, 83.9, 308.9, 84.4, 312.6, 74.0, 307.6, 64.5, 297.3, 56.6,
-333.5, 40.1, 335.5, 41.8, 336.2, 41.4, 337.4, 43.5, 338.4, 45.2,
-338.4, 45.2, 339.5, 46.8, 337.5, 45.1, 335.2, 47.8, 331.0, 48.8,
-329.4, 47.0, 330.6, 42.5, 333.5, 40.1, 273.8, 289.7, 286.3, 295.9,
-287.0, 303.2, 298.9, 302.1, 294.6, 307.8, 294.6, 307.8, 290.3, 313.5,
-288.2, 316.2, 288.1, 316.1, 286.0, 318.8, 277.3, 306.1, 269.1, 295.9,
-273.8, 289.7, 204.3, 420.0, 183.7, 445.4, 180.2, 443.2, 163.2, 470.8,
-155.4, 476.2, 151.1, 474.2, 147.6, 481.7, 147.4, 480.0, 147.4, 480.0,
-147.1, 478.3, 146.9, 478.2, 148.1, 475.5, 149.2, 472.6, 175.8, 445.4,
-173.8, 423.9, 204.3, 420.0, 213.9, 354.1, 211.2, 376.4, 202.0, 375.3,
-190.1, 396.4, 185.5, 404.4, 185.5, 404.4, 181.0, 412.4, 178.7, 416.5,
-176.4, 416.5, 176.4, 420.6, 182.3, 404.9, 178.8, 403.7, 181.3, 386.7,
-186.6, 371.8, 188.2, 371.8, 190.4, 356.3, 193.8, 346.9, 193.8, 346.9,
-197.1, 337.6, 204.7, 336.9, 214.8, 347.0, 213.9, 354.1, 197.1, 337.6,
-198.8, 332.8, 201.3, 328.4, 200.5, 328.0, 208.1, 323.9, 208.1, 323.9,
-215.6, 319.8, 216.7, 313.2, 227.8, 315.9, 238.9, 309.9, 237.8, 332.4,
-226.4, 331.9, 214.0, 353.9, 214.0, 354.0, 213.9, 354.1, 213.9, 354.1,
-214.8, 347.0, 204.7, 336.9, 197.1, 337.6, 205.5, 205.2, 214.9, 187.9,
-214.9, 187.9, 224.3, 170.6, 223.2, 174.4, 225.5, 175.1, 226.7, 179.6,
-218.9, 193.9, 203.1, 195.7, 205.5, 205.2, 226.7, 179.6, 226.8, 180.1,
-227.0, 180.2, 226.9, 180.6, 214.8, 224.2, 214.8, 224.2, 202.7, 267.7,
-189.3, 262.0, 182.5, 266.1, 168.1, 274.5, 172.0, 267.1, 178.1, 263.9,
-175.9, 259.7, 176.2, 259.8, 176.7, 258.1, 177.5, 256.5, 191.5, 230.8,
-189.8, 229.7, 205.5, 205.2, 203.1, 195.7, 218.9, 193.9, 226.7, 179.6,
-186.7, 290.7, 192.0, 288.8, 194.8, 290.7, 197.4, 286.9, 189.6, 315.0,
-189.6, 315.0, 181.8, 343.0, 182.1, 342.0, 181.9, 342.0, 182.0, 340.9,
-183.7, 322.7, 183.7, 322.7, 185.4, 304.5, 186.1, 297.6, 183.3, 295.7,
-186.7, 290.7, 463.6, 692.9, 463.5, 690.2, 463.4, 690.2, 463.3, 687.6,
-463.2, 686.9, 463.2, 686.2, 463.2, 686.2, 463.0, 680.2, 463.8, 680.1,
-462.8, 674.3, 464.4, 678.0, 464.4, 678.0, 466.1, 681.7, 466.3, 687.2,
-466.0, 687.8, 463.6, 692.9, 578.5, 434.6, 579.6, 430.3, 580.2, 430.4,
-580.8, 426.0, 580.6, 425.6, 581.4, 425.1, 581.3, 424.5, 602.2, 457.1,
-602.2, 457.1, 623.1, 489.8, 628.7, 470.0, 598.0, 464.0, 578.5, 434.6,
-673.6, 757.7, 672.3, 759.2, 679.5, 765.3, 685.5, 772.8, 689.7, 778.1,
-694.9, 781.9, 693.8, 783.4, 661.0, 817.4, 661.0, 817.4, 628.1, 851.5,
-629.8, 849.8, 629.2, 849.3, 630.3, 847.0, 634.0, 839.4, 634.0, 839.4,
-637.6, 831.9, 639.3, 828.4, 639.3, 828.4, 641.0, 824.9, 657.3, 791.3,
-650.1, 785.2, 673.6, 757.7, 491.4, 532.6, 491.9, 530.4, 503.1, 533.1,
-514.8, 533.6, 520.0, 533.8, 525.1, 533.3, 525.2, 534.0, 525.8, 540.2,
-520.7, 540.8, 516.3, 547.5, 512.5, 553.3, 509.0, 559.2, 508.7, 559.0,
-496.5, 551.7, 488.9, 543.1, 491.4, 532.6, 474.8, 529.0, 477.1, 496.5,
-488.2, 493.2, 479.4, 464.0, 481.8, 459.8, 483.6, 460.0, 484.1, 455.6,
-483.9, 455.4, 484.4, 455.0, 484.8, 454.4, 485.1, 452.0, 496.1, 456.3,
-501.5, 451.5, 501.5, 451.9, 509.5, 450.2, 517.4, 448.8, 517.2, 464.4,
-509.2, 464.3, 501.0, 479.8, 499.7, 482.2, 499.7, 482.2, 498.4, 484.5,
-486.6, 506.8, 469.2, 522.9, 474.8, 529.0, 527.1, 602.3, 524.2, 609.7,
-524.2, 609.7, 521.3, 617.1, 515.0, 592.1, 519.4, 590.9, 517.5, 564.7,
-517.0, 557.6, 517.0, 557.6, 516.5, 550.4, 516.4, 549.0, 515.7, 548.6,
-516.3, 547.5, 520.7, 540.8, 525.8, 540.2, 525.2, 534.0, 536.3, 517.1,
-536.3, 517.1, 547.5, 500.3, 551.2, 494.6, 553.7, 495.1, 555.0, 488.9,
-543.5, 546.1, 541.9, 545.8, 527.1, 602.3, 555.0, 488.9, 555.3, 487.8,
-555.7, 487.9, 556.3, 486.9, 562.9, 477.0, 563.1, 466.9, 569.4, 467.1,
-566.8, 467.0, 566.6, 477.0, 563.8, 487.0, 562.8, 490.6, 562.8, 490.6,
-561.8, 494.2, 556.7, 512.6, 556.7, 512.6, 551.5, 531.1, 549.5, 538.2,
-549.5, 538.2, 547.5, 545.3, 546.1, 548.2, 546.7, 548.5, 545.8, 551.6,
-545.0, 555.9, 544.6, 555.9, 543.4, 560.1, 542.9, 581.4, 535.2, 581.2,
-527.1, 602.3, 541.9, 545.8, 543.5, 546.1, 555.0, 488.9, 432.0, 228.2,
-431.8, 226.0, 431.8, 226.0, 431.6, 223.8, 437.1, 213.6, 439.0, 212.2,
-438.3, 201.1, 439.1, 202.4, 440.2, 203.0, 439.9, 203.6, 439.3, 206.5,
-441.2, 208.2, 444.3, 210.5, 456.0, 216.4, 452.5, 223.3, 460.7, 236.1,
-464.0, 254.6, 453.1, 274.4, 455.8, 275.1, 438.7, 270.4, 443.2, 252.0,
-432.0, 228.2, 455.8, 275.1, 456.6, 276.9, 455.5, 277.4, 455.2, 279.7,
-456.2, 280.0, 451.1, 287.9, 453.6, 292.6, 452.4, 302.1, 456.5, 306.3,
-451.2, 311.6, 446.5, 307.6, 439.0, 307.9, 439.3, 306.7, 435.6, 267.5,
-435.6, 267.5, 432.0, 228.2, 443.2, 252.0, 438.7, 270.4, 455.8, 275.1,
-475.1, 258.7, 477.7, 262.6, 477.7, 262.6, 480.2, 266.5, 484.3, 278.3,
-485.4, 277.9, 490.6, 289.4, 492.5, 327.4, 487.6, 331.4, 503.0, 365.1,
-503.1, 368.1, 503.1, 368.1, 503.3, 371.1, 497.3, 363.5, 498.7, 362.4,
-494.1, 353.7, 486.4, 339.0, 486.4, 339.0, 478.6, 324.2, 472.6, 312.8,
-472.6, 312.8, 466.5, 301.3, 464.4, 300.7, 465.0, 298.4, 463.5, 295.5,
-467.3, 276.7, 465.7, 275.0, 475.1, 258.7, 463.5, 295.5, 459.3, 287.6,
-461.1, 281.5, 455.2, 279.7, 455.5, 277.4, 456.6, 276.9, 455.8, 275.1,
-453.1, 274.4, 464.0, 254.6, 460.7, 236.1, 464.6, 242.2, 463.1, 244.0,
-468.4, 248.2, 473.2, 250.8, 471.8, 253.4, 475.1, 258.7, 465.7, 275.0,
-467.3, 276.7, 463.5, 295.5, 494.1, 353.7, 498.7, 362.4, 497.3, 363.5,
-503.3, 371.1, 503.6, 377.8, 505.6, 383.9, 503.9, 384.4, 498.4, 392.8,
-504.5, 396.8, 505.1, 409.1, 486.1, 398.3, 484.5, 401.1, 463.9, 393.2,
-464.2, 393.4, 466.8, 389.5, 469.6, 385.7, 480.9, 370.9, 480.9, 370.9,
-492.2, 356.2, 493.2, 355.0, 494.4, 354.1, 494.1, 353.7, 185.8, 516.6,
-187.6, 526.3, 190.7, 525.7, 195.7, 534.8, 200.7, 544.0, 203.9, 543.4,
-205.8, 553.2, 204.0, 561.3, 204.0, 561.3, 202.3, 569.3, 189.3, 545.5,
-190.9, 543.6, 185.8, 516.6, 195.7, 534.8, 190.7, 525.7, 187.6, 526.3,
-185.8, 516.6, 179.3, 504.9, 178.5, 505.2, 172.9, 493.1, 173.3, 491.8,
-173.3, 491.8, 173.8, 490.6, 196.2, 478.0, 189.5, 466.0, 205.2, 441.3,
-222.8, 476.9, 207.3, 489.8, 195.7, 534.8, 418.3, 496.3, 419.3, 491.9,
-421.6, 491.2, 420.4, 487.6, 420.7, 486.1, 421.1, 486.1, 421.1, 484.6,
-419.4, 501.7, 421.0, 501.9, 420.8, 519.2, 421.1, 514.2, 420.3, 514.1,
-419.7, 509.1, 419.0, 502.7, 419.0, 502.7, 418.3, 496.4, 418.3, 496.3,
-418.3, 496.3, 418.3, 496.3, 412.4, 667.3, 410.4, 684.4, 413.1, 685.3,
-407.6, 701.4, 411.8, 689.1, 408.8, 688.1, 409.9, 674.8, 410.7, 664.7,
-410.7, 664.7, 411.6, 654.6, 415.4, 609.0, 415.4, 609.0, 419.2, 563.4,
-419.9, 555.0, 419.9, 555.0, 420.6, 546.5, 420.6, 543.2, 420.9, 543.2,
-421.2, 539.9, 417.4, 595.7, 417.3, 595.6, 413.5, 651.4, 413.0, 659.4,
-413.3, 659.4, 412.4, 667.3, 427.3, 776.5, 428.0, 780.3, 430.1, 779.9,
-433.0, 783.4, 446.6, 800.0, 455.1, 797.7, 460.2, 816.6, 457.1, 838.5,
-457.1, 838.5, 453.9, 860.5, 455.4, 855.6, 452.0, 854.6, 450.1, 848.6,
-444.2, 830.0, 444.2, 830.0, 438.3, 811.3, 432.8, 793.9, 430.7, 794.3,
-427.3, 776.5, 406.6, 883.8, 406.0, 882.6, 403.3, 884.1, 400.0, 884.0,
-374.4, 883.8, 374.2, 886.1, 348.9, 883.3, 349.2, 883.2, 348.7, 880.8,
-348.6, 878.3, 347.6, 869.7, 349.5, 869.5, 350.4, 860.7, 355.0, 857.9,
-358.6, 864.1, 366.8, 867.4, 382.6, 873.9, 382.6, 873.9, 398.3, 880.4,
-402.4, 882.1, 405.1, 880.8, 406.6, 883.8, 377.5, 209.4, 376.8, 204.7,
-376.0, 199.9, 376.1, 199.9, 392.8, 177.9, 393.6, 178.5, 409.4, 156.0,
-412.5, 160.9, 412.5, 160.9, 415.7, 165.8, 417.1, 167.5, 416.0, 168.4,
-416.3, 171.0, 416.3, 171.1, 416.1, 171.1, 416.0, 171.3, 413.9, 173.3,
-413.9, 173.3, 411.9, 175.4, 394.7, 192.4, 397.1, 195.9, 377.5, 209.4,
-225.8, 746.3, 226.0, 752.9, 224.7, 752.9, 223.6, 759.5, 217.9, 793.6,
-217.9, 793.6, 212.2, 827.7, 210.5, 838.1, 207.5, 838.4, 208.8, 848.4,
-208.5, 822.8, 203.1, 821.6, 208.2, 797.2, 209.2, 783.9, 213.3, 782.9,
-210.2, 770.6, 209.7, 770.5, 210.6, 767.8, 210.6, 764.9, 225.7, 716.7,
-214.3, 713.1, 218.1, 661.3, 217.9, 656.8, 219.4, 656.7, 220.8, 652.1,
-223.9, 661.3, 221.3, 662.2, 221.9, 672.3, 223.8, 709.3, 225.1, 709.3,
-225.8, 746.3, 377.7, 663.3, 378.7, 665.6, 378.0, 667.1, 376.3, 669.4,
-368.6, 667.1, 356.4, 681.9, 350.7, 699.0, 351.9, 697.8, 351.0, 696.9,
-351.3, 694.7, 360.6, 667.3, 356.5, 665.5, 358.8, 636.1, 359.1, 633.6,
-359.1, 633.6, 359.5, 631.2, 359.5, 631.2, 359.5, 631.2, 359.5, 631.2,
-368.6, 647.3, 370.4, 646.5, 377.7, 663.3, 365.6, 457.1, 389.9, 484.9,
-385.3, 491.1, 414.3, 512.8, 419.1, 522.3, 413.0, 527.4, 407.6, 540.2,
-407.7, 539.3, 405.6, 539.1, 403.6, 538.0, 401.5, 535.4, 402.1, 534.9,
-400.7, 531.7, 387.8, 504.4, 387.8, 504.4, 374.9, 477.0, 370.3, 467.0,
-373.1, 463.9, 365.6, 457.1, 396.0, 295.6, 405.7, 311.6, 405.7, 311.6,
-415.3, 327.6, 415.1, 326.1, 403.1, 330.3, 400.9, 326.8, 393.5, 314.7,
-398.5, 311.6, 396.1, 296.5, 396.1, 296.0, 396.2, 296.0, 396.0, 295.6,
-429.5, 402.8, 428.6, 401.2, 424.0, 404.3, 422.4, 402.4, 409.9, 388.2,
-410.4, 387.3, 401.3, 370.6, 404.8, 377.1, 406.3, 376.3, 411.3, 382.1,
-420.4, 392.5, 423.1, 391.0, 429.5, 402.8, 327.5, 317.9, 335.5, 300.7,
-341.6, 301.3, 343.5, 283.5, 344.7, 282.9, 350.0, 293.2, 356.4, 303.0,
-363.8, 314.1, 363.8, 314.1, 371.2, 325.2, 376.4, 333.1, 375.3, 339.9,
-381.6, 341.0, 353.4, 336.2, 341.1, 338.4, 327.5, 317.9, 413.7, 482.7,
-378.3, 457.0, 380.2, 454.0, 343.0, 431.2, 338.6, 427.9, 339.3, 427.0,
-335.5, 422.7, 331.6, 421.7, 332.3, 419.0, 329.1, 415.3, 342.3, 424.3,
-341.6, 425.3, 354.1, 435.3, 359.8, 439.8, 359.8, 439.8, 365.4, 444.3,
-366.7, 445.3, 366.7, 445.3, 367.9, 446.3, 390.8, 464.5, 388.8, 467.8,
-413.7, 482.7, 274.1, 435.0, 276.4, 430.3, 275.1, 429.0, 278.6, 425.7,
-278.7, 425.6, 278.7, 425.6, 278.7, 425.6, 268.4, 467.8, 268.3, 467.8,
-258.1, 510.1, 256.8, 515.4, 255.8, 520.7, 255.8, 520.7, 255.8, 520.7,
-256.8, 515.4, 258.1, 510.1, 259.6, 503.2, 259.6, 503.2, 261.0, 496.3,
-267.6, 465.7, 266.5, 465.4, 274.1, 435.0, 64.3, 245.5, 63.3, 243.2,
-63.3, 243.2, 62.3, 240.9, 69.8, 212.3, 64.6, 210.9, 66.9, 181.0,
-65.6, 193.9, 66.4, 193.9, 65.9, 206.9, 65.1, 226.2, 66.4, 226.4,
-64.3, 245.5, 43.9, 79.8, 44.0, 76.2, 43.5, 76.1, 44.2, 72.5,
-44.4, 71.7, 44.2, 70.8, 44.2, 70.8, 45.3, 66.2, 44.7, 65.8,
-46.8, 61.7, 46.6, 62.8, 47.2, 62.9, 47.6, 64.1, 46.3, 72.1,
-46.9, 72.5, 43.9, 79.8, 649.4, 530.7, 645.6, 524.9, 641.9, 519.1,
-641.9, 519.1, 639.7, 515.7, 639.7, 515.7, 637.5, 512.3, 637.5, 512.3,
-637.5, 512.3, 637.5, 512.3, 638.0, 511.3, 637.6, 511.1, 637.8, 510.0,
-652.4, 503.5, 652.8, 504.4, 667.8, 498.9, 677.4, 495.4, 677.4, 495.4,
-687.0, 491.8, 694.7, 489.0, 700.5, 484.1, 702.3, 486.2, 701.6, 497.2,
-701.6, 497.2, 700.8, 508.2, 698.8, 512.4, 695.2, 510.7, 689.5, 513.1,
-669.4, 521.9, 670.2, 528.0, 649.4, 530.7, 700.8, 471.3, 701.9, 472.8,
-701.9, 472.8, 703.1, 474.3, 703.5, 474.5, 703.0, 475.8, 702.9, 477.3,
-701.0, 474.9, 700.6, 474.2, 700.8, 471.3, 808.2, 400.0, 814.9, 404.7,
-820.1, 403.3, 821.7, 409.3, 859.1, 470.9, 856.4, 472.5, 890.9, 536.0,
-891.2, 536.4, 890.9, 536.6, 891.0, 537.3, 892.0, 543.8, 892.0, 543.8,
-893.0, 550.3, 848.4, 476.5, 847.1, 476.9, 808.2, 400.0, 893.0, 550.3,
-893.2, 551.5, 892.7, 551.8, 893.3, 552.6, 889.0, 549.7, 889.0, 549.7,
-884.7, 546.7, 880.9, 539.6, 880.0, 540.1, 875.4, 533.5, 862.6, 514.1,
-862.4, 514.2, 849.5, 494.8, 844.3, 485.5, 844.7, 485.2, 838.7, 476.3,
-814.6, 432.8, 819.3, 429.5, 790.5, 389.3, 790.0, 388.3, 790.0, 388.3,
-789.5, 387.2, 797.2, 395.2, 798.9, 393.6, 808.2, 400.0, 847.1, 476.9,
-848.4, 476.5, 893.0, 550.3, 731.1, 91.4, 720.8, 83.6, 721.9, 78.2,
-710.6, 75.9, 720.4, 73.8, 721.6, 76.1, 730.2, 71.7, 731.7, 69.2,
-734.5, 70.8, 738.7, 69.9, 741.7, 82.2, 756.8, 78.4, 775.0, 86.9,
-771.2, 83.6, 767.7, 87.7, 760.4, 88.4, 745.7, 89.9, 744.5, 94.7,
-731.1, 91.4, 782.2, 136.8, 788.0, 137.7, 788.0, 138.5, 793.9, 138.7,
-800.7, 141.9, 800.0, 143.3, 806.2, 148.0, 811.6, 152.0, 811.6, 152.0,
-816.9, 156.1, 818.5, 154.8, 822.6, 162.9, 829.8, 165.7, 834.0, 165.0,
-834.8, 169.5, 839.8, 173.3, 876.6, 201.0, 876.6, 201.0, 913.4, 228.8,
-918.1, 232.3, 918.0, 232.3, 922.7, 235.8, 925.8, 238.2, 925.8, 238.2,
-929.0, 240.6, 912.7, 229.3, 912.8, 229.1, 896.6, 217.7, 896.5, 217.6,
-896.4, 217.7, 896.3, 217.7, 858.2, 190.7, 858.3, 190.6, 820.2, 163.7,
-801.2, 150.2, 798.9, 152.6, 782.2, 136.8, 782.6, 330.9, 782.3, 332.4,
-782.8, 333.4, 782.0, 333.8, 780.3, 335.4, 782.3, 338.7, 780.8, 339.3,
-767.9, 345.5, 767.9, 345.5, 755.0, 351.7, 744.1, 349.8, 745.6, 341.5,
-736.2, 331.2, 736.2, 331.2, 730.1, 324.6, 724.0, 317.9, 748.1, 316.3,
-748.5, 323.3, 773.0, 328.8, 777.8, 329.9, 778.5, 328.6, 782.6, 330.9,
-578.7, 157.1, 578.3, 156.9, 578.1, 157.0, 578.0, 156.8, 567.2, 135.5,
-567.2, 135.5, 556.4, 114.1, 565.8, 120.1, 566.5, 119.0, 576.5, 124.0,
-581.7, 126.7, 581.8, 126.6, 587.0, 129.2, 596.9, 134.4, 596.9, 134.4,
-606.8, 139.6, 603.3, 151.5, 592.9, 148.5, 578.7, 157.1, 690.7, 281.6,
-697.1, 288.6, 697.1, 288.6, 703.6, 295.6, 710.4, 303.0, 710.4, 303.0,
-717.1, 310.4, 720.6, 314.2, 720.6, 314.2, 724.0, 317.9, 730.1, 324.6,
-736.2, 331.2, 736.2, 331.2, 745.6, 341.5, 744.1, 349.8, 755.0, 351.7,
-750.9, 353.7, 750.9, 353.7, 746.8, 355.7, 734.4, 346.0, 737.0, 342.8,
-727.2, 329.8, 708.9, 305.7, 707.9, 306.5, 690.7, 281.6, 645.4, 281.4,
-639.4, 274.1, 639.4, 274.1, 633.4, 266.7, 624.4, 257.5, 629.3, 253.2,
-621.3, 242.7, 617.0, 239.1, 618.6, 237.3, 615.8, 231.9, 631.1, 256.4,
-632.5, 255.7, 645.4, 281.4, 695.4, 173.0, 681.8, 158.3, 682.3, 157.8,
-668.3, 143.7, 666.0, 142.0, 666.3, 141.5, 664.3, 139.4, 666.5, 141.3,
-666.8, 140.9, 669.2, 142.5, 711.0, 169.1, 716.3, 163.2, 752.8, 195.8,
-753.2, 196.1, 753.4, 195.9, 753.8, 196.2, 758.2, 199.1, 758.1, 199.2,
-762.5, 202.3, 764.9, 203.9, 764.9, 203.8, 767.2, 205.4, 768.4, 206.2,
-768.4, 206.2, 769.5, 207.0, 732.3, 190.2, 729.6, 194.5, 695.4, 173.0,
-769.5, 207.0, 794.8, 224.5, 794.8, 224.5, 820.2, 241.9, 812.5, 238.1,
-810.9, 240.7, 804.0, 236.0, 757.7, 213.1, 757.7, 213.1, 711.3, 190.3,
-709.2, 189.3, 709.9, 187.9, 707.8, 186.5, 707.8, 186.6, 701.6, 179.8,
-695.4, 173.0, 729.6, 194.5, 732.3, 190.2, 769.5, 207.0, 574.2, 109.7,
-572.5, 108.7, 572.4, 108.8, 570.7, 107.6, 569.7, 106.9, 569.6, 106.1,
-568.7, 106.2, 569.2, 106.1, 569.2, 106.1, 569.8, 106.0, 572.2, 107.5,
-572.8, 107.4, 574.2, 109.7, 538.5, 212.0, 511.4, 202.2, 511.4, 202.2,
-484.2, 192.4, 483.2, 193.7, 468.9, 182.5, 453.6, 172.7, 477.3, 175.2,
-476.5, 183.3, 499.3, 193.9, 505.2, 196.6, 505.2, 196.6, 511.1, 199.4,
-524.8, 205.7, 524.1, 208.3, 538.5, 212.0, 480.4, 35.4, 492.4, 20.0,
-492.4, 20.0, 504.3, 4.5, 503.8, 5.4, 504.9, 6.1, 505.4, 7.7,
-500.4, 15.2, 499.3, 14.5, 493.2, 21.2, 486.8, 28.3, 485.7, 27.5,
-480.4, 35.4, 413.7, 132.6, 409.4, 132.7, 408.4, 130.9, 405.1, 132.7,
-406.3, 131.1, 406.3, 131.1, 407.5, 129.4, 427.1, 106.7, 425.9, 105.7,
-444.3, 82.0, 453.8, 73.5, 465.3, 82.3, 470.6, 73.3, 450.2, 107.6,
-442.5, 103.1, 414.2, 132.6, 414.0, 132.6, 414.0, 132.6, 413.7, 132.6,
-470.6, 73.3, 480.3, 65.3, 491.4, 73.5, 496.1, 64.9, 470.4, 92.8,
-470.4, 92.8, 444.8, 120.8, 428.9, 123.9, 424.2, 121.8, 414.2, 132.6,
-414.0, 132.6, 414.0, 132.6, 413.7, 132.6, 442.0, 102.8, 439.1, 99.2,
-470.6, 73.3, 578.5, 1.0, 573.7, -6.8, 567.4, -13.1, 568.9, -14.7,
-569.8, -17.4, 571.5, -18.3, 570.6, -20.1, 568.1, -21.8, 573.8, -30.5,
-577.0, -41.0, 574.6, -40.2, 577.3, -31.7, 577.7, -22.4, 578.1, -10.7,
-584.0, -3.9, 578.5, 1.0, 240.9, 156.3, 240.3, 155.6, 239.5, 155.4,
-239.6, 154.9, 248.0, 118.7, 248.0, 118.7, 256.4, 82.5, 253.0, 96.4,
-253.5, 96.5, 250.6, 110.4, 245.7, 133.4, 246.6, 133.6, 240.9, 156.3,
-254.9, 243.8, 255.7, 242.2, 250.0, 239.5, 245.2, 235.3, 235.1, 226.5,
-234.7, 226.9, 225.0, 217.7, 225.1, 217.0, 225.1, 217.0, 225.3, 216.3,
-226.0, 217.1, 248.9, 202.2, 265.1, 182.1, 266.6, 180.8, 266.6, 180.8,
-268.0, 179.5, 268.3, 176.5, 271.1, 176.8, 274.3, 174.1, 267.1, 209.5,
-270.2, 211.6, 254.9, 243.8, 274.3, 174.1, 280.3, 169.0, 280.3, 169.0,
-286.3, 163.8, 286.7, 162.2, 291.1, 164.4, 293.7, 162.2, 289.7, 178.2,
-281.7, 180.7, 285.8, 194.3, 287.8, 196.8, 281.7, 200.4, 283.1, 204.9,
-269.4, 209.6, 276.7, 231.0, 270.2, 257.1, 270.8, 256.4, 254.6, 250.1,
-254.9, 243.8, 270.2, 211.6, 267.1, 209.5, 274.3, 174.1, 245.2, 235.3,
-250.0, 239.5, 255.7, 242.2, 254.9, 243.8, 254.6, 250.1, 270.8, 256.4,
-270.2, 257.1, 266.8, 270.9, 262.5, 271.2, 263.4, 284.6, 260.9, 283.4,
-260.9, 283.4, 258.3, 282.1, 252.2, 279.3, 252.4, 278.8, 246.4, 275.6,
-241.1, 256.7, 240.2, 253.9, 245.2, 235.3, 246.4, 275.6, 230.9, 267.1,
-231.4, 266.1, 215.5, 258.6, 220.2, 238.1, 220.2, 238.1, 225.0, 217.7,
-234.7, 226.9, 235.1, 226.5, 245.2, 235.3, 240.2, 253.9, 241.1, 256.7,
-246.4, 275.6, 357.1, 144.7, 357.5, 151.5, 356.2, 151.9, 358.0, 158.3,
-344.2, 177.1, 356.5, 189.2, 361.9, 218.8, 361.3, 219.5, 361.3, 219.5,
-360.7, 220.3, 355.7, 209.1, 352.7, 208.9, 352.1, 197.2, 350.9, 171.1,
-353.2, 170.7, 357.1, 144.7, 310.9, 158.1, 306.2, 144.2, 302.9, 144.6,
-301.6, 130.4, 301.6, 130.4, 301.5, 130.3, 301.5, 130.3, 301.9, 127.8,
-300.6, 127.6, 299.7, 125.0, 298.3, 122.7, 302.5, 120.1, 305.2, 115.3,
-310.9, 124.6, 306.7, 127.1, 308.3, 138.9, 309.6, 148.5, 305.7, 151.6,
-310.9, 158.1, 309.4, 53.8, 303.3, 55.2, 297.3, 55.1, 297.3, 56.6,
-292.3, 52.8, 282.4, 55.0, 278.3, 61.0, 273.9, 47.9, 275.0, 35.4,
-269.6, 34.9, 270.1, 33.0, 270.1, 33.0, 270.6, 31.1, 271.6, 29.7,
-271.6, 29.7, 272.6, 28.3, 291.9, 39.5, 295.2, 37.4, 309.4, 53.8,
-272.6, 28.3, 281.5, 15.3, 281.5, 15.3, 290.4, 2.4, 306.7, 25.1,
-311.9, 21.3, 333.5, 40.1, 330.6, 42.5, 329.4, 47.0, 331.0, 48.8,
-320.2, 51.3, 320.2, 51.3, 309.4, 53.8, 295.2, 37.4, 291.9, 39.5,
-272.6, 28.3, 263.4, 293.9, 267.9, 291.5, 272.4, 291.5, 272.4, 289.1,
-272.6, 289.1, 272.7, 289.2, 272.7, 289.2, 272.7, 289.1, 273.2, 289.5,
-273.8, 289.7, 269.1, 295.9, 277.3, 306.1, 286.0, 318.8, 284.3, 320.9,
-284.3, 320.9, 282.5, 323.1, 275.2, 330.1, 274.9, 329.8, 267.3, 336.5,
-265.5, 338.1, 265.4, 339.8, 263.7, 339.6, 263.6, 339.6, 263.7, 337.9,
-263.7, 336.2, 263.6, 315.1, 259.6, 314.3, 263.4, 293.9, 153.1, 461.8,
-164.8, 441.2, 168.2, 442.5, 176.4, 420.6, 176.4, 416.5, 178.7, 416.5,
-181.0, 412.4, 186.9, 405.9, 190.4, 408.1, 194.2, 400.8, 180.4, 426.9,
-177.6, 425.5, 161.0, 450.1, 157.1, 456.0, 156.4, 455.6, 153.1, 461.8,
-149.5, 388.3, 147.8, 368.2, 147.8, 368.2, 146.0, 348.1, 150.8, 329.2,
-150.0, 329.0, 154.0, 309.9, 158.2, 344.5, 152.0, 345.3, 150.0, 380.7,
-149.8, 384.5, 149.1, 384.6, 149.5, 388.3, 488.6, 852.4, 490.1, 864.3,
-489.4, 864.4, 491.6, 876.2, 491.8, 878.8, 490.7, 880.5, 492.0, 881.3,
-484.3, 884.0, 483.2, 883.3, 474.9, 881.8, 475.7, 881.1, 474.8, 880.1,
-474.7, 878.3, 473.9, 865.1, 467.8, 861.9, 473.1, 852.0, 474.8, 848.9,
-485.7, 848.5, 488.6, 852.4, 473.1, 852.0, 460.8, 773.6, 466.9, 772.5,
-463.6, 692.9, 466.0, 687.8, 466.3, 687.2, 466.1, 681.7, 466.6, 682.9,
-466.6, 682.9, 467.1, 684.1, 461.8, 693.8, 469.0, 697.8, 470.8, 711.5,
-474.2, 737.2, 474.2, 737.2, 477.6, 762.9, 477.9, 765.2, 477.9, 765.3,
-478.2, 767.6, 483.4, 810.0, 483.4, 810.0, 488.6, 852.4, 485.7, 848.5,
-474.8, 848.9, 473.1, 852.0, 580.6, 496.9, 580.8, 495.0, 576.3, 494.4,
-572.1, 491.9, 568.0, 489.5, 564.1, 489.9, 563.8, 487.0, 566.6, 477.0,
-566.8, 467.0, 569.4, 467.1, 572.1, 457.2, 568.4, 453.0, 574.9, 447.3,
-572.0, 449.9, 575.7, 454.1, 576.4, 460.9, 578.5, 478.9, 583.0, 479.5,
-580.6, 496.9, 570.5, 776.6, 568.1, 777.6, 568.6, 778.9, 566.7, 781.1,
-553.8, 796.7, 553.8, 796.7, 540.9, 812.3, 525.4, 830.9, 521.3, 851.8,
-510.0, 849.6, 512.6, 828.3, 512.6, 828.3, 515.2, 807.1, 515.6, 805.4,
-517.5, 805.8, 519.9, 804.5, 533.1, 797.2, 533.1, 797.2, 546.4, 789.9,
-558.4, 783.3, 557.9, 782.0, 570.5, 776.6, 538.4, 619.0, 540.1, 605.1,
-540.1, 605.1, 541.9, 591.3, 541.1, 592.1, 553.2, 598.7, 552.4, 604.6,
-551.4, 612.5, 537.6, 618.0, 538.4, 619.0, 476.1, 608.4, 475.7, 614.6,
-466.7, 616.9, 468.3, 620.3, 469.2, 607.8, 469.2, 607.8, 470.1, 595.2,
-468.0, 598.4, 476.6, 602.1, 476.1, 608.4, 470.1, 595.2, 472.3, 563.6,
-472.3, 563.6, 474.6, 531.9, 475.4, 529.7, 486.1, 528.4, 491.4, 532.6,
-488.9, 543.1, 496.5, 551.7, 508.7, 559.0, 503.3, 585.9, 497.1, 588.7,
-476.1, 608.4, 476.6, 602.1, 468.0, 598.4, 470.1, 595.2, 549.3, 443.3,
-563.3, 440.9, 563.8, 442.5, 577.4, 438.4, 576.8, 438.4, 576.1, 442.9,
-574.9, 447.3, 568.4, 453.0, 572.1, 457.2, 569.4, 467.1, 563.1, 466.9,
-562.9, 477.0, 556.3, 486.9, 544.2, 472.5, 552.8, 465.2, 549.3, 443.5,
-549.3, 443.4, 549.3, 443.3, 549.3, 443.3, 516.5, 550.4, 517.0, 557.6,
-517.0, 557.6, 517.5, 564.7, 517.6, 565.4, 517.1, 566.1, 517.0, 566.1,
-516.8, 566.1, 517.0, 565.3, 517.0, 564.6, 516.7, 557.5, 518.6, 551.0,
-516.5, 550.4, 474.2, 687.1, 474.0, 684.3, 473.9, 684.3, 473.7, 681.5,
-492.4, 628.3, 493.5, 628.7, 513.3, 575.9, 514.3, 573.4, 514.3, 573.5,
-515.2, 571.0, 505.3, 599.1, 505.3, 599.1, 495.3, 627.2, 484.8, 657.2,
-485.9, 657.6, 474.2, 687.1, 450.6, 316.3, 450.9, 313.9, 452.2, 312.4,
-451.2, 311.6, 456.5, 306.3, 452.4, 302.1, 453.6, 292.6, 456.8, 298.7,
-459.4, 299.2, 466.5, 301.3, 472.6, 312.8, 472.6, 312.8, 478.6, 324.2,
-478.7, 323.4, 471.0, 322.1, 463.3, 319.9, 461.5, 319.4, 461.5, 319.4,
-459.7, 318.9, 458.1, 318.4, 458.1, 318.4, 456.6, 318.0, 453.6, 317.2,
-452.2, 318.3, 450.6, 316.3, 193.0, 612.6, 191.5, 619.8, 193.1, 620.6,
-189.9, 626.9, 187.0, 635.3, 187.0, 635.3, 184.0, 643.8, 184.3, 642.6,
-183.1, 642.3, 182.2, 640.8, 182.7, 636.7, 183.7, 636.8, 185.3, 632.9,
-188.4, 624.7, 188.4, 624.7, 191.5, 616.5, 192.3, 614.5, 192.7, 614.6,
-193.0, 612.6, 219.0, 424.9, 221.4, 447.0, 233.1, 461.9, 223.8, 469.2,
-218.1, 495.7, 218.1, 495.7, 212.4, 522.3, 207.3, 474.5, 208.9, 472.1,
-219.0, 424.9, 212.4, 522.3, 209.1, 537.8, 209.1, 537.8, 205.8, 553.2,
-203.9, 543.4, 200.7, 544.0, 195.7, 534.8, 207.3, 489.8, 222.8, 476.9,
-205.2, 441.3, 211.9, 430.8, 211.9, 430.8, 218.5, 420.3, 217.7, 422.0,
-218.8, 422.6, 219.0, 424.9, 208.9, 472.1, 207.3, 474.5, 212.4, 522.3,
-461.7, 734.0, 463.2, 759.7, 463.1, 759.8, 464.7, 785.5, 462.5, 801.0,
-462.5, 801.0, 460.2, 816.6, 455.1, 797.7, 446.6, 800.0, 433.0, 783.4,
-430.7, 774.5, 439.5, 772.2, 446.0, 761.1, 450.1, 753.9, 450.1, 753.9,
-454.2, 746.8, 458.0, 740.4, 463.1, 739.0, 461.7, 734.0, 447.6, 495.3,
-448.0, 501.2, 447.9, 501.2, 448.3, 507.2, 450.3, 533.5, 449.9, 533.5,
-451.5, 559.9, 451.9, 567.7, 451.9, 567.7, 452.4, 575.5, 451.9, 567.7,
-451.9, 567.7, 451.5, 559.9, 449.9, 533.5, 450.3, 533.5, 448.3, 507.2,
-447.9, 501.2, 448.0, 501.2, 447.6, 495.3, 413.5, 651.4, 420.1, 608.0,
-416.2, 607.4, 419.2, 563.4, 419.9, 555.0, 419.9, 555.0, 420.6, 546.5,
-420.6, 543.2, 420.9, 543.2, 421.2, 539.9, 424.7, 497.4, 425.3, 497.4,
-428.3, 454.9, 429.0, 448.0, 429.9, 448.1, 431.6, 441.3, 431.6, 441.3,
-431.6, 441.3, 431.6, 441.3, 436.2, 422.4, 436.2, 422.4, 440.8, 403.5,
-441.3, 401.3, 442.4, 401.0, 441.8, 399.1, 442.2, 404.5, 442.2, 404.5,
-442.5, 409.9, 428.9, 530.8, 431.7, 531.2, 413.5, 651.4, 442.5, 409.9,
-443.4, 424.6, 443.4, 424.6, 444.3, 439.3, 444.3, 445.8, 443.4, 445.8,
-442.5, 452.2, 432.1, 526.1, 432.1, 526.1, 421.8, 600.0, 417.1, 633.6,
-417.8, 633.8, 412.4, 667.3, 413.3, 659.4, 413.0, 659.4, 413.5, 651.4,
-431.7, 531.2, 428.9, 530.8, 442.5, 409.9, 383.3, 722.9, 393.5, 735.4,
-396.2, 749.3, 403.8, 747.8, 409.1, 754.3, 409.1, 754.3, 414.4, 760.8,
-416.7, 763.5, 416.7, 763.5, 418.9, 766.3, 423.1, 771.4, 424.8, 770.6,
-427.3, 776.5, 434.5, 793.1, 432.8, 793.9, 438.3, 811.2, 438.3, 811.3,
-438.3, 811.3, 438.3, 811.3, 438.3, 811.3, 438.3, 811.3, 438.3, 811.2,
-420.6, 782.9, 420.6, 782.9, 403.0, 754.5, 393.1, 738.7, 381.6, 737.4,
-383.3, 722.9, 366.8, 867.4, 358.6, 864.1, 355.0, 857.9, 350.4, 860.7,
-354.5, 820.5, 354.5, 820.5, 358.6, 780.4, 359.1, 775.3, 359.2, 775.3,
-359.7, 770.2, 363.7, 811.1, 362.7, 811.2, 365.7, 852.2, 366.3, 859.8,
-369.6, 865.9, 366.8, 867.4, 377.8, 211.3, 377.6, 210.3, 377.6, 210.3,
-377.5, 209.4, 397.1, 195.9, 394.7, 192.4, 411.9, 175.4, 400.3, 185.7,
-401.1, 186.7, 390.4, 198.0, 389.4, 199.1, 389.4, 199.1, 388.3, 200.2,
-383.0, 205.7, 383.6, 206.3, 377.8, 211.3, 239.8, 662.8, 239.0, 701.7,
-233.3, 701.6, 226.8, 740.4, 226.3, 743.4, 225.6, 743.4, 225.8, 746.3,
-225.1, 709.3, 223.8, 709.3, 221.9, 672.3, 221.9, 670.5, 225.1, 670.6,
-228.3, 668.9, 234.0, 665.8, 239.7, 665.9, 239.8, 662.8, 223.6, 759.5,
-224.7, 752.9, 226.0, 752.9, 225.8, 746.3, 225.6, 743.4, 226.3, 743.4,
-226.8, 740.4, 243.2, 724.1, 244.4, 725.4, 262.0, 710.4, 263.0, 709.5,
-263.0, 709.5, 264.0, 708.7, 312.0, 667.8, 311.7, 667.4, 360.0, 626.8,
-359.6, 627.2, 360.2, 627.9, 359.8, 628.3, 353.5, 635.0, 353.1, 634.7,
-346.4, 641.2, 315.7, 670.8, 315.7, 670.8, 284.9, 700.5, 262.0, 722.6,
-262.0, 722.6, 239.0, 744.7, 237.6, 746.0, 237.6, 746.0, 236.2, 747.4,
-229.9, 753.5, 229.3, 760.1, 223.6, 759.5, 285.2, 852.2, 296.7, 804.1,
-297.5, 803.6, 317.2, 758.2, 316.2, 760.6, 323.3, 763.1, 322.6, 766.3,
-318.0, 785.6, 314.5, 784.8, 306.5, 803.3, 295.8, 827.8, 291.3, 826.7,
-285.2, 852.2, 349.9, 662.3, 350.7, 654.7, 355.3, 654.7, 355.0, 647.4,
-352.0, 670.9, 358.7, 672.9, 351.3, 694.7, 351.0, 696.9, 351.9, 697.8,
-350.7, 699.0, 338.7, 735.0, 345.8, 737.4, 340.8, 775.8, 339.6, 719.2,
-343.7, 718.9, 349.9, 662.3, 340.8, 775.8, 339.9, 783.2, 339.9, 783.2,
-338.9, 790.7, 327.5, 784.7, 330.7, 778.5, 322.6, 766.3, 323.3, 763.1,
-316.2, 760.6, 317.2, 758.2, 319.6, 741.4, 322.8, 741.8, 328.4, 725.4,
-338.4, 696.1, 338.4, 696.1, 348.4, 666.8, 349.1, 664.5, 349.7, 664.6,
-349.9, 662.3, 343.7, 718.9, 339.6, 719.2, 340.8, 775.8, 385.0, 633.5,
-387.8, 636.1, 383.1, 641.1, 381.3, 648.8, 380.1, 653.4, 380.1, 653.4,
-379.0, 658.0, 378.4, 660.7, 376.7, 661.9, 377.7, 663.3, 370.4, 646.5,
-368.6, 647.3, 359.5, 631.2, 359.8, 632.0, 361.1, 631.4, 362.7, 631.5,
-373.8, 632.5, 378.5, 627.5, 385.0, 633.5, 400.7, 531.7, 402.1, 534.9,
-401.5, 535.4, 403.6, 538.0, 403.4, 537.8, 403.4, 537.8, 403.2, 537.7,
-357.2, 510.5, 356.8, 511.0, 310.5, 484.3, 343.2, 510.4, 348.2, 504.2,
-386.0, 524.0, 393.3, 527.9, 394.3, 526.7, 400.7, 531.7, 356.4, 303.0,
-350.0, 293.2, 344.7, 282.9, 343.5, 283.5, 344.3, 276.1, 338.5, 275.2,
-332.8, 267.4, 335.2, 259.1, 340.4, 253.4, 337.6, 250.9, 339.1, 248.9,
-340.9, 248.6, 340.6, 246.9, 340.1, 246.3, 343.2, 243.5, 345.7, 240.1,
-353.6, 266.3, 350.3, 267.3, 355.0, 294.4, 355.7, 298.7, 353.9, 300.6,
-356.4, 303.0, 384.0, 325.9, 390.1, 329.9, 392.4, 326.4, 400.9, 326.8,
-403.1, 330.3, 415.1, 326.1, 415.3, 327.6, 419.6, 334.6, 419.6, 334.6,
-423.8, 341.6, 403.5, 340.5, 401.6, 337.3, 384.0, 325.9, 354.1, 435.3,
-341.6, 425.3, 342.3, 424.3, 329.1, 415.3, 326.5, 412.4, 326.5, 412.4,
-324.0, 409.5, 332.6, 410.0, 335.1, 405.5, 342.0, 397.7, 367.3, 394.6,
-370.0, 392.8, 393.7, 400.8, 390.0, 399.5, 387.8, 405.9, 381.9, 411.1,
-368.0, 423.2, 368.9, 434.1, 354.1, 435.3, 272.8, 437.6, 273.4, 436.3,
-273.4, 436.3, 274.1, 435.0, 268.9, 461.0, 268.4, 460.9, 262.9, 486.8,
-261.9, 491.5, 261.0, 496.3, 261.0, 496.3, 261.0, 496.3, 261.9, 491.5,
-262.9, 486.8, 267.9, 462.2, 267.5, 462.1, 272.8, 437.6, 67.4, 175.0,
-67.4, 174.8, 67.4, 174.8, 67.4, 174.6, 69.5, 163.5, 68.3, 163.3,
-69.2, 152.0, 70.3, 157.7, 73.0, 157.2, 76.7, 162.3, 87.0, 209.4,
-89.9, 208.8, 103.2, 255.3, 115.4, 232.0, 85.9, 216.5, 68.6, 177.8,
-68.0, 176.4, 67.9, 176.4, 67.4, 175.0, 60.2, 159.3, 61.6, 171.9,
-66.0, 173.1, 63.0, 184.6, 63.0, 185.0, 63.2, 185.1, 63.0, 185.5,
-63.0, 185.5, 63.0, 185.5, 63.0, 185.6, 65.5, 192.5, 53.0, 194.9,
-48.4, 206.4, 44.4, 195.3, 38.1, 193.9, 40.3, 184.2, 41.9, 137.6,
-41.9, 137.6, 43.5, 91.0, 30.1, 107.8, 53.0, 124.9, 60.2, 159.3,
-43.5, 91.0, 43.7, 85.4, 43.7, 85.4, 43.9, 79.8, 46.9, 72.5,
-46.3, 72.1, 47.6, 64.1, 49.1, 68.4, 49.1, 68.4, 50.5, 72.6,
-53.3, 116.1, 55.4, 116.0, 60.2, 159.3, 53.0, 124.9, 30.1, 107.8,
-43.5, 91.0, 681.0, 569.7, 678.1, 569.9, 678.1, 569.9, 675.1, 570.2,
-666.1, 555.9, 665.9, 556.0, 656.7, 541.9, 658.6, 545.0, 659.2, 544.7,
-661.6, 547.5, 671.3, 558.6, 673.6, 557.2, 681.0, 569.7, 641.5, 479.0,
-641.5, 479.0, 641.5, 479.0, 641.6, 478.9, 639.0, 466.5, 650.4, 464.2,
-659.2, 449.5, 665.3, 457.3, 683.8, 457.8, 686.6, 453.1, 689.2, 456.4,
-689.2, 456.4, 691.8, 459.8, 668.7, 472.9, 666.6, 469.3, 641.6, 478.9,
-641.5, 479.0, 641.5, 479.0, 641.5, 479.0, 791.8, 137.2, 766.4, 118.0,
-768.4, 102.3, 740.9, 98.7, 740.1, 98.2, 740.1, 98.2, 739.3, 97.6,
-735.9, 98.2, 735.2, 94.5, 731.1, 91.4, 744.5, 94.7, 745.7, 89.9,
-760.4, 88.4, 777.7, 99.6, 772.6, 107.4, 784.9, 126.3, 788.4, 131.7,
-786.9, 134.1, 791.8, 137.2, 796.7, 204.0, 801.9, 215.2, 799.9, 216.7,
-807.2, 226.4, 792.9, 218.3, 792.9, 218.3, 778.7, 210.2, 772.5, 209.7,
-774.3, 201.8, 767.4, 197.3, 758.0, 193.0, 759.9, 188.8, 752.5, 180.3,
-776.1, 185.6, 777.9, 188.2, 796.7, 204.0, 752.5, 180.3, 747.3, 174.3,
-748.6, 172.2, 742.1, 168.4, 741.1, 167.9, 741.3, 167.5, 740.5, 166.5,
-752.1, 153.2, 750.4, 148.0, 765.4, 141.4, 766.1, 141.1, 768.7, 147.1,
-772.0, 152.8, 773.5, 155.3, 773.6, 155.2, 774.9, 157.7, 789.9, 177.8,
-785.8, 180.8, 796.7, 204.0, 777.9, 188.2, 776.1, 185.6, 752.5, 180.3,
-700.8, 121.1, 692.8, 111.8, 692.8, 111.8, 684.7, 102.6, 687.4, 102.5,
-689.7, 98.8, 689.9, 99.1, 714.6, 98.4, 715.3, 102.1, 739.3, 97.6,
-740.1, 98.2, 740.1, 98.2, 740.9, 98.7, 752.8, 100.3, 746.8, 120.3,
-760.7, 133.2, 761.0, 133.7, 760.9, 134.2, 761.4, 134.3, 731.0, 128.2,
-729.0, 132.7, 700.8, 121.1, 761.4, 134.3, 764.2, 135.2, 766.5, 139.8,
-765.4, 141.4, 750.4, 148.0, 752.1, 153.2, 740.5, 166.5, 723.1, 146.6,
-727.5, 138.7, 705.7, 126.7, 702.9, 126.2, 703.3, 123.9, 700.8, 121.1,
-729.0, 132.7, 731.0, 128.2, 761.4, 134.3, 583.1, 158.4, 580.9, 157.7,
-580.9, 157.7, 578.7, 157.1, 592.9, 148.5, 603.3, 151.5, 606.8, 139.6,
-632.0, 152.8, 632.0, 152.8, 657.2, 166.0, 636.3, 182.6, 620.1, 162.6,
-583.1, 158.4, 657.2, 166.0, 673.1, 174.3, 673.1, 174.3, 689.0, 182.7,
-693.0, 183.9, 691.0, 188.6, 695.0, 192.2, 690.8, 194.8, 687.8, 190.0,
-680.7, 187.9, 666.8, 183.7, 666.8, 183.7, 653.0, 179.5, 623.6, 160.4,
-618.0, 168.9, 583.1, 158.4, 620.1, 162.6, 636.3, 182.6, 657.2, 166.0,
-733.6, 362.1, 732.7, 362.5, 732.7, 362.5, 731.8, 362.9, 690.2, 300.2,
-690.1, 300.2, 645.8, 239.4, 637.4, 227.1, 637.8, 226.9, 629.3, 214.7,
-628.1, 213.3, 628.0, 213.3, 626.8, 212.0, 626.8, 212.0, 626.8, 212.0,
-626.8, 212.0, 632.4, 218.1, 632.4, 218.1, 638.0, 224.2, 638.4, 224.6,
-638.4, 224.6, 638.7, 224.9, 645.6, 232.5, 645.6, 232.5, 652.5, 240.0,
-665.2, 253.8, 665.2, 253.8, 677.8, 267.5, 681.5, 271.6, 681.5, 271.6,
-685.2, 275.6, 685.8, 276.2, 685.8, 276.2, 686.3, 276.8, 688.5, 279.2,
-688.5, 279.2, 690.7, 281.6, 707.9, 306.5, 708.9, 305.7, 727.2, 329.8,
-734.6, 343.7, 731.3, 345.8, 733.6, 362.1, 727.2, 329.8, 737.0, 342.8,
-734.4, 346.0, 746.8, 355.7, 740.2, 358.9, 740.2, 358.9, 733.6, 362.1,
-731.3, 345.8, 734.6, 343.7, 727.2, 329.8, 706.4, 330.7, 717.6, 347.6,
-716.2, 348.6, 728.7, 364.4, 725.4, 366.0, 725.4, 366.0, 722.0, 367.6,
-721.7, 367.9, 720.8, 365.9, 719.2, 365.0, 705.9, 360.5, 707.9, 354.5,
-696.7, 344.0, 687.0, 328.8, 685.1, 330.0, 673.6, 315.9, 675.5, 321.6,
-681.7, 319.5, 689.7, 323.2, 698.1, 326.9, 700.6, 324.6, 706.4, 330.7,
-668.8, 149.5, 679.7, 163.4, 677.9, 165.3, 690.7, 177.3, 674.4, 168.6,
-674.4, 168.6, 658.2, 159.9, 637.3, 162.6, 635.2, 146.2, 612.2, 132.4,
-622.3, 122.5, 643.8, 135.2, 668.8, 149.5, 540.0, 203.6, 544.8, 209.8,
-544.8, 209.8, 549.5, 216.0, 545.7, 212.3, 544.0, 214.0, 538.5, 212.0,
-524.1, 208.3, 524.8, 205.7, 511.1, 199.4, 515.0, 201.9, 516.3, 200.1,
-521.4, 200.9, 530.7, 202.2, 532.3, 199.4, 540.0, 203.6, 493.2, 21.2,
-499.3, 14.5, 500.4, 15.2, 505.4, 7.7, 510.5, 23.9, 510.5, 23.9,
-515.6, 40.0, 515.2, 40.4, 496.9, 33.0, 493.2, 21.2, 515.6, 40.0,
-516.0, 41.4, 516.9, 42.3, 516.5, 42.7, 506.3, 53.8, 506.3, 53.8,
-496.1, 64.9, 491.4, 73.5, 480.3, 65.3, 470.6, 73.3, 465.3, 82.3,
-453.8, 73.5, 444.3, 82.0, 462.3, 58.7, 462.3, 58.7, 480.4, 35.4,
-485.7, 27.5, 486.8, 28.3, 493.2, 21.2, 496.9, 33.0, 515.2, 40.4,
-515.6, 40.0, 587.3, -74.6, 589.1, -80.4, 589.5, -86.3, 590.9, -86.2,
-592.6, -88.4, 597.0, -86.2, 597.6, -88.0, 595.3, -80.4, 593.8, -76.3,
-587.3, -74.6, 279.7, 73.4, 281.6, 75.0, 283.3, 74.8, 283.5, 76.5,
-283.8, 77.5, 283.8, 77.5, 284.2, 78.5, 274.2, 128.6, 273.3, 128.7,
-268.0, 179.5, 266.6, 180.8, 266.6, 180.8, 265.1, 182.1, 265.5, 181.5,
-261.8, 178.5, 258.5, 175.0, 257.9, 162.7, 261.1, 162.6, 263.7, 150.1,
-265.7, 140.4, 265.7, 140.4, 267.7, 130.7, 273.7, 102.0, 271.5, 101.4,
-279.7, 73.4, 353.9, 96.6, 354.4, 104.1, 352.6, 104.8, 354.9, 111.6,
-355.4, 111.8, 354.4, 113.6, 355.1, 114.2, 353.0, 126.2, 350.2, 134.3,
-356.7, 139.2, 357.2, 139.2, 356.9, 141.9, 357.1, 144.7, 353.2, 170.7,
-350.9, 171.1, 352.1, 197.2, 352.7, 194.0, 350.3, 193.8, 349.5, 190.1,
-349.1, 188.4, 349.6, 188.2, 349.7, 186.4, 350.0, 180.1, 350.0, 180.1,
-350.3, 173.8, 352.1, 135.2, 351.1, 135.1, 353.9, 96.6, 336.8, 156.0,
-346.6, 170.8, 343.1, 173.1, 349.5, 190.1, 350.3, 193.8, 352.7, 194.0,
-352.1, 197.2, 352.7, 208.9, 355.7, 209.1, 360.7, 220.3, 357.9, 224.1,
-354.1, 225.8, 355.0, 227.9, 354.5, 228.5, 354.5, 229.1, 354.1, 229.1,
-349.0, 223.4, 336.9, 222.5, 333.8, 226.6, 331.8, 220.7, 331.8, 220.7,
-329.9, 214.9, 330.5, 191.8, 332.6, 191.9, 335.3, 168.8, 336.0, 162.4,
-339.5, 160.1, 336.8, 156.0, 197.4, 398.0, 197.4, 397.9, 195.8, 399.4,
-194.2, 400.8, 190.4, 408.1, 186.9, 405.9, 181.0, 412.4, 185.5, 404.4,
-185.5, 404.4, 190.1, 396.4, 191.7, 394.9, 195.3, 395.7, 197.4, 398.0,
-267.3, 336.5, 274.9, 329.8, 275.2, 330.1, 282.5, 323.1, 243.4, 371.5,
-243.4, 371.5, 204.3, 420.0, 173.8, 423.9, 175.8, 445.4, 149.2, 472.6,
-150.9, 467.6, 150.9, 467.6, 152.7, 462.6, 152.8, 462.2, 153.0, 462.3,
-153.1, 461.8, 156.4, 455.6, 157.1, 456.0, 161.0, 450.1, 211.6, 394.2,
-212.2, 394.7, 263.7, 339.6, 265.4, 339.8, 265.5, 338.1, 267.3, 336.5,
-161.0, 450.1, 177.6, 425.5, 180.4, 426.9, 194.2, 400.8, 195.8, 399.4,
-197.4, 397.9, 197.4, 398.0, 230.6, 368.8, 230.6, 368.8, 263.7, 339.6,
-265.4, 339.8, 265.5, 338.1, 267.3, 336.5, 214.3, 393.5, 219.1, 399.0,
-161.0, 450.1, 182.0, 340.9, 181.9, 342.0, 182.1, 342.0, 181.8, 343.0,
-179.0, 352.7, 179.1, 352.8, 176.4, 362.5, 177.8, 378.3, 163.4, 379.5,
-150.4, 396.6, 158.1, 366.7, 165.8, 368.5, 182.0, 340.9, 606.6, 614.7,
-613.0, 605.6, 611.2, 604.3, 615.8, 594.0, 621.3, 581.5, 619.6, 580.4,
-626.8, 569.1, 625.3, 571.4, 628.0, 572.7, 627.2, 575.8, 626.3, 579.7,
-625.3, 579.5, 623.3, 583.1, 615.0, 598.9, 616.8, 600.2, 606.6, 614.7,
-755.2, 696.0, 759.7, 703.1, 759.7, 703.1, 764.3, 710.3, 750.1, 721.0,
-751.8, 723.2, 739.3, 736.1, 743.2, 733.3, 741.4, 730.8, 743.5, 725.6,
-749.3, 710.8, 744.3, 704.0, 755.2, 696.0, 615.8, 594.0, 611.2, 604.3,
-613.0, 605.6, 606.6, 614.7, 598.3, 633.5, 603.5, 638.6, 590.1, 652.2,
-590.7, 651.6, 585.5, 646.4, 580.9, 640.6, 579.6, 639.0, 579.6, 639.0,
-578.3, 637.3, 577.2, 636.0, 576.0, 635.8, 576.1, 634.6, 576.4, 631.8,
-577.6, 632.0, 579.1, 629.3, 579.9, 628.0, 579.9, 628.0, 580.6, 626.7,
-586.2, 616.8, 583.9, 614.2, 591.8, 606.9, 601.4, 597.9, 609.1, 590.4,
-615.8, 594.0, 591.8, 606.9, 587.9, 600.6, 599.4, 593.4, 607.0, 580.0,
-621.3, 554.7, 618.1, 552.2, 635.6, 529.4, 635.9, 529.0, 641.7, 530.6,
-642.5, 533.4, 643.4, 536.7, 640.7, 537.4, 639.0, 541.4, 632.9, 555.2,
-632.9, 555.2, 626.8, 569.1, 619.6, 580.4, 621.3, 581.5, 615.8, 594.0,
-609.1, 590.4, 601.4, 597.9, 591.8, 606.9, 576.4, 460.9, 575.7, 454.1,
-572.0, 449.9, 574.9, 447.3, 576.1, 442.9, 576.8, 438.4, 577.4, 438.4,
-578.4, 438.1, 577.9, 436.5, 578.5, 434.6, 598.0, 464.0, 628.7, 470.0,
-623.1, 489.8, 630.0, 500.6, 631.2, 500.0, 636.9, 511.4, 637.2, 511.8,
-637.6, 512.1, 637.5, 512.3, 637.5, 512.3, 637.5, 512.3, 637.5, 512.3,
-607.0, 486.6, 604.0, 489.4, 576.4, 460.9, 637.5, 512.3, 639.7, 515.7,
-639.7, 515.7, 641.9, 519.1, 649.1, 530.3, 655.8, 530.1, 656.3, 541.6,
-656.1, 537.2, 649.4, 537.5, 642.5, 533.4, 641.7, 530.6, 635.9, 529.0,
-635.6, 529.4, 620.6, 520.5, 620.6, 520.5, 605.6, 511.6, 602.6, 509.9,
-602.6, 509.9, 599.7, 508.2, 590.1, 502.5, 584.7, 505.2, 580.6, 496.9,
-583.0, 479.5, 578.5, 478.9, 576.4, 460.9, 610.9, 469.7, 606.8, 486.0,
-636.9, 511.4, 637.2, 511.8, 637.6, 512.1, 637.5, 512.3, 637.5, 512.3,
-637.5, 512.3, 637.5, 512.3, 573.7, 767.7, 573.8, 767.6, 575.8, 769.6,
-575.5, 770.6, 574.2, 774.0, 573.6, 774.5, 570.5, 776.6, 557.9, 782.0,
-558.4, 783.3, 546.4, 789.9, 553.7, 788.1, 552.8, 784.7, 559.2, 779.4,
-566.5, 773.6, 565.6, 772.1, 573.7, 767.7, 595.9, 745.9, 603.8, 735.1,
-604.5, 735.6, 613.0, 725.3, 621.9, 714.5, 620.4, 712.7, 630.9, 703.8,
-630.8, 703.8, 632.3, 705.6, 633.8, 707.5, 634.9, 708.8, 636.2, 709.4,
-635.9, 710.2, 634.5, 713.3, 633.1, 712.6, 630.4, 715.1, 623.2, 721.6,
-623.2, 721.6, 616.0, 728.0, 609.7, 733.6, 609.7, 733.6, 603.4, 739.3,
-602.5, 740.0, 602.5, 740.0, 601.6, 740.8, 598.8, 743.4, 598.1, 742.9,
-595.9, 745.9, 545.8, 831.4, 545.8, 831.4, 550.9, 851.6, 556.0, 871.7,
-556.0, 871.9, 556.0, 871.9, 556.1, 872.2, 556.7, 874.7, 556.7, 874.7,
-557.4, 877.2, 557.6, 878.3, 557.7, 879.4, 557.9, 879.4, 539.7, 881.0,
-522.2, 884.3, 521.2, 880.5, 516.2, 860.4, 528.4, 835.8, 545.8, 831.4,
-521.2, 880.5, 518.2, 884.3, 506.9, 883.2, 506.1, 880.9, 511.1, 866.3,
-508.0, 865.3, 510.0, 849.6, 521.3, 851.8, 525.4, 830.9, 540.9, 812.3,
-538.9, 813.6, 542.7, 819.2, 544.4, 826.1, 544.5, 826.3, 544.5, 826.3,
-544.5, 826.6, 545.2, 829.0, 546.6, 829.6, 545.8, 831.4, 528.4, 835.8,
-516.2, 860.4, 521.2, 880.5, 501.0, 479.8, 509.2, 464.3, 517.2, 464.4,
-517.4, 448.8, 528.2, 446.9, 528.2, 446.9, 539.0, 445.1, 538.5, 445.1,
-538.5, 445.4, 538.1, 445.8, 529.7, 453.6, 529.7, 453.6, 521.2, 461.3,
-511.1, 470.5, 499.2, 474.1, 501.0, 479.8, 513.3, 575.9, 493.5, 628.7,
-492.4, 628.3, 473.7, 681.5, 473.3, 677.4, 473.3, 677.4, 472.9, 673.2,
-478.0, 656.7, 479.6, 657.2, 486.2, 641.2, 499.8, 608.6, 502.9, 609.6,
-513.3, 575.9, 495.3, 627.2, 497.7, 601.0, 504.3, 601.6, 513.3, 575.9,
-514.3, 573.4, 514.3, 573.5, 515.2, 571.0, 516.1, 568.5, 516.1, 568.5,
-517.0, 566.1, 517.1, 566.1, 517.6, 565.4, 517.5, 564.7, 519.4, 590.9,
-515.0, 592.1, 521.3, 617.1, 514.9, 633.7, 506.3, 648.9, 508.5, 650.2,
-506.8, 653.2, 507.2, 653.4, 506.0, 656.7, 498.3, 643.3, 494.0, 641.4,
-495.3, 627.2, 506.0, 656.7, 495.0, 685.1, 490.1, 684.0, 484.0, 713.4,
-484.7, 720.8, 478.3, 721.1, 478.0, 728.9, 471.0, 709.9, 470.8, 707.1,
-474.2, 687.1, 485.9, 657.6, 484.8, 657.2, 495.3, 627.2, 494.0, 641.4,
-498.3, 643.3, 506.0, 656.7, 445.1, 359.6, 446.0, 352.4, 448.3, 351.9,
-446.9, 345.2, 449.8, 331.0, 448.7, 330.7, 450.6, 316.3, 452.2, 318.3,
-453.6, 317.2, 456.6, 318.0, 457.2, 318.6, 456.1, 319.7, 455.6, 321.4,
-451.7, 335.6, 451.7, 335.6, 447.8, 349.9, 446.4, 354.8, 444.3, 355.2,
-445.1, 359.6, 158.8, 562.8, 158.5, 560.6, 157.7, 560.5, 158.2, 558.4,
-158.5, 556.2, 157.8, 556.1, 157.5, 553.7, 156.4, 553.2, 158.4, 549.0,
-159.2, 544.2, 160.5, 553.3, 159.4, 553.5, 158.8, 562.8, 418.2, 496.4,
-418.2, 496.3, 418.2, 496.3, 418.3, 496.3, 418.3, 496.3, 418.3, 496.3,
-418.3, 496.4, 418.3, 496.4, 418.2, 496.4, 418.2, 496.4, 379.0, 658.0,
-380.1, 653.4, 380.1, 653.4, 381.3, 648.8, 391.3, 646.7, 392.2, 650.9,
-403.1, 653.0, 407.3, 653.8, 411.0, 652.7, 411.6, 654.6, 410.7, 664.7,
-410.7, 664.7, 409.9, 674.8, 395.5, 676.3, 391.6, 669.5, 379.0, 658.0,
-409.9, 674.8, 408.8, 688.1, 411.8, 689.1, 407.6, 701.4, 407.5, 703.4,
-407.5, 703.4, 407.3, 705.4, 406.9, 710.5, 406.9, 710.5, 406.5, 715.6,
-406.4, 715.7, 406.4, 715.7, 406.4, 715.8, 406.3, 717.1, 406.0, 718.3,
-406.2, 718.4, 395.6, 705.4, 385.7, 702.3, 369.0, 705.6, 368.3, 705.3,
-367.7, 704.7, 367.8, 704.1, 372.0, 686.8, 377.1, 669.7, 376.3, 669.4,
-378.0, 667.1, 378.7, 665.6, 377.7, 663.3, 376.7, 661.9, 378.4, 660.7,
-379.0, 658.0, 391.6, 669.5, 395.5, 676.3, 409.9, 674.8, 442.5, 452.2,
-443.4, 445.8, 444.3, 445.8, 444.3, 439.3, 445.1, 452.6, 444.2, 452.7,
-445.8, 465.9, 448.0, 480.4, 446.7, 480.6, 447.6, 495.3, 448.0, 501.2,
-447.9, 501.2, 448.3, 507.2, 450.3, 533.5, 449.9, 533.5, 451.5, 559.9,
-451.9, 567.7, 451.9, 567.7, 452.4, 575.5, 452.6, 578.7, 452.6, 578.7,
-452.8, 581.9, 452.2, 585.4, 451.5, 585.3, 450.2, 588.8, 447.3, 596.8,
-443.2, 597.4, 444.3, 604.8, 439.9, 575.1, 444.0, 574.5, 443.6, 544.2,
-443.0, 498.2, 442.2, 498.2, 442.5, 452.2, 363.4, 734.1, 364.4, 724.0,
-361.6, 722.8, 365.4, 714.0, 365.5, 713.7, 365.5, 713.7, 365.5, 713.5,
-366.7, 708.8, 366.7, 708.8, 367.8, 704.1, 367.7, 704.7, 368.3, 705.3,
-369.0, 705.6, 374.3, 704.6, 376.1, 714.2, 383.3, 722.9, 381.6, 737.4,
-393.1, 738.7, 403.0, 754.5, 402.3, 755.6, 388.1, 746.8, 373.2, 739.2,
-368.3, 736.6, 364.5, 737.8, 363.4, 734.1, 382.3, 243.1, 380.0, 227.2,
-380.0, 227.2, 377.8, 211.3, 383.6, 206.3, 383.0, 205.7, 388.3, 200.2,
-392.4, 214.6, 386.1, 216.4, 383.8, 232.7, 383.0, 237.9, 381.0, 238.5,
-382.3, 243.1, 262.2, 528.4, 258.2, 543.6, 259.6, 544.0, 257.0, 559.6,
-255.0, 571.8, 255.0, 571.8, 252.9, 584.1, 247.6, 616.0, 247.6, 616.0,
-242.3, 647.9, 241.0, 655.3, 243.6, 657.0, 239.8, 662.8, 239.7, 665.9,
-234.0, 665.8, 228.3, 668.9, 240.2, 597.8, 243.9, 598.3, 262.2, 528.4,
-228.3, 668.9, 225.1, 670.6, 221.9, 670.5, 221.9, 672.3, 221.3, 662.2,
-223.9, 661.3, 220.8, 652.1, 226.3, 633.0, 226.4, 633.0, 231.9, 614.0,
-250.7, 549.3, 247.1, 548.0, 269.5, 484.6, 262.2, 505.2, 267.1, 506.8,
-262.2, 528.4, 243.9, 598.3, 240.2, 597.8, 228.3, 668.9, 212.2, 827.7,
-217.9, 793.6, 217.9, 793.6, 223.6, 759.5, 229.3, 760.1, 229.9, 753.5,
-236.2, 747.4, 233.8, 748.3, 235.0, 751.5, 233.8, 755.6, 232.7, 759.2,
-232.7, 759.2, 231.7, 762.7, 221.9, 795.2, 209.5, 826.6, 212.2, 827.7,
-252.9, 584.1, 255.0, 571.8, 255.0, 571.8, 257.0, 559.6, 255.6, 564.2,
-257.2, 564.7, 257.4, 569.9, 257.5, 573.8, 257.5, 573.8, 257.6, 577.7,
-258.6, 606.4, 272.9, 617.1, 259.5, 635.1, 270.6, 620.2, 253.8, 609.7,
-252.9, 584.1, 354.7, 534.6, 362.3, 542.1, 362.3, 542.1, 370.0, 549.5,
-371.9, 552.9, 369.4, 554.3, 368.8, 559.1, 364.9, 589.4, 368.6, 590.3,
-361.0, 619.6, 363.8, 608.6, 360.1, 607.6, 359.2, 595.6, 358.0, 579.6,
-358.0, 579.6, 356.8, 563.5, 356.1, 553.6, 356.1, 553.6, 355.4, 543.6,
-355.0, 539.1, 356.5, 535.4, 354.7, 534.6, 368.8, 559.1, 369.4, 554.3,
-371.9, 552.9, 370.0, 549.5, 373.2, 552.6, 376.3, 552.5, 376.5, 555.8,
-376.5, 556.1, 376.7, 556.1, 377.0, 556.3, 373.0, 558.1, 370.2, 560.5,
-368.8, 559.1, 386.0, 524.0, 348.2, 504.2, 343.2, 510.4, 310.5, 484.3,
-301.3, 479.0, 302.0, 476.9, 292.1, 473.7, 287.7, 470.6, 288.2, 469.9,
-284.3, 466.1, 282.0, 463.9, 282.5, 463.1, 279.8, 461.8, 294.6, 469.4,
-294.1, 470.2, 308.5, 478.6, 314.9, 482.3, 314.9, 482.3, 321.3, 486.1,
-353.7, 505.1, 351.5, 518.3, 386.0, 524.0, 355.0, 294.4, 350.3, 267.3,
-353.6, 266.3, 345.7, 240.1, 349.9, 234.6, 355.0, 230.2, 354.1, 229.1,
-354.5, 229.1, 354.5, 228.5, 355.0, 227.9, 367.7, 256.8, 363.9, 266.8,
-387.9, 282.3, 389.9, 289.5, 392.0, 289.0, 396.0, 295.6, 396.2, 296.0,
-396.1, 296.0, 396.1, 296.5, 375.5, 295.8, 364.6, 305.2, 355.0, 294.4,
-396.1, 296.5, 398.5, 311.6, 393.5, 314.7, 400.9, 326.8, 392.4, 326.4,
-390.1, 329.9, 384.0, 325.9, 377.6, 325.6, 375.1, 328.5, 371.2, 325.2,
-363.8, 314.1, 363.8, 314.1, 356.4, 303.0, 353.9, 300.6, 355.7, 298.7,
-355.0, 294.4, 364.6, 305.2, 375.5, 295.8, 396.1, 296.5, 437.6, 403.3,
-437.5, 403.4, 432.1, 404.9, 429.5, 402.8, 423.1, 391.0, 420.4, 392.5,
-411.3, 382.1, 410.7, 388.7, 420.7, 389.6, 430.0, 397.2, 433.8, 400.3,
-437.8, 400.6, 437.6, 403.3, 325.6, 322.0, 326.6, 319.9, 326.6, 319.9,
-327.5, 317.9, 341.1, 338.4, 353.4, 336.2, 381.6, 341.0, 386.2, 343.5,
-389.5, 348.0, 388.2, 350.8, 383.4, 361.2, 378.8, 359.0, 369.4, 367.2,
-365.1, 371.0, 364.9, 374.9, 360.7, 374.8, 357.9, 374.7, 358.1, 370.8,
-355.4, 366.8, 346.5, 353.4, 346.5, 353.4, 337.7, 340.1, 331.6, 331.0,
-330.1, 331.7, 325.6, 322.0, 420.5, 402.3, 415.5, 395.5, 407.1, 401.5,
-393.7, 400.8, 370.0, 392.8, 367.3, 394.6, 342.0, 397.7, 340.5, 399.4,
-338.5, 397.5, 334.9, 397.3, 334.6, 396.8, 337.2, 395.3, 339.5, 393.3,
-341.5, 391.6, 341.5, 391.6, 343.5, 389.8, 352.1, 382.3, 352.1, 382.3,
-360.7, 374.8, 364.9, 374.9, 365.1, 371.0, 369.4, 367.2, 397.1, 380.0,
-403.3, 378.7, 420.5, 402.3, 369.4, 367.2, 378.8, 359.0, 383.4, 361.2,
-388.2, 350.8, 388.6, 350.6, 390.1, 353.7, 392.0, 356.6, 396.6, 363.6,
-396.6, 363.6, 401.3, 370.6, 410.4, 387.3, 409.9, 388.2, 422.4, 402.4,
-422.1, 402.0, 421.2, 402.8, 420.5, 402.3, 403.3, 378.7, 397.1, 380.0,
-369.4, 367.2, 381.9, 411.1, 387.8, 405.9, 390.0, 399.5, 393.7, 400.8,
-407.1, 401.5, 415.5, 395.5, 420.5, 402.3, 421.2, 402.8, 422.1, 402.0,
-422.4, 402.4, 424.0, 404.3, 428.6, 401.2, 429.5, 402.8, 432.1, 404.9,
-437.5, 403.4, 437.6, 403.3, 439.2, 403.4, 440.7, 403.7, 440.8, 403.5,
-436.2, 422.4, 436.2, 422.4, 431.6, 441.3, 431.6, 441.2, 431.5, 441.2,
-431.3, 441.1, 421.1, 434.9, 421.1, 434.9, 410.9, 428.7, 396.4, 419.9,
-389.8, 423.9, 381.9, 411.1, 226.5, 544.9, 227.1, 537.3, 227.1, 537.3,
-227.6, 529.8, 242.2, 506.7, 239.7, 505.1, 251.8, 480.4, 251.0, 482.0,
-251.2, 482.0, 250.5, 483.7, 242.6, 503.9, 242.6, 503.9, 234.6, 524.2,
-230.6, 534.6, 234.1, 539.0, 226.5, 544.9, 68.6, 177.8, 85.9, 216.5,
-115.4, 232.0, 103.2, 255.3, 104.5, 259.8, 104.5, 259.8, 105.7, 264.3,
-105.7, 264.1, 105.7, 264.1, 105.6, 264.0, 103.7, 259.7, 103.7, 259.7,
-101.9, 255.4, 85.3, 216.6, 82.1, 176.7, 68.6, 177.8, 685.5, 569.3,
-683.3, 569.5, 683.3, 569.5, 681.0, 569.7, 673.6, 557.2, 671.3, 558.6,
-661.6, 547.5, 672.6, 546.6, 674.9, 557.2, 685.5, 569.3, 702.7, 480.0,
-702.5, 483.1, 702.5, 483.1, 702.3, 486.2, 700.5, 484.1, 694.7, 489.0,
-687.0, 491.8, 687.5, 485.4, 693.9, 483.3, 702.7, 480.0, 857.0, 143.8,
-836.9, 149.9, 832.1, 143.9, 816.9, 156.1, 811.6, 152.0, 811.6, 152.0,
-806.2, 148.0, 830.0, 140.7, 841.8, 132.4, 857.0, 143.8, 792.8, 174.5,
-792.8, 174.5, 795.0, 176.8, 797.2, 179.1, 799.7, 181.7, 799.7, 181.7,
-802.1, 184.2, 802.4, 184.5, 802.4, 184.5, 802.7, 184.8, 809.4, 191.8,
-809.4, 191.8, 816.1, 198.8, 816.8, 199.5, 816.8, 199.5, 817.5, 200.3,
-850.9, 235.1, 853.6, 232.9, 884.2, 269.9, 875.7, 265.1, 875.7, 265.1,
-867.2, 260.3, 832.9, 224.5, 835.0, 222.5, 802.7, 184.8, 802.4, 184.5,
-802.4, 184.5, 802.1, 184.2, 799.7, 181.7, 799.7, 181.7, 797.2, 179.1,
-795.0, 176.8, 792.8, 174.5, 792.8, 174.5, 867.2, 260.3, 842.6, 246.4,
-842.6, 246.4, 817.9, 232.4, 799.6, 193.6, 800.5, 192.0, 774.9, 157.7,
-773.6, 155.2, 773.5, 155.3, 772.0, 152.8, 783.0, 163.0, 782.9, 163.3,
-792.8, 174.5, 830.4, 217.0, 845.6, 210.6, 867.2, 260.3, 797.2, 179.1,
-795.0, 176.8, 792.8, 174.5, 792.8, 174.5, 782.9, 163.3, 783.0, 163.0,
-772.0, 152.8, 768.7, 147.1, 766.1, 141.1, 765.4, 141.4, 766.5, 139.8,
-764.2, 135.2, 761.4, 134.3, 760.9, 134.2, 761.0, 133.7, 760.7, 133.2,
-767.4, 139.3, 771.4, 135.0, 782.2, 136.8, 798.9, 152.6, 801.2, 150.2,
-820.2, 163.7, 821.3, 166.9, 809.8, 174.1, 797.2, 179.1, 701.9, 194.3,
-712.7, 197.5, 715.9, 194.0, 723.5, 200.8, 762.4, 221.2, 762.4, 221.2,
-801.3, 241.7, 802.0, 241.9, 799.9, 248.5, 798.5, 255.3, 795.0, 256.8,
-792.7, 251.7, 787.0, 248.0, 786.8, 247.9, 786.8, 247.9, 786.5, 247.7,
-784.3, 246.3, 784.3, 246.3, 782.1, 244.9, 769.7, 237.1, 769.7, 237.1,
-757.4, 229.3, 757.4, 229.3, 757.4, 229.3, 757.4, 229.3, 729.6, 211.8,
-726.8, 215.2, 701.9, 194.3, 626.8, 212.0, 636.0, 225.9, 636.5, 225.5,
-645.8, 239.4, 667.0, 268.4, 665.7, 269.4, 685.6, 299.3, 655.5, 256.1,
-655.9, 255.9, 626.8, 212.0, 635.9, 116.5, 646.2, 125.1, 646.2, 125.1,
-656.5, 133.7, 657.2, 142.1, 662.6, 141.6, 668.8, 149.5, 643.8, 135.2,
-622.3, 122.5, 612.2, 132.4, 593.2, 121.1, 593.2, 121.1, 574.2, 109.7,
-572.8, 107.4, 572.2, 107.5, 569.8, 106.0, 580.0, 103.8, 580.0, 103.8,
-590.2, 101.6, 613.7, 105.4, 614.5, 106.1, 635.9, 116.5, 590.2, 101.6,
-600.3, 99.5, 600.3, 99.5, 610.4, 97.3, 613.6, 104.6, 618.0, 102.6,
-625.6, 107.8, 631.3, 111.2, 630.8, 112.2, 635.9, 116.5, 614.5, 106.1,
-613.7, 105.4, 590.2, 101.6, 499.3, 193.9, 476.5, 183.3, 477.3, 175.2,
-453.6, 172.7, 441.0, 164.6, 441.0, 164.6, 428.4, 156.5, 457.3, 169.0,
-456.3, 171.2, 484.2, 186.0, 491.8, 189.9, 491.5, 190.5, 499.3, 193.9,
-601.4, 22.8, 597.4, 24.3, 593.3, 25.3, 593.4, 25.8, 591.9, 23.2,
-590.0, 21.0, 590.4, 20.7, 590.7, 20.3, 589.6, 19.4, 588.8, 18.1,
-595.3, 19.3, 598.7, 18.3, 601.4, 22.8, 276.3, 70.7, 278.0, 72.0,
-278.0, 72.0, 279.7, 73.4, 271.5, 101.4, 273.7, 102.0, 267.7, 130.7,
-255.6, 120.9, 270.1, 100.3, 276.3, 70.7, 349.7, 186.4, 349.6, 188.2,
-349.1, 188.4, 349.5, 190.1, 343.1, 173.1, 346.6, 170.8, 336.8, 156.0,
-330.5, 139.2, 331.3, 138.9, 324.3, 122.5, 337.7, 154.1, 337.7, 154.2,
-349.7, 186.4, 335.3, 168.8, 332.6, 191.9, 330.5, 191.8, 329.9, 214.9,
-320.4, 186.5, 320.4, 186.5, 310.9, 158.1, 305.7, 151.6, 309.6, 148.5,
-308.3, 138.9, 325.1, 146.3, 330.3, 151.4, 335.3, 168.8, 308.3, 138.9,
-306.7, 127.1, 310.9, 124.6, 305.2, 115.3, 310.1, 106.4, 310.1, 106.4,
-315.0, 97.6, 323.2, 100.7, 319.7, 110.0, 324.3, 122.5, 331.3, 138.9,
-330.5, 139.2, 336.8, 156.0, 339.5, 160.1, 336.0, 162.4, 335.3, 168.8,
-330.3, 151.4, 325.1, 146.3, 308.3, 138.9, 263.7, 336.2, 263.7, 337.9,
-263.6, 339.6, 263.7, 339.6, 230.6, 368.8, 230.6, 368.8, 197.4, 398.0,
-195.3, 395.7, 191.7, 394.9, 190.1, 396.4, 202.0, 375.3, 211.2, 376.4,
-213.9, 354.1, 213.9, 354.1, 214.0, 354.0, 214.0, 353.9, 238.8, 344.9,
-238.4, 343.4, 263.7, 336.2, 214.0, 353.9, 226.4, 331.9, 237.8, 332.4,
-238.9, 309.9, 240.5, 309.0, 240.7, 308.1, 241.0, 306.0, 252.2, 300.0,
-252.2, 300.0, 263.4, 293.9, 259.6, 314.3, 263.6, 315.1, 263.7, 336.2,
-238.4, 343.4, 238.8, 344.9, 214.0, 353.9, 150.0, 380.7, 152.0, 345.3,
-158.2, 344.5, 154.0, 309.9, 154.8, 305.8, 154.8, 305.8, 155.7, 301.6,
-155.8, 301.9, 157.5, 301.0, 159.2, 300.4, 157.2, 333.4, 155.5, 333.2,
-151.7, 366.1, 150.8, 373.4, 150.3, 373.4, 150.0, 380.7, 591.4, 653.9,
-591.6, 653.5, 589.9, 652.7, 590.1, 652.2, 603.5, 638.6, 598.3, 633.5,
-606.6, 614.7, 616.8, 600.2, 615.0, 598.9, 623.3, 583.1, 612.9, 586.0,
-616.4, 598.5, 609.4, 614.0, 600.4, 633.9, 601.3, 634.3, 591.4, 653.9,
-607.0, 580.0, 599.4, 593.4, 587.9, 600.6, 591.8, 606.9, 583.9, 614.2,
-586.2, 616.8, 580.6, 626.7, 575.6, 621.5, 580.0, 612.0, 586.2, 601.1,
-593.2, 588.6, 607.2, 580.2, 607.0, 580.0, 586.2, 601.1, 582.8, 599.4,
-589.3, 586.8, 592.4, 572.5, 593.4, 567.5, 593.4, 567.5, 594.5, 562.6,
-599.8, 538.4, 599.8, 538.4, 605.0, 514.1, 605.3, 512.9, 605.8, 511.8,
-605.6, 511.6, 620.6, 520.5, 620.6, 520.5, 635.6, 529.4, 618.1, 552.2,
-621.3, 554.7, 607.0, 580.0, 607.2, 580.2, 593.2, 588.6, 586.2, 601.1,
-523.8, 737.3, 526.4, 716.5, 526.4, 716.5, 529.0, 695.8, 528.6, 697.6,
-530.3, 697.9, 531.6, 700.1, 538.0, 710.4, 538.1, 710.3, 544.4, 720.7,
-544.4, 720.7, 544.4, 720.7, 544.4, 720.7, 534.1, 729.0, 523.0, 735.9,
-523.8, 737.3, 573.1, 676.7, 567.3, 670.3, 574.9, 663.4, 576.6, 650.0,
-576.6, 649.8, 576.6, 649.8, 576.7, 649.6, 577.5, 643.4, 575.7, 642.6,
-578.3, 637.3, 579.6, 639.0, 579.6, 639.0, 580.9, 640.6, 581.0, 646.3,
-579.7, 646.3, 578.4, 652.1, 575.8, 664.4, 568.2, 671.3, 573.1, 676.7,
-536.3, 636.7, 537.3, 627.8, 537.3, 627.8, 538.4, 619.0, 537.6, 618.0,
-551.4, 612.5, 552.4, 604.6, 552.6, 604.5, 553.8, 606.4, 555.2, 608.1,
-563.2, 618.2, 573.3, 624.9, 571.1, 628.3, 563.9, 639.2, 551.3, 641.0,
-536.3, 636.7, 549.3, 443.5, 552.8, 465.2, 544.2, 472.5, 556.3, 486.9,
-555.7, 487.9, 555.3, 487.8, 555.0, 488.9, 553.7, 495.1, 551.2, 494.6,
-547.5, 500.3, 547.7, 500.0, 547.5, 499.8, 547.5, 499.4, 547.6, 497.4,
-547.6, 497.4, 547.6, 495.4, 547.8, 490.8, 547.8, 490.8, 547.9, 486.2,
-548.0, 483.4, 548.0, 483.4, 548.1, 480.6, 548.7, 462.0, 557.9, 450.1,
-549.3, 443.5, 517.0, 564.6, 517.0, 565.3, 516.8, 566.1, 517.0, 566.1,
-516.1, 568.5, 516.1, 568.5, 515.2, 571.0, 514.3, 573.5, 514.3, 573.4,
-513.3, 575.9, 502.9, 609.6, 499.8, 608.6, 486.2, 641.2, 493.4, 624.6,
-492.9, 624.4, 499.7, 607.6, 508.3, 586.1, 508.0, 586.0, 517.0, 564.6,
-469.6, 385.7, 466.8, 389.5, 464.2, 393.4, 463.9, 393.2, 459.0, 391.3,
-455.0, 392.5, 454.1, 389.4, 452.7, 386.4, 452.7, 386.4, 451.3, 383.3,
-452.5, 381.9, 454.8, 383.8, 458.3, 384.2, 463.9, 385.0, 467.7, 382.6,
-469.6, 385.7, 396.3, 586.8, 397.2, 582.8, 397.3, 582.8, 398.2, 578.9,
-398.4, 578.1, 398.4, 578.1, 398.6, 577.3, 409.8, 571.4, 405.2, 559.0,
-407.6, 540.2, 413.0, 527.4, 419.1, 522.3, 414.3, 512.8, 411.6, 510.8,
-416.2, 504.6, 418.2, 496.4, 418.2, 496.4, 418.3, 496.4, 418.3, 496.4,
-419.0, 502.7, 419.0, 502.7, 419.7, 509.1, 410.4, 547.4, 408.3, 546.9,
-396.9, 584.7, 396.6, 585.7, 396.5, 585.7, 396.3, 586.8, 406.5, 715.6,
-406.9, 710.5, 406.9, 710.5, 407.3, 705.4, 414.6, 682.2, 422.2, 683.1,
-424.1, 659.7, 421.7, 688.2, 416.6, 688.1, 406.5, 715.6, 425.5, 707.4,
-429.7, 691.9, 428.8, 691.6, 432.1, 675.9, 441.2, 632.3, 440.7, 632.2,
-450.2, 588.8, 451.5, 585.3, 452.2, 585.4, 452.8, 581.9, 453.1, 588.3,
-453.1, 588.3, 453.5, 594.6, 451.7, 607.4, 450.4, 607.2, 447.3, 619.8,
-436.4, 663.6, 437.3, 663.9, 425.5, 707.4, 421.8, 600.0, 432.1, 526.1,
-432.1, 526.1, 442.5, 452.2, 442.2, 498.2, 443.0, 498.2, 443.6, 544.2,
-443.5, 549.1, 441.7, 549.1, 439.7, 554.0, 430.8, 577.0, 422.4, 576.8,
-421.8, 600.0, 450.1, 848.6, 452.0, 854.6, 455.4, 855.6, 453.9, 860.5,
-453.3, 865.0, 453.3, 865.0, 452.6, 869.4, 442.1, 862.3, 444.4, 858.9,
-436.1, 848.5, 428.4, 838.7, 428.5, 829.0, 420.7, 828.9, 435.5, 829.1,
-437.5, 836.6, 450.1, 848.6, 365.7, 852.2, 362.7, 811.2, 363.7, 811.1,
-359.7, 770.2, 360.0, 767.1, 360.0, 767.1, 360.3, 764.1, 361.6, 774.6,
-361.0, 774.7, 361.6, 785.4, 363.7, 818.8, 361.5, 819.0, 365.7, 852.2,
-444.9, 882.7, 427.4, 888.3, 425.7, 884.8, 406.6, 883.8, 405.1, 880.8,
-402.4, 882.1, 398.3, 880.4, 394.0, 872.0, 396.6, 870.7, 395.0, 861.0,
-392.2, 844.6, 396.7, 830.6, 389.3, 828.2, 417.3, 837.2, 412.8, 851.2,
-436.3, 874.3, 440.6, 878.5, 442.2, 883.6, 444.9, 882.7, 416.0, 171.3,
-416.1, 171.1, 416.3, 171.1, 416.3, 171.0, 417.8, 183.6, 417.8, 183.6,
-419.4, 196.3, 421.3, 210.6, 421.0, 210.6, 422.5, 225.0, 417.7, 260.8,
-417.2, 261.1, 417.5, 297.2, 417.2, 296.7, 417.2, 296.7, 416.8, 296.1,
-416.0, 242.1, 416.4, 242.1, 416.1, 188.1, 416.0, 179.7, 415.9, 179.7,
-416.0, 171.3, 346.4, 641.2, 353.1, 634.7, 353.5, 635.0, 359.8, 628.3,
-359.0, 628.9, 359.6, 629.7, 359.5, 631.2, 359.1, 633.6, 359.1, 633.6,
-358.8, 636.1, 358.4, 641.9, 355.7, 641.6, 355.0, 647.4, 355.3, 654.7,
-350.7, 654.7, 349.9, 662.3, 349.7, 664.6, 349.1, 664.5, 348.4, 666.8,
-346.5, 658.6, 347.7, 658.4, 347.1, 650.0, 346.8, 645.6, 344.6, 644.3,
-346.4, 641.2, 261.3, 688.3, 264.5, 698.4, 267.0, 702.9, 262.0, 710.4,
-244.4, 725.4, 243.2, 724.1, 226.8, 740.4, 233.3, 701.6, 239.0, 701.7,
-239.8, 662.8, 243.6, 657.0, 241.0, 655.3, 242.3, 647.9, 256.2, 664.4,
-254.6, 667.2, 261.3, 688.3, 242.3, 647.9, 247.6, 616.0, 247.6, 616.0,
-252.9, 584.1, 253.8, 609.7, 270.6, 620.2, 259.5, 635.1, 259.7, 636.7,
-259.6, 636.7, 259.6, 638.3, 260.0, 649.2, 260.0, 649.2, 260.4, 660.1,
-260.4, 662.7, 260.4, 662.7, 260.5, 665.3, 260.8, 672.8, 260.8, 672.8,
-261.0, 680.4, 261.2, 684.4, 259.5, 685.3, 261.3, 688.3, 254.6, 667.2,
-256.2, 664.4, 242.3, 647.9, 306.5, 803.3, 314.5, 784.8, 318.0, 785.6,
-322.6, 766.3, 330.7, 778.5, 327.5, 784.7, 338.9, 790.7, 338.4, 794.6,
-338.4, 794.6, 337.9, 798.5, 323.4, 804.1, 308.4, 807.4, 306.5, 803.3,
-337.9, 798.5, 337.2, 803.9, 337.2, 803.9, 336.5, 809.4, 321.1, 829.8,
-319.0, 828.2, 301.5, 847.1, 290.0, 859.4, 292.5, 867.4, 278.5, 871.8,
-284.4, 870.0, 281.3, 861.8, 285.2, 852.2, 291.3, 826.7, 295.8, 827.8,
-306.5, 803.3, 308.4, 807.4, 323.4, 804.1, 337.9, 798.5, 301.5, 847.1,
-319.0, 828.2, 321.1, 829.8, 336.5, 809.4, 333.6, 832.1, 337.9, 833.6,
-330.6, 854.9, 330.0, 857.6, 330.6, 857.7, 329.9, 860.4, 329.5, 862.2,
-329.5, 862.2, 329.0, 864.1, 314.4, 857.3, 300.6, 853.6, 301.5, 847.1,
-329.0, 864.1, 326.7, 873.5, 320.9, 879.5, 324.4, 882.9, 302.3, 890.3,
-299.7, 883.1, 275.0, 882.2, 275.2, 882.2, 275.2, 881.7, 275.3, 881.2,
-276.9, 876.5, 275.7, 875.5, 278.5, 871.8, 292.5, 867.4, 290.0, 859.4,
-301.5, 847.1, 300.6, 853.6, 314.4, 857.3, 329.0, 864.1, 398.2, 578.9,
-397.3, 582.8, 397.2, 582.8, 396.3, 586.8, 394.8, 593.0, 394.8, 593.0,
-393.3, 599.3, 389.1, 616.4, 395.5, 622.4, 385.0, 633.5, 378.5, 627.5,
-373.8, 632.5, 362.7, 631.5, 369.7, 602.6, 379.2, 604.2, 398.2, 578.9,
-362.7, 631.5, 361.1, 631.4, 359.8, 632.0, 359.5, 631.2, 359.5, 631.2,
-359.5, 631.2, 359.5, 631.2, 359.6, 629.7, 359.0, 628.9, 359.8, 628.3,
-360.2, 627.9, 359.6, 627.2, 360.0, 626.8, 360.5, 623.2, 360.5, 623.2,
-361.0, 619.6, 368.6, 590.3, 364.9, 589.4, 368.8, 559.1, 370.2, 560.5,
-373.0, 558.1, 377.0, 556.3, 387.8, 566.8, 394.5, 579.5, 398.6, 577.3,
-398.4, 578.1, 398.4, 578.1, 398.2, 578.9, 379.2, 604.2, 369.7, 602.6,
-362.7, 631.5, 374.9, 477.0, 387.8, 504.4, 387.8, 504.4, 400.7, 531.7,
-394.3, 526.7, 393.3, 527.9, 386.0, 524.0, 351.5, 518.3, 353.7, 505.1,
-321.3, 486.1, 322.1, 486.6, 322.6, 485.9, 323.8, 485.7, 332.3, 484.2,
-332.3, 484.2, 340.7, 482.8, 347.2, 481.7, 347.2, 481.7, 353.6, 480.6,
-364.3, 478.8, 371.0, 472.7, 374.9, 477.0, 430.0, 397.2, 420.7, 389.6,
-410.7, 388.7, 411.3, 382.1, 406.3, 376.3, 404.8, 377.1, 401.3, 370.6,
-396.6, 363.6, 396.6, 363.6, 392.0, 356.6, 406.4, 368.4, 404.9, 370.3,
-417.7, 384.1, 423.9, 390.6, 422.5, 394.9, 430.0, 397.2, 312.7, 349.7,
-319.1, 335.8, 319.1, 335.8, 325.6, 322.0, 330.1, 331.7, 331.6, 331.0,
-337.7, 340.1, 333.6, 348.9, 314.3, 352.2, 312.7, 349.7, 426.6, 461.9,
-423.9, 473.2, 422.3, 473.1, 421.1, 484.6, 421.1, 486.1, 420.7, 486.1,
-420.4, 487.6, 419.3, 484.4, 417.0, 485.2, 413.7, 482.7, 388.8, 467.8,
-390.8, 464.5, 367.9, 446.3, 367.7, 447.2, 393.4, 453.0, 418.9, 459.8,
-422.7, 460.9, 426.5, 460.5, 426.6, 461.9, 236.0, 594.4, 228.0, 614.6,
-225.6, 614.0, 220.0, 634.9, 220.3, 631.4, 219.5, 628.1, 220.5, 627.8,
-225.4, 586.6, 223.5, 586.4, 226.5, 544.9, 234.1, 539.0, 230.6, 534.6,
-234.6, 524.2, 241.1, 558.2, 240.5, 560.0, 236.0, 594.4, 77.2, 274.3,
-70.8, 259.9, 70.8, 259.9, 64.3, 245.5, 66.4, 226.4, 65.1, 226.2,
-65.9, 206.9, 64.9, 213.5, 67.1, 213.8, 68.2, 220.7, 71.9, 242.5,
-71.9, 242.5, 75.5, 264.2, 76.4, 269.2, 74.8, 270.2, 77.2, 274.3,
-689.5, 513.1, 695.2, 510.7, 698.8, 512.4, 700.8, 508.2, 700.3, 515.6,
-700.3, 515.6, 699.8, 523.1, 697.3, 524.2, 689.2, 517.7, 689.5, 513.1,
-699.8, 523.1, 698.6, 542.0, 694.3, 542.7, 697.3, 560.8, 695.3, 564.7,
-692.5, 565.5, 693.3, 568.6, 689.4, 569.0, 689.4, 569.0, 685.5, 569.3,
-674.9, 557.2, 672.6, 546.6, 661.6, 547.5, 659.2, 544.7, 658.6, 545.0,
-656.7, 541.9, 653.1, 536.2, 653.0, 536.3, 649.4, 530.7, 670.2, 528.0,
-669.4, 521.9, 689.5, 513.1, 689.2, 517.7, 697.3, 524.2, 699.8, 523.1,
-640.6, 486.8, 641.1, 482.9, 641.1, 482.9, 641.5, 479.0, 665.1, 466.5,
-665.8, 463.1, 691.8, 459.8, 696.3, 465.5, 696.3, 465.5, 700.8, 471.3,
-700.6, 474.2, 701.0, 474.9, 702.9, 477.3, 702.8, 478.7, 702.8, 478.7,
-702.7, 480.0, 693.9, 483.3, 687.5, 485.4, 687.0, 491.8, 677.4, 495.4,
-677.4, 495.4, 667.8, 498.9, 653.7, 497.4, 652.1, 495.6, 640.6, 486.8,
-667.8, 498.9, 652.8, 504.4, 652.4, 503.5, 637.8, 510.0, 638.1, 507.7,
-638.4, 507.7, 638.3, 505.4, 635.1, 498.0, 639.5, 496.1, 640.6, 486.8,
-652.1, 495.6, 653.7, 497.4, 667.8, 498.9, 784.9, 126.3, 772.6, 107.4,
-777.7, 99.6, 760.4, 88.4, 767.7, 87.7, 771.2, 83.6, 775.0, 86.9,
-813.2, 104.8, 813.2, 104.8, 851.4, 122.6, 849.9, 116.6, 813.4, 137.1,
-784.9, 126.3, 851.4, 122.6, 854.5, 124.1, 854.9, 123.5, 857.5, 125.5,
-863.1, 129.5, 863.2, 129.3, 868.7, 133.4, 872.0, 135.8, 872.0, 135.8,
-875.3, 138.2, 868.0, 135.7, 866.1, 141.0, 857.0, 143.8, 841.8, 132.4,
-830.0, 140.7, 806.2, 148.0, 800.0, 143.3, 800.7, 141.9, 793.9, 138.7,
-792.8, 138.7, 792.9, 137.9, 791.8, 137.2, 786.9, 134.1, 788.4, 131.7,
-784.9, 126.3, 813.4, 137.1, 849.9, 116.6, 851.4, 122.6, 921.4, 271.7,
-918.0, 273.4, 914.5, 273.9, 914.7, 275.0, 914.9, 275.8, 907.1, 277.0,
-907.2, 278.6, 907.3, 278.8, 905.1, 279.6, 903.1, 280.6, 902.5, 281.0,
-901.6, 279.7, 900.1, 278.9, 910.2, 274.1, 910.6, 274.7, 921.4, 271.7,
-773.0, 328.8, 748.5, 323.3, 748.1, 316.3, 724.0, 317.9, 720.6, 314.2,
-720.6, 314.2, 717.1, 310.4, 741.1, 315.2, 740.5, 318.1, 763.9, 325.8,
-768.5, 327.3, 768.4, 327.9, 773.0, 328.8, 787.0, 248.0, 792.7, 251.7,
-795.0, 256.8, 798.5, 255.3, 796.8, 263.4, 794.1, 271.2, 795.1, 271.6,
-793.4, 271.7, 791.4, 277.9, 792.6, 283.1, 788.8, 283.1, 789.0, 300.4,
-785.4, 317.7, 785.5, 317.1, 784.0, 316.8, 784.0, 315.9, 783.8, 302.9,
-784.5, 302.9, 785.1, 289.9, 786.1, 269.0, 779.8, 266.6, 787.0, 248.0,
-673.5, 315.8, 659.5, 298.6, 659.5, 298.6, 645.4, 281.4, 632.5, 255.7,
-631.1, 256.4, 615.8, 231.9, 605.0, 210.3, 611.0, 203.2, 594.1, 188.7,
-592.9, 180.0, 592.1, 178.0, 585.7, 172.0, 581.2, 168.9, 582.9, 166.5,
-580.1, 161.0, 591.5, 174.3, 591.9, 173.9, 603.8, 186.8, 616.0, 204.4,
-614.0, 205.7, 624.2, 224.7, 638.5, 251.0, 638.5, 251.0, 652.8, 277.4,
-663.2, 296.6, 673.6, 315.7, 673.5, 315.8, 478.7, 141.4, 501.3, 162.4,
-497.6, 169.5, 523.9, 183.4, 524.4, 183.1, 525.3, 184.7, 526.7, 186.0,
-533.2, 191.2, 531.9, 192.8, 537.0, 199.6, 526.3, 193.5, 528.0, 190.6,
-519.0, 181.6, 498.8, 161.5, 503.0, 150.3, 478.7, 141.4, 620.1, -35.4,
-624.7, -11.6, 619.7, -9.4, 629.3, 12.3, 624.8, 14.0, 624.8, 14.0,
-620.2, 15.7, 617.8, 13.9, 620.2, 10.6, 620.2, 5.5, 620.1, -14.9,
-629.9, -28.1, 620.1, -35.4, 250.6, 110.4, 253.5, 96.5, 253.0, 96.4,
-256.4, 82.5, 257.2, 79.3, 257.0, 79.3, 257.9, 76.1, 260.2, 67.8,
-260.2, 67.8, 262.6, 59.6, 263.8, 66.2, 269.4, 65.1, 276.3, 70.7,
-270.1, 100.3, 255.6, 120.9, 267.7, 130.7, 265.7, 140.4, 265.7, 140.4,
-263.7, 150.1, 251.1, 135.4, 252.7, 130.8, 250.6, 110.4, 263.7, 150.1,
-261.1, 162.6, 257.9, 162.7, 258.5, 175.0, 249.7, 165.6, 249.7, 165.6,
-240.9, 156.3, 246.6, 133.6, 245.7, 133.4, 250.6, 110.4, 252.7, 130.8,
-251.1, 135.4, 263.7, 150.1, 326.0, 83.2, 339.5, 82.3, 343.1, 87.8,
-353.0, 81.4, 353.5, 89.0, 353.5, 89.0, 353.9, 96.6, 351.1, 135.1,
-352.1, 135.2, 350.3, 173.8, 322.8, 160.6, 324.7, 128.1, 326.0, 83.2,
-350.3, 173.8, 350.0, 180.1, 350.0, 180.1, 349.7, 186.4, 337.7, 154.2,
-337.7, 154.1, 324.3, 122.5, 319.7, 110.0, 323.2, 100.7, 315.0, 97.6,
-319.0, 90.5, 325.0, 87.7, 323.0, 83.4, 324.5, 83.3, 324.5, 83.3,
-326.0, 83.2, 324.7, 128.1, 322.8, 160.6, 350.3, 173.8, 172.0, 295.9,
-179.3, 293.3, 179.3, 293.3, 186.7, 290.7, 183.3, 295.7, 186.1, 297.6,
-185.4, 304.5, 180.8, 306.1, 171.6, 299.5, 172.0, 295.9, 602.3, 667.7,
-604.0, 664.1, 590.6, 659.9, 591.4, 653.9, 601.3, 634.3, 600.4, 633.9,
-609.4, 614.0, 609.2, 614.5, 609.3, 614.5, 609.3, 615.1, 609.3, 615.2,
-609.3, 615.2, 609.2, 615.2, 605.8, 641.4, 612.9, 644.7, 602.3, 667.7,
-662.7, 698.1, 662.6, 699.1, 661.9, 699.0, 661.0, 700.0, 658.8, 702.5,
-658.8, 702.5, 656.6, 705.1, 654.4, 707.5, 654.4, 707.5, 652.3, 710.0,
-647.9, 714.9, 648.2, 719.6, 643.6, 719.9, 640.3, 720.1, 637.3, 715.8,
-636.4, 710.8, 632.1, 687.1, 631.2, 686.3, 633.1, 662.4, 632.8, 666.0,
-636.4, 666.3, 639.6, 670.2, 647.5, 679.7, 647.5, 679.7, 655.4, 689.2,
-658.3, 692.8, 658.3, 692.8, 661.2, 696.3, 661.9, 697.2, 662.7, 697.2,
-662.7, 698.1, 555.2, 608.1, 553.8, 606.4, 552.6, 604.5, 552.4, 604.6,
-553.2, 598.7, 541.1, 592.1, 541.9, 591.3, 542.6, 585.6, 542.6, 585.6,
-543.2, 580.0, 552.4, 591.6, 549.9, 593.8, 555.2, 608.1, 561.8, 494.2,
-562.8, 490.6, 562.8, 490.6, 563.8, 487.0, 564.1, 489.9, 568.0, 489.5,
-572.1, 491.9, 572.1, 492.7, 568.0, 492.8, 564.0, 493.7, 562.9, 493.9,
-561.8, 493.9, 561.8, 494.2, 544.4, 720.7, 544.4, 720.7, 544.4, 720.7,
-544.4, 720.7, 549.1, 728.1, 549.1, 728.1, 553.7, 735.5, 558.5, 743.3,
-558.5, 743.3, 563.4, 751.1, 568.5, 759.4, 574.8, 760.3, 573.7, 767.7,
-565.6, 772.1, 566.5, 773.6, 559.2, 779.4, 548.5, 769.2, 554.9, 762.5,
-550.7, 745.6, 547.5, 733.2, 547.5, 733.2, 544.4, 720.7, 589.1, 754.2,
-588.6, 757.8, 586.3, 757.5, 583.5, 760.9, 579.5, 765.7, 580.5, 767.1,
-575.5, 770.6, 575.8, 769.6, 573.8, 767.6, 573.7, 767.7, 574.8, 760.3,
-568.5, 759.4, 563.4, 751.1, 563.1, 714.0, 567.5, 713.8, 573.1, 676.7,
-568.2, 671.3, 575.8, 664.4, 578.4, 652.1, 575.3, 653.6, 579.5, 662.6,
-580.6, 673.2, 583.7, 702.7, 583.7, 702.7, 586.8, 732.3, 587.9, 743.2,
-590.3, 743.5, 589.1, 754.2, 531.4, 675.9, 533.8, 656.3, 533.8, 656.3,
-536.3, 636.7, 551.3, 641.0, 563.9, 639.2, 571.1, 628.3, 572.8, 628.1,
-573.1, 630.7, 575.0, 633.2, 575.6, 633.9, 575.6, 633.9, 576.1, 634.6,
-576.0, 635.8, 577.2, 636.0, 578.3, 637.3, 575.7, 642.6, 577.5, 643.4,
-576.7, 649.6, 571.0, 656.4, 568.5, 654.3, 560.3, 659.1, 545.9, 667.5,
-535.0, 679.2, 531.4, 675.9, 630.3, 847.0, 629.2, 849.3, 629.8, 849.8,
-628.1, 851.5, 623.9, 855.9, 624.5, 856.6, 619.8, 860.2, 609.4, 869.5,
-610.7, 874.4, 598.4, 878.2, 579.8, 884.0, 578.1, 879.9, 557.9, 879.4,
-557.7, 879.4, 557.6, 878.3, 557.4, 877.2, 591.6, 861.8, 592.0, 862.9,
-626.7, 848.5, 628.5, 847.7, 630.3, 846.9, 630.3, 847.0, 538.1, 445.8,
-538.5, 445.4, 538.5, 445.1, 539.0, 445.1, 540.4, 444.8, 541.1, 445.4,
-541.9, 444.6, 543.5, 442.4, 545.6, 443.9, 549.3, 443.3, 549.3, 443.3,
-549.3, 443.4, 549.3, 443.5, 557.9, 450.1, 548.7, 462.0, 548.1, 480.6,
-548.3, 478.7, 547.6, 478.7, 547.0, 476.8, 544.5, 467.9, 544.5, 467.9,
-541.9, 459.0, 540.7, 454.7, 540.7, 454.7, 539.5, 450.4, 538.8, 448.1,
-538.4, 448.1, 538.1, 445.8, 499.7, 607.6, 492.9, 624.4, 493.4, 624.6,
-486.2, 641.2, 479.6, 657.2, 478.0, 656.7, 472.9, 673.2, 459.6, 660.6,
-460.3, 644.6, 468.4, 624.5, 473.6, 611.8, 495.6, 603.8, 499.7, 607.6,
-468.4, 624.5, 468.3, 623.1, 468.3, 623.1, 468.2, 621.6, 468.1, 621.0,
-468.2, 621.0, 468.3, 620.3, 466.7, 616.9, 475.7, 614.6, 476.1, 608.4,
-497.1, 588.7, 503.3, 585.9, 508.7, 559.0, 509.0, 559.2, 512.5, 553.3,
-516.3, 547.5, 515.7, 548.6, 516.4, 549.0, 516.5, 550.4, 518.6, 551.0,
-516.7, 557.5, 517.0, 564.6, 508.0, 586.0, 508.3, 586.1, 499.7, 607.6,
-495.6, 603.8, 473.6, 611.8, 468.4, 624.5, 446.4, 372.4, 445.7, 370.9,
-445.1, 370.9, 445.0, 369.4, 444.8, 366.7, 444.8, 366.7, 444.5, 364.1,
-444.1, 362.0, 444.8, 361.9, 445.1, 359.6, 444.3, 355.2, 446.4, 354.8,
-447.8, 349.9, 448.9, 361.0, 448.0, 361.3, 446.4, 372.4, 191.5, 616.5,
-188.4, 624.7, 188.4, 624.7, 185.3, 632.9, 179.2, 628.3, 179.6, 619.8,
-183.2, 610.3, 182.7, 611.6, 191.2, 613.0, 191.5, 616.5, 183.2, 610.3,
-174.4, 552.3, 178.0, 551.8, 172.8, 493.4, 172.9, 493.2, 172.9, 493.2,
-172.9, 493.1, 178.5, 505.2, 179.3, 504.9, 185.8, 516.6, 190.9, 543.6,
-189.3, 545.5, 202.3, 569.3, 197.7, 591.0, 197.7, 591.0, 193.0, 612.6,
-192.7, 614.6, 192.3, 614.5, 191.5, 616.5, 191.2, 613.0, 182.7, 611.6,
-183.2, 610.3, 168.3, 506.7, 170.6, 500.0, 170.6, 500.0, 172.8, 493.4,
-178.0, 551.8, 174.4, 552.3, 183.2, 610.3, 179.6, 619.8, 179.2, 628.3,
-185.3, 632.9, 183.7, 636.8, 182.7, 636.7, 182.2, 640.8, 174.0, 627.6,
-163.2, 624.8, 165.9, 614.5, 165.1, 609.2, 165.1, 609.2, 164.4, 603.8,
-165.5, 555.2, 164.6, 555.1, 168.3, 506.7, 164.4, 603.8, 161.6, 583.3,
-161.6, 583.3, 158.8, 562.8, 159.4, 553.5, 160.5, 553.3, 159.2, 544.2,
-161.2, 532.8, 165.9, 522.6, 163.3, 521.4, 165.8, 514.0, 165.8, 514.0,
-168.3, 506.7, 164.6, 555.1, 165.5, 555.2, 164.4, 603.8, 403.1, 653.0,
-392.2, 650.9, 391.3, 646.7, 381.3, 648.8, 383.1, 641.1, 387.8, 636.1,
-385.0, 633.5, 395.5, 622.4, 389.1, 616.4, 393.3, 599.3, 408.9, 616.2,
-408.9, 628.7, 403.1, 653.0, 406.4, 715.8, 406.4, 715.7, 406.4, 715.7,
-406.5, 715.6, 416.6, 688.1, 421.7, 688.2, 424.1, 659.7, 430.8, 639.9,
-431.3, 640.1, 438.6, 620.5, 441.4, 612.6, 441.4, 612.6, 444.3, 604.8,
-443.2, 597.4, 447.3, 596.8, 450.2, 588.8, 440.7, 632.2, 441.2, 632.3,
-432.1, 675.9, 424.6, 697.5, 419.2, 695.7, 406.5, 715.6, 406.4, 715.7,
-406.4, 715.7, 406.4, 715.8, 432.1, 675.9, 428.8, 691.6, 429.7, 691.9,
-425.5, 707.4, 421.8, 725.3, 421.8, 725.3, 418.1, 743.1, 416.7, 749.7,
-416.7, 749.7, 415.4, 756.3, 414.9, 758.5, 413.6, 760.2, 414.4, 760.8,
-409.1, 754.3, 409.1, 754.3, 403.8, 747.8, 407.7, 747.1, 412.9, 726.6,
-406.2, 718.4, 406.0, 718.3, 406.3, 717.1, 406.4, 715.8, 418.8, 695.5,
-414.0, 683.8, 432.1, 675.9, 458.7, 682.6, 460.2, 708.3, 460.1, 708.3,
-461.7, 734.0, 463.1, 739.0, 458.0, 740.4, 454.2, 746.8, 450.4, 731.2,
-455.4, 730.0, 456.6, 713.1, 457.6, 697.9, 462.2, 696.8, 458.7, 682.6,
-439.7, 554.0, 441.7, 549.1, 443.5, 549.1, 443.6, 544.2, 444.0, 574.5,
-439.9, 575.1, 444.3, 604.8, 441.4, 612.6, 441.4, 612.6, 438.6, 620.5,
-435.6, 587.6, 437.6, 587.1, 439.7, 554.0, 438.6, 620.5, 431.3, 640.1,
-430.8, 639.9, 424.1, 659.7, 422.2, 683.1, 414.6, 682.2, 407.3, 705.4,
-407.5, 703.4, 407.5, 703.4, 407.6, 701.4, 413.1, 685.3, 410.4, 684.4,
-412.4, 667.3, 417.8, 633.8, 417.1, 633.6, 421.8, 600.0, 422.4, 576.8,
-430.8, 577.0, 439.7, 554.0, 437.6, 587.1, 435.6, 587.6, 438.6, 620.5,
-392.3, 792.8, 390.7, 784.7, 386.5, 785.5, 380.8, 778.2, 371.1, 765.9,
-366.9, 767.5, 361.4, 753.6, 362.4, 743.8, 362.4, 743.8, 363.4, 734.1,
-364.5, 737.8, 368.3, 736.6, 373.2, 739.2, 385.7, 764.5, 386.9, 765.2,
-392.3, 792.8, 395.0, 861.0, 396.6, 870.7, 394.0, 872.0, 398.3, 880.4,
-382.6, 873.9, 382.6, 873.9, 366.8, 867.4, 369.6, 865.9, 366.3, 859.8,
-365.7, 852.2, 361.5, 819.0, 363.7, 818.8, 361.6, 785.4, 387.3, 793.1,
-380.1, 822.5, 395.0, 861.0, 361.6, 785.4, 361.0, 774.7, 361.6, 774.6,
-360.3, 764.1, 360.9, 758.8, 360.9, 758.8, 361.4, 753.6, 366.9, 767.5,
-371.1, 765.9, 380.8, 778.2, 389.5, 801.5, 385.1, 803.2, 389.3, 828.2,
-396.7, 830.6, 392.2, 844.6, 395.0, 861.0, 380.1, 822.5, 387.3, 793.1,
-361.6, 785.4, 436.3, 874.3, 412.8, 851.2, 417.3, 837.2, 389.3, 828.2,
-385.1, 803.2, 389.5, 801.5, 380.8, 778.2, 386.5, 785.5, 390.7, 784.7,
-392.3, 792.8, 393.5, 794.3, 393.5, 794.3, 394.7, 795.9, 407.7, 812.4,
-407.7, 812.4, 420.7, 828.9, 428.5, 829.0, 428.4, 838.7, 436.1, 848.5,
-440.1, 860.0, 431.5, 872.2, 436.3, 874.3, 436.1, 848.5, 444.4, 858.9,
-442.1, 862.3, 452.6, 869.4, 451.9, 874.1, 452.4, 874.2, 451.3, 878.7,
-450.8, 880.6, 450.5, 882.6, 450.3, 882.5, 448.4, 883.8, 446.9, 883.9,
-444.9, 882.7, 442.2, 883.6, 440.6, 878.5, 436.3, 874.3, 431.5, 872.2,
-440.1, 860.0, 436.1, 848.5, 383.8, 232.7, 386.1, 216.4, 392.4, 214.6,
-388.3, 200.2, 389.4, 199.1, 389.4, 199.1, 390.4, 198.0, 388.0, 215.4,
-394.0, 221.9, 383.8, 232.7, 284.3, 466.1, 288.2, 469.9, 287.7, 470.6,
-292.1, 473.7, 296.3, 475.1, 295.0, 478.2, 299.2, 480.6, 316.5, 484.7,
-314.1, 495.1, 329.0, 509.6, 330.1, 511.2, 327.3, 513.3, 325.6, 516.9,
-320.7, 527.7, 323.9, 534.9, 315.8, 538.5, 315.8, 538.5, 312.6, 531.3,
-309.5, 524.1, 301.1, 504.9, 301.1, 504.9, 292.8, 485.6, 288.5, 475.9,
-284.9, 476.1, 284.3, 466.1, 358.5, 448.9, 362.0, 453.0, 362.0, 453.0,
-365.6, 457.1, 373.1, 463.9, 370.3, 467.0, 374.9, 477.0, 371.0, 472.7,
-364.3, 478.8, 353.6, 480.6, 349.6, 477.1, 355.1, 470.8, 356.6, 461.0,
-357.2, 457.1, 357.2, 457.1, 357.8, 453.2, 358.1, 451.1, 359.1, 449.2,
-358.5, 448.9, 417.7, 384.1, 404.9, 370.3, 406.4, 368.4, 392.0, 356.6,
-390.1, 353.7, 388.6, 350.6, 388.2, 350.8, 389.5, 348.0, 386.2, 343.5,
-381.6, 341.0, 375.3, 339.9, 376.4, 333.1, 371.2, 325.2, 375.1, 328.5,
-377.6, 325.6, 384.0, 325.9, 401.6, 337.3, 403.5, 340.5, 423.8, 341.6,
-424.2, 342.3, 424.2, 342.3, 424.7, 343.1, 421.8, 363.6, 427.9, 379.8,
-417.7, 384.1, 424.7, 343.1, 432.4, 355.7, 432.0, 356.0, 440.0, 368.4,
-440.9, 383.7, 440.9, 383.7, 441.8, 399.1, 442.4, 401.0, 441.3, 401.3,
-440.8, 403.5, 440.7, 403.7, 439.2, 403.4, 437.6, 403.3, 437.8, 400.6,
-433.8, 400.3, 430.0, 397.2, 422.5, 394.9, 423.9, 390.6, 417.7, 384.1,
-427.9, 379.8, 421.8, 363.6, 424.7, 343.1, 355.4, 366.8, 358.1, 370.8,
-357.9, 374.7, 360.7, 374.8, 352.1, 382.3, 352.1, 382.3, 343.5, 389.8,
-340.0, 384.6, 346.3, 374.7, 355.4, 366.8, 418.9, 459.8, 393.4, 453.0,
-367.7, 447.2, 367.9, 446.3, 366.7, 445.3, 366.7, 445.3, 365.4, 444.3,
-365.4, 444.7, 366.6, 444.6, 367.8, 445.0, 393.3, 452.4, 417.7, 449.6,
-418.9, 459.8, 262.9, 486.8, 261.9, 491.5, 261.0, 496.3, 261.0, 496.3,
-259.6, 503.2, 259.6, 503.2, 258.1, 510.1, 259.7, 503.9, 259.4, 503.9,
-260.7, 497.6, 261.8, 492.2, 261.5, 492.1, 262.9, 486.8, 118.7, 318.3,
-119.2, 321.0, 119.2, 321.0, 119.8, 323.7, 122.1, 325.8, 107.3, 335.3,
-108.8, 344.5, 106.6, 339.6, 106.6, 339.6, 104.4, 334.7, 106.1, 328.2,
-109.4, 329.0, 114.3, 323.3, 116.5, 320.8, 116.7, 318.2, 118.7, 318.3,
-925.0, 270.0, 923.2, 270.9, 923.2, 270.9, 921.4, 271.7, 910.6, 274.7,
-910.2, 274.1, 900.1, 278.9, 892.2, 274.4, 892.2, 274.4, 884.2, 269.9,
-853.6, 232.9, 850.9, 235.1, 817.5, 200.3, 861.1, 193.4, 867.2, 232.5,
-916.9, 264.8, 921.0, 267.4, 922.6, 266.3, 925.0, 270.0, 704.8, 239.4,
-704.8, 239.2, 714.5, 236.3, 722.0, 239.1, 727.1, 241.1, 726.0, 244.0,
-729.9, 248.9, 747.4, 270.5, 766.2, 271.9, 764.8, 292.2, 765.0, 289.6,
-744.5, 291.9, 727.4, 284.4, 723.0, 282.4, 724.6, 278.8, 721.8, 273.1,
-713.3, 256.2, 704.7, 256.2, 704.8, 239.4, 666.3, 239.8, 663.2, 236.4,
-657.8, 242.9, 652.5, 240.0, 645.6, 232.5, 645.6, 232.5, 638.7, 224.9,
-652.4, 224.8, 656.3, 228.9, 666.3, 239.8, 773.6, 303.1, 775.2, 302.3,
-778.8, 309.5, 784.0, 315.9, 784.0, 316.8, 785.5, 317.1, 785.4, 317.7,
-785.1, 318.9, 784.8, 320.1, 784.9, 320.1, 781.7, 321.8, 783.7, 325.5,
-782.6, 330.9, 778.5, 328.6, 777.8, 329.9, 773.0, 328.8, 768.4, 327.9,
-768.5, 327.3, 763.9, 325.8, 764.2, 314.4, 765.2, 307.2, 773.6, 303.1,
-697.2, 208.4, 686.5, 202.6, 682.2, 199.0, 680.7, 187.9, 687.8, 190.0,
-690.8, 194.8, 695.0, 192.2, 697.4, 194.4, 698.4, 193.2, 701.9, 194.3,
-726.8, 215.2, 729.6, 211.8, 757.4, 229.3, 757.5, 228.9, 724.9, 223.3,
-697.2, 208.4, 624.2, 224.7, 614.0, 205.7, 616.0, 204.4, 603.8, 186.8,
-608.6, 192.1, 608.6, 192.1, 613.4, 197.3, 620.3, 210.2, 614.9, 214.5,
-624.2, 224.7, 484.2, 186.0, 456.3, 171.2, 457.3, 169.0, 428.4, 156.5,
-427.8, 156.2, 427.8, 156.2, 427.2, 155.8, 455.7, 170.8, 457.2, 168.6,
-484.2, 186.0, 620.2, 5.5, 620.2, 10.6, 617.8, 13.9, 620.2, 15.7,
-610.8, 19.2, 610.8, 19.2, 601.4, 22.8, 598.7, 18.3, 595.3, 19.3,
-588.8, 18.1, 583.6, 9.6, 583.6, 9.6, 578.5, 1.0, 584.0, -3.9,
-578.1, -10.7, 577.7, -22.4, 577.6, -21.7, 578.8, -21.6, 580.0, -20.8,
-600.1, -7.7, 602.6, -10.4, 620.2, 5.5, 151.7, 366.1, 155.5, 333.2,
-157.2, 333.4, 159.2, 300.4, 164.9, 298.4, 164.9, 298.4, 170.5, 296.4,
-166.4, 331.9, 170.9, 359.3, 151.7, 366.1, 170.5, 296.4, 171.2, 296.2,
-171.2, 296.2, 172.0, 295.9, 171.6, 299.5, 180.8, 306.1, 185.4, 304.5,
-183.7, 322.7, 183.7, 322.7, 182.0, 340.9, 165.8, 368.5, 158.1, 366.7,
-150.4, 396.6, 150.3, 396.6, 150.3, 396.6, 150.3, 396.7, 149.9, 392.5,
-149.9, 392.5, 149.5, 388.3, 149.1, 384.6, 149.8, 384.5, 150.0, 380.7,
-150.3, 373.4, 150.8, 373.4, 151.7, 366.1, 170.9, 359.3, 166.4, 331.9,
-170.5, 296.4, 618.3, 687.8, 619.4, 679.0, 603.6, 678.6, 602.3, 667.7,
-612.9, 644.7, 605.8, 641.4, 609.2, 615.2, 628.7, 639.7, 622.9, 652.7,
-618.3, 687.8, 705.5, 618.5, 711.2, 627.4, 711.2, 627.4, 716.9, 636.3,
-710.2, 655.5, 702.4, 652.8, 687.9, 669.3, 675.3, 683.7, 676.1, 684.5,
-662.7, 698.1, 662.7, 697.2, 661.9, 697.2, 661.2, 696.3, 664.7, 687.9,
-665.7, 688.3, 670.2, 680.4, 674.1, 673.6, 674.1, 673.6, 678.0, 666.8,
-691.7, 642.6, 685.3, 634.3, 705.5, 618.5, 743.5, 725.6, 741.4, 730.8,
-743.2, 733.3, 739.3, 736.1, 735.2, 740.4, 735.2, 740.4, 731.1, 744.7,
-721.4, 738.3, 724.7, 733.4, 718.2, 722.2, 717.3, 720.6, 717.3, 720.6,
-716.3, 718.9, 710.1, 708.1, 710.1, 708.1, 703.9, 697.2, 703.3, 696.1,
-703.6, 695.6, 702.6, 694.9, 712.2, 701.4, 711.9, 701.9, 721.2, 708.8,
-730.6, 715.9, 730.6, 715.9, 739.9, 722.9, 741.7, 724.2, 743.6, 724.3,
-743.5, 725.6, 685.5, 772.8, 679.5, 765.3, 672.3, 759.2, 673.6, 757.7,
-672.1, 756.0, 672.1, 756.0, 670.7, 754.2, 667.7, 750.4, 667.7, 750.4,
-664.7, 746.6, 664.1, 745.8, 664.1, 745.8, 663.5, 745.0, 653.5, 732.4,
-648.2, 734.2, 643.6, 719.9, 648.2, 719.6, 647.9, 714.9, 652.3, 710.0,
-670.8, 731.5, 665.9, 735.7, 679.5, 761.5, 682.5, 767.1, 680.8, 769.9,
-685.5, 772.8, 575.0, 633.2, 573.1, 630.7, 572.8, 628.1, 571.1, 628.3,
-573.3, 624.9, 563.2, 618.2, 555.2, 608.1, 549.9, 593.8, 552.4, 591.6,
-543.2, 580.0, 545.2, 564.5, 545.2, 564.5, 547.1, 549.0, 544.2, 551.1,
-550.9, 560.4, 554.6, 571.8, 564.8, 602.5, 566.0, 602.2, 575.0, 633.2,
-552.2, 531.6, 552.3, 531.5, 551.5, 531.2, 551.5, 531.1, 556.7, 512.6,
-556.7, 512.6, 561.8, 494.2, 561.8, 493.9, 562.9, 493.9, 564.0, 493.7,
-563.0, 500.5, 561.9, 500.3, 559.9, 507.0, 556.0, 519.3, 556.4, 519.4,
-552.2, 531.6, 550.7, 745.6, 554.9, 762.5, 548.5, 769.2, 559.2, 779.4,
-552.8, 784.7, 553.7, 788.1, 546.4, 789.9, 533.1, 797.2, 533.1, 797.2,
-519.9, 804.5, 522.8, 773.9, 526.4, 761.1, 550.7, 745.6, 519.9, 804.5,
-517.5, 805.8, 515.6, 805.4, 515.2, 807.1, 519.5, 772.2, 519.5, 772.2,
-523.8, 737.3, 523.0, 735.9, 534.1, 729.0, 544.4, 720.7, 547.5, 733.2,
-547.5, 733.2, 550.7, 745.6, 526.4, 761.1, 522.8, 773.9, 519.9, 804.5,
-580.6, 673.2, 579.5, 662.6, 575.3, 653.6, 578.4, 652.1, 579.7, 646.3,
-581.0, 646.3, 580.9, 640.6, 585.5, 646.4, 590.7, 651.6, 590.1, 652.2,
-589.9, 652.7, 591.6, 653.5, 591.4, 653.9, 590.6, 659.9, 604.0, 664.1,
-602.3, 667.7, 603.6, 678.6, 619.4, 679.0, 618.3, 687.8, 618.4, 688.0,
-618.4, 688.2, 618.6, 688.3, 602.2, 681.9, 602.3, 681.8, 586.0, 675.3,
-583.3, 674.2, 581.2, 674.9, 580.6, 673.2, 531.6, 700.1, 530.3, 697.9,
-528.6, 697.6, 529.0, 695.8, 529.9, 688.2, 529.6, 688.2, 530.8, 680.6,
-531.2, 678.3, 531.1, 678.3, 531.4, 675.9, 535.0, 679.2, 545.9, 667.5,
-560.3, 659.1, 560.5, 679.5, 547.8, 681.1, 531.6, 700.1, 611.2, 757.1,
-629.3, 783.0, 624.2, 786.6, 637.1, 816.1, 639.1, 820.5, 640.9, 820.5,
-641.0, 824.9, 639.3, 828.4, 639.3, 828.4, 637.6, 831.9, 624.6, 834.2,
-616.6, 837.5, 610.6, 830.4, 603.2, 821.6, 610.7, 815.3, 610.8, 800.2,
-610.9, 794.7, 610.9, 794.7, 610.9, 789.2, 611.0, 784.0, 611.0, 784.0,
-611.0, 778.7, 611.1, 767.9, 616.2, 764.3, 611.2, 757.1, 670.7, 754.2,
-672.1, 756.0, 672.1, 756.0, 673.6, 757.7, 650.1, 785.2, 657.3, 791.3,
-641.0, 824.9, 640.9, 820.5, 639.1, 820.5, 637.1, 816.1, 641.6, 801.5,
-644.6, 802.4, 652.0, 788.7, 661.4, 771.4, 659.6, 770.2, 670.7, 754.2,
-626.7, 848.5, 592.0, 862.9, 591.6, 861.8, 557.4, 877.2, 556.7, 874.7,
-556.7, 874.7, 556.1, 872.2, 590.4, 857.9, 627.4, 851.2, 626.7, 848.5,
-547.0, 476.8, 547.6, 478.7, 548.3, 478.7, 548.1, 480.6, 548.0, 483.4,
-548.0, 483.4, 547.9, 486.2, 546.7, 481.7, 546.9, 481.5, 547.0, 476.8,
-492.2, 356.2, 480.9, 370.9, 480.9, 370.9, 469.6, 385.7, 467.7, 382.6,
-463.9, 385.0, 458.3, 384.2, 462.7, 374.2, 467.7, 376.4, 477.2, 368.6,
-484.7, 362.4, 488.7, 364.1, 492.2, 356.2, 396.9, 584.7, 408.3, 546.9,
-410.4, 547.4, 419.7, 509.1, 420.3, 514.1, 421.1, 514.2, 420.8, 519.2,
-420.7, 532.8, 420.4, 532.8, 420.6, 546.5, 419.9, 555.0, 419.9, 555.0,
-419.2, 563.4, 411.4, 576.1, 397.0, 574.0, 396.9, 584.7, 419.2, 563.4,
-415.4, 609.0, 415.4, 609.0, 411.6, 654.6, 411.0, 652.7, 407.3, 653.8,
-403.1, 653.0, 408.9, 628.7, 408.9, 616.2, 393.3, 599.3, 394.8, 593.0,
-394.8, 593.0, 396.3, 586.8, 396.5, 585.7, 396.6, 585.7, 396.9, 584.7,
-397.0, 574.0, 411.4, 576.1, 419.2, 563.4, 418.1, 743.1, 421.8, 725.3,
-421.8, 725.3, 425.5, 707.4, 433.4, 674.3, 434.0, 674.4, 442.2, 641.3,
-444.8, 630.6, 447.3, 619.8, 447.3, 619.8, 447.3, 619.8, 444.8, 630.6,
-442.2, 641.3, 435.7, 668.8, 435.7, 668.8, 429.2, 696.3, 423.6, 719.7,
-425.6, 720.3, 418.1, 743.1, 394.7, 795.9, 393.5, 794.3, 393.5, 794.3,
-392.3, 792.8, 386.9, 765.2, 385.7, 764.5, 373.2, 739.2, 388.1, 746.8,
-402.3, 755.6, 403.0, 754.5, 420.6, 782.9, 420.6, 782.9, 438.3, 811.2,
-438.9, 808.0, 416.1, 804.5, 394.7, 795.9, 438.3, 811.2, 438.3, 811.3,
-438.3, 811.3, 438.3, 811.3, 444.2, 830.0, 444.2, 830.0, 450.1, 848.6,
-437.5, 836.6, 435.5, 829.1, 420.7, 828.9, 407.7, 812.4, 407.7, 812.4,
-394.7, 795.9, 416.1, 804.5, 438.9, 808.0, 438.3, 811.2, 416.1, 188.1,
-416.4, 242.1, 416.0, 242.1, 416.8, 296.1, 407.0, 281.7, 407.0, 281.7,
-397.3, 267.3, 397.0, 227.8, 431.5, 210.9, 416.1, 188.1, 397.3, 267.3,
-390.0, 256.5, 379.9, 250.3, 382.7, 245.8, 382.5, 244.4, 382.5, 244.4,
-382.3, 243.1, 381.0, 238.5, 383.0, 237.9, 383.8, 232.7, 394.0, 221.9,
-388.0, 215.4, 390.4, 198.0, 401.1, 186.7, 400.3, 185.7, 411.9, 175.4,
-413.9, 173.3, 413.9, 173.3, 416.0, 171.3, 415.9, 179.7, 416.0, 179.7,
-416.1, 188.1, 431.5, 210.9, 397.0, 227.8, 397.3, 267.3, 275.3, 881.2,
-275.2, 881.7, 275.2, 882.2, 275.0, 882.2, 263.9, 882.6, 255.8, 887.0,
-252.7, 881.9, 240.2, 861.3, 244.8, 856.5, 243.7, 830.9, 244.0, 836.8,
-247.3, 836.7, 251.0, 842.4, 255.4, 849.5, 255.4, 849.5, 259.8, 856.5,
-264.9, 864.6, 264.9, 864.6, 270.1, 872.8, 272.7, 877.0, 273.1, 876.8,
-275.3, 881.2, 239.4, 806.4, 234.4, 814.0, 241.5, 818.6, 243.7, 830.9,
-244.8, 856.5, 240.2, 861.3, 252.7, 881.9, 246.6, 891.2, 211.6, 885.1,
-210.9, 881.3, 205.0, 847.4, 218.0, 839.2, 239.4, 806.4, 210.9, 881.3,
-210.8, 881.6, 209.1, 881.3, 209.1, 881.3, 212.1, 865.4, 209.0, 864.8,
-208.8, 848.4, 207.5, 838.4, 210.5, 838.1, 212.2, 827.7, 209.5, 826.6,
-221.9, 795.2, 231.7, 762.7, 223.7, 770.7, 235.1, 782.2, 238.5, 801.7,
-239.0, 804.0, 240.0, 804.4, 239.4, 806.4, 218.0, 839.2, 205.0, 847.4,
-210.9, 881.3, 359.2, 595.6, 360.1, 607.6, 363.8, 608.6, 361.0, 619.6,
-360.5, 623.2, 360.5, 623.2, 360.0, 626.8, 311.7, 667.4, 312.0, 667.8,
-264.0, 708.7, 275.7, 699.7, 273.7, 697.1, 283.5, 685.5, 292.3, 675.0,
-292.3, 675.0, 301.1, 664.5, 313.0, 650.4, 313.0, 650.4, 324.9, 636.3,
-342.0, 615.9, 337.3, 605.7, 359.2, 595.6, 355.4, 543.6, 356.1, 553.6,
-356.1, 553.6, 356.8, 563.5, 339.0, 591.0, 311.6, 612.4, 311.1, 611.9,
-307.1, 608.3, 329.4, 583.6, 347.8, 555.3, 351.6, 549.5, 356.2, 544.4,
-355.4, 543.6, 257.4, 569.9, 257.2, 564.7, 255.6, 564.2, 257.0, 559.6,
-259.6, 544.0, 258.2, 543.6, 262.2, 528.4, 267.1, 506.8, 262.2, 505.2,
-269.5, 484.6, 270.8, 480.4, 270.8, 480.4, 272.0, 476.1, 273.8, 480.1,
-271.2, 481.3, 270.4, 486.5, 263.9, 528.2, 265.0, 528.4, 257.4, 569.9,
-279.0, 460.9, 279.1, 460.5, 278.2, 460.2, 277.5, 459.5, 277.2, 459.3,
-277.0, 459.2, 277.0, 459.0, 283.9, 435.5, 283.9, 435.5, 290.7, 411.9,
-300.0, 420.9, 285.7, 436.7, 279.0, 460.9, 308.0, 359.7, 310.3, 354.7,
-310.3, 354.7, 312.7, 349.7, 314.3, 352.2, 333.6, 348.9, 337.7, 340.1,
-346.5, 353.4, 346.5, 353.4, 355.4, 366.8, 346.3, 374.7, 340.0, 384.6,
-343.5, 389.8, 341.5, 391.6, 341.5, 391.6, 339.5, 393.3, 322.1, 378.5,
-319.9, 378.9, 308.0, 359.7, 339.5, 393.3, 337.2, 395.3, 334.6, 396.8,
-334.9, 397.3, 323.6, 396.7, 316.9, 390.7, 312.2, 396.0, 305.9, 388.8,
-301.7, 380.5, 299.6, 381.6, 301.0, 376.6, 301.0, 376.6, 302.4, 371.7,
-303.9, 365.4, 305.2, 365.7, 308.0, 359.7, 319.9, 378.9, 322.1, 378.5,
-339.5, 393.3, 431.3, 441.1, 431.5, 441.2, 431.6, 441.2, 431.6, 441.3,
-431.6, 441.3, 431.6, 441.3, 431.6, 441.3, 431.5, 441.2, 431.3, 441.1,
-431.3, 441.1, 260.7, 497.6, 259.4, 503.9, 259.7, 503.9, 258.1, 510.1,
-256.8, 515.4, 255.8, 520.7, 255.8, 520.7, 249.4, 547.7, 250.8, 548.1,
-242.9, 574.7, 241.7, 578.5, 241.8, 578.5, 240.7, 582.4, 239.4, 588.6,
-238.4, 588.4, 236.0, 594.4, 240.5, 560.0, 241.1, 558.2, 234.6, 524.2,
-242.6, 503.9, 242.6, 503.9, 250.5, 483.7, 249.5, 484.7, 258.5, 489.8,
-260.7, 497.6, 250.5, 483.7, 251.2, 482.0, 251.0, 482.0, 251.8, 480.4,
-262.3, 459.0, 262.3, 459.0, 272.8, 437.6, 267.5, 462.1, 267.9, 462.2,
-262.9, 486.8, 261.5, 492.1, 261.8, 492.2, 260.7, 497.6, 258.5, 489.8,
-249.5, 484.7, 250.5, 483.7, 114.3, 323.3, 109.4, 329.0, 106.1, 328.2,
-104.4, 334.7, 90.8, 304.5, 90.8, 304.5, 77.2, 274.3, 74.8, 270.2,
-76.4, 269.2, 75.5, 264.2, 92.4, 285.4, 90.4, 286.9, 105.3, 309.6,
-109.8, 316.5, 114.5, 316.6, 114.3, 323.3, 721.8, 273.1, 724.6, 278.8,
-723.0, 282.4, 727.4, 284.4, 727.4, 284.5, 723.5, 283.6, 719.5, 282.8,
-717.0, 282.2, 717.0, 282.2, 714.4, 281.7, 699.8, 278.7, 698.9, 280.9,
-685.2, 275.6, 681.5, 271.6, 681.5, 271.6, 677.8, 267.5, 699.5, 266.0,
-701.2, 266.2, 721.8, 273.1, 677.8, 267.5, 665.2, 253.8, 665.2, 253.8,
-652.5, 240.0, 657.8, 242.9, 663.2, 236.4, 666.3, 239.8, 685.6, 239.6,
-690.8, 230.9, 704.8, 239.4, 704.7, 256.2, 713.3, 256.2, 721.8, 273.1,
-701.2, 266.2, 699.5, 266.0, 677.8, 267.5, 641.5, 196.5, 647.2, 188.0,
-652.8, 179.4, 653.0, 179.5, 666.8, 183.7, 666.8, 183.7, 680.7, 187.9,
-682.2, 199.0, 686.5, 202.6, 697.2, 208.4, 705.9, 219.2, 705.9, 219.2,
-714.6, 230.0, 715.2, 230.7, 715.9, 231.3, 715.8, 231.4, 715.7, 231.6,
-715.0, 231.0, 714.1, 230.6, 677.8, 213.5, 671.3, 221.4, 641.5, 196.5,
-686.3, 276.8, 685.8, 276.2, 685.8, 276.2, 685.2, 275.6, 698.9, 280.9,
-699.8, 278.7, 714.4, 281.7, 706.7, 273.4, 700.2, 279.7, 686.3, 276.8,
-714.6, 230.0, 705.9, 219.2, 705.9, 219.2, 697.2, 208.4, 724.9, 223.3,
-757.5, 228.9, 757.4, 229.3, 757.4, 229.3, 757.4, 229.3, 757.4, 229.3,
-741.4, 229.6, 741.4, 229.6, 725.3, 229.8, 720.0, 229.9, 718.0, 232.5,
-714.6, 230.0, 652.8, 277.4, 638.5, 251.0, 638.5, 251.0, 624.2, 224.7,
-614.9, 214.5, 620.3, 210.2, 613.4, 197.3, 620.0, 204.5, 620.0, 204.5,
-626.6, 211.7, 626.7, 211.8, 626.7, 211.8, 626.8, 212.0, 626.8, 212.0,
-626.8, 212.0, 626.8, 212.0, 655.9, 255.9, 655.5, 256.1, 685.6, 299.3,
-696.0, 315.0, 696.0, 315.0, 706.4, 330.7, 700.6, 324.6, 698.1, 326.9,
-689.7, 323.2, 669.0, 302.6, 669.0, 301.8, 652.8, 277.4, 689.7, 323.2,
-681.7, 319.5, 675.5, 321.6, 673.6, 315.9, 673.6, 315.8, 673.6, 315.8,
-673.5, 315.8, 673.6, 315.7, 663.2, 296.6, 652.8, 277.4, 669.0, 301.8,
-669.0, 302.6, 689.7, 323.2, 521.4, 200.9, 516.3, 200.1, 515.0, 201.9,
-511.1, 199.4, 505.2, 196.6, 505.2, 196.6, 499.3, 193.9, 491.5, 190.5,
-491.8, 189.9, 484.2, 186.0, 456.3, 171.2, 457.3, 169.0, 428.4, 156.5,
-427.8, 156.2, 427.8, 156.2, 427.2, 155.8, 423.8, 153.6, 423.0, 154.3,
-420.4, 151.4, 414.8, 145.9, 415.1, 145.5, 409.3, 140.3, 413.9, 139.4,
-413.9, 139.4, 418.6, 138.4, 425.7, 140.2, 425.1, 142.3, 431.7, 146.3,
-476.5, 173.6, 477.8, 171.7, 521.4, 200.9, 616.4, -54.1, 618.2, -44.7,
-618.2, -44.7, 620.1, -35.4, 629.9, -28.1, 620.1, -14.9, 620.2, 5.5,
-602.6, -10.4, 600.1, -7.7, 580.0, -20.8, 579.0, -36.3, 595.0, -46.3,
-616.4, -54.1, 580.0, -20.8, 578.8, -21.6, 577.6, -21.7, 577.7, -22.4,
-577.3, -31.7, 574.6, -40.2, 577.0, -41.0, 582.2, -57.8, 582.2, -57.8,
-587.3, -74.6, 593.8, -76.3, 595.3, -80.4, 597.6, -88.0, 597.7, -88.2,
-598.1, -88.3, 598.2, -88.1, 605.5, -82.0, 608.1, -83.2, 612.3, -75.3,
-615.4, -75.0, 614.4, -64.7, 616.4, -54.1, 595.0, -46.3, 579.0, -36.3,
-580.0, -20.8, 609.3, 615.1, 609.3, 614.5, 609.2, 614.5, 609.4, 614.0,
-616.4, 598.5, 612.9, 586.0, 623.3, 583.1, 625.3, 579.5, 626.3, 579.7,
-627.2, 575.8, 627.0, 576.2, 627.3, 576.4, 627.3, 576.9, 628.7, 597.0,
-628.7, 597.0, 630.0, 617.0, 631.0, 631.0, 631.0, 631.0, 631.9, 644.9,
-632.5, 653.6, 632.6, 653.6, 633.1, 662.4, 634.6, 686.3, 634.3, 686.3,
-635.9, 710.2, 635.9, 710.5, 636.4, 710.8, 636.4, 710.8, 636.4, 710.8,
-635.9, 710.5, 635.9, 710.2, 636.2, 709.4, 634.9, 708.8, 633.8, 707.5,
-620.9, 661.5, 621.3, 661.4, 609.3, 615.1, 633.8, 707.5, 632.3, 705.6,
-630.8, 703.8, 630.9, 703.8, 624.7, 696.0, 624.7, 696.0, 618.6, 688.3,
-618.4, 688.2, 618.4, 688.0, 618.3, 687.8, 622.9, 652.7, 628.7, 639.7,
-609.2, 615.2, 609.3, 615.2, 609.3, 615.2, 609.3, 615.1, 621.3, 661.4,
-620.9, 661.5, 633.8, 707.5, 696.0, 603.6, 696.3, 604.1, 696.3, 604.2,
-696.7, 604.7, 695.6, 610.5, 701.1, 611.6, 705.5, 618.5, 685.3, 634.3,
-691.7, 642.6, 678.0, 666.8, 683.9, 659.1, 680.8, 656.7, 683.7, 646.7,
-686.2, 637.8, 686.2, 637.8, 688.7, 629.0, 692.4, 616.3, 691.9, 616.1,
-696.0, 603.6, 727.2, 652.4, 737.6, 668.6, 733.2, 676.6, 747.9, 684.8,
-750.0, 690.9, 751.5, 690.4, 755.2, 696.0, 744.3, 704.0, 749.3, 710.8,
-743.5, 725.6, 743.6, 724.3, 741.7, 724.2, 739.9, 722.9, 734.8, 702.4,
-736.2, 702.0, 732.4, 681.1, 729.8, 666.8, 732.9, 653.7, 727.2, 652.4,
-679.5, 761.5, 665.9, 735.7, 670.8, 731.5, 652.3, 710.0, 654.4, 707.5,
-654.4, 707.5, 656.6, 705.1, 664.6, 716.4, 661.9, 718.3, 667.3, 731.5,
-671.8, 742.5, 671.8, 742.5, 676.3, 753.6, 677.2, 755.8, 677.2, 755.8,
-678.1, 758.1, 678.8, 759.8, 678.6, 759.8, 679.5, 761.5, 579.1, 629.3,
-577.6, 632.0, 576.4, 631.8, 576.1, 634.6, 575.6, 633.9, 575.6, 633.9,
-575.0, 633.2, 566.0, 602.2, 564.8, 602.5, 554.6, 571.8, 558.1, 584.8,
-560.0, 584.3, 565.3, 596.8, 572.2, 613.1, 574.3, 612.5, 579.1, 629.3,
-559.9, 507.0, 561.9, 500.3, 563.0, 500.5, 564.0, 493.7, 568.0, 492.8,
-572.1, 492.7, 572.1, 491.9, 576.3, 494.4, 580.8, 495.0, 580.6, 496.9,
-584.7, 505.2, 590.1, 502.5, 599.7, 508.2, 583.8, 515.9, 577.2, 514.0,
-559.9, 507.0, 613.0, 725.3, 604.5, 735.6, 603.8, 735.1, 595.9, 745.9,
-592.5, 750.0, 588.2, 752.9, 589.1, 754.2, 590.3, 743.5, 587.9, 743.2,
-586.8, 732.3, 588.7, 728.1, 593.8, 730.4, 600.8, 728.6, 606.9, 726.9,
-612.1, 728.4, 613.0, 725.3, 576.6, 650.0, 574.9, 663.4, 567.3, 670.3,
-573.1, 676.7, 567.5, 713.8, 563.1, 714.0, 563.4, 751.1, 558.5, 743.3,
-558.5, 743.3, 553.7, 735.5, 559.4, 692.0, 562.7, 692.0, 576.6, 650.0,
-553.7, 735.5, 549.1, 728.1, 549.1, 728.1, 544.4, 720.7, 538.1, 710.3,
-538.0, 710.4, 531.6, 700.1, 547.8, 681.1, 560.5, 679.5, 560.3, 659.1,
-568.5, 654.3, 571.0, 656.4, 576.7, 649.6, 576.6, 649.8, 576.6, 649.8,
-576.6, 650.0, 562.7, 692.0, 559.4, 692.0, 553.7, 735.5, 601.6, 740.8,
-602.5, 740.0, 602.5, 740.0, 603.4, 739.3, 608.2, 747.5, 607.2, 748.1,
-611.1, 756.9, 611.2, 757.0, 611.2, 757.0, 611.2, 757.1, 616.2, 764.3,
-611.1, 767.9, 611.0, 778.7, 611.9, 774.5, 609.9, 774.1, 608.7, 769.4,
-605.2, 755.1, 604.2, 755.3, 601.6, 740.8, 630.4, 715.1, 633.1, 712.6,
-634.5, 713.3, 635.9, 710.2, 635.9, 710.5, 636.4, 710.8, 636.4, 710.8,
-637.3, 715.8, 640.3, 720.1, 643.6, 719.9, 648.2, 734.2, 653.5, 732.4,
-663.5, 745.0, 660.2, 736.0, 655.5, 737.8, 647.5, 730.5, 638.9, 722.8,
-635.8, 724.6, 630.4, 715.1, 556.0, 871.7, 550.9, 851.6, 545.8, 831.4,
-545.8, 831.4, 546.6, 829.6, 545.2, 829.0, 544.5, 826.6, 554.0, 824.7,
-563.2, 824.2, 564.4, 827.7, 569.6, 842.9, 560.9, 845.9, 557.4, 864.1,
-556.7, 867.9, 554.8, 868.6, 556.0, 871.7, 514.8, 533.6, 503.1, 533.1,
-491.9, 530.4, 491.4, 532.6, 486.1, 528.4, 475.4, 529.7, 474.6, 531.9,
-474.7, 530.5, 474.7, 530.5, 474.8, 529.0, 469.2, 522.9, 486.6, 506.8,
-498.4, 484.5, 495.6, 487.0, 501.4, 493.6, 504.5, 502.6, 508.3, 514.0,
-508.3, 514.0, 512.1, 525.5, 513.5, 529.6, 514.9, 533.6, 514.8, 533.6,
-448.4, 376.8, 447.4, 374.6, 447.4, 374.6, 446.4, 372.4, 448.0, 361.3,
-448.9, 361.0, 447.8, 349.9, 451.7, 335.6, 451.7, 335.6, 455.6, 321.4,
-462.3, 334.2, 453.4, 338.8, 451.1, 356.2, 449.7, 366.5, 451.2, 367.0,
-448.4, 376.8, 442.2, 641.3, 444.8, 630.6, 447.3, 619.8, 447.3, 619.8,
-450.4, 607.2, 451.7, 607.4, 453.5, 594.6, 455.3, 625.3, 455.3, 625.3,
-457.1, 655.9, 458.4, 650.7, 444.6, 650.0, 442.2, 641.3, 305.5, 617.8,
-304.9, 615.7, 308.3, 614.8, 311.1, 611.9, 311.6, 612.4, 339.0, 591.0,
-356.8, 563.5, 358.0, 579.6, 358.0, 579.6, 359.2, 595.6, 337.3, 605.7,
-342.0, 615.9, 324.9, 636.3, 323.8, 637.1, 319.9, 631.5, 314.9, 626.8,
-310.2, 622.3, 306.8, 623.1, 305.5, 617.8, 273.1, 632.1, 273.6, 645.9,
-270.9, 655.3, 260.4, 660.1, 260.0, 649.2, 260.0, 649.2, 259.6, 638.3,
-262.0, 633.2, 273.2, 635.0, 273.1, 632.1, 356.6, 461.0, 355.1, 470.8,
-349.6, 477.1, 353.6, 480.6, 347.2, 481.7, 347.2, 481.7, 340.7, 482.8,
-342.5, 471.0, 347.1, 462.7, 356.6, 461.0, 410.9, 428.7, 421.1, 434.9,
-421.1, 434.9, 431.3, 441.1, 431.3, 441.1, 431.5, 441.2, 431.6, 441.3,
-429.9, 448.1, 429.0, 448.0, 428.3, 454.9, 428.0, 458.4, 427.4, 458.4,
-426.6, 461.9, 426.5, 460.5, 422.7, 460.9, 418.9, 459.8, 417.7, 449.6,
-393.3, 452.4, 367.8, 445.0, 367.1, 442.5, 388.9, 430.0, 410.9, 428.7,
-367.8, 445.0, 366.6, 444.6, 365.4, 444.7, 365.4, 444.3, 359.8, 439.8,
-359.8, 439.8, 354.1, 435.3, 368.9, 434.1, 368.0, 423.2, 381.9, 411.1,
-389.8, 423.9, 396.4, 419.9, 410.9, 428.7, 388.9, 430.0, 367.1, 442.5,
-367.8, 445.0, 68.2, 220.7, 67.1, 213.8, 64.9, 213.5, 65.9, 206.9,
-66.4, 193.9, 65.6, 193.9, 66.9, 181.0, 67.2, 178.0, 67.2, 178.0,
-67.4, 175.0, 67.9, 176.4, 68.0, 176.4, 68.6, 177.8, 82.1, 176.7,
-85.3, 216.6, 101.9, 255.4, 102.1, 238.2, 82.5, 239.9, 68.2, 220.7,
-819.3, 199.5, 818.6, 198.6, 817.2, 199.7, 816.1, 198.8, 809.4, 191.8,
-809.4, 191.8, 802.7, 184.8, 805.2, 187.7, 805.6, 187.3, 808.4, 189.9,
-810.7, 191.9, 810.7, 191.9, 813.0, 194.0, 816.1, 196.8, 817.1, 196.1,
-819.3, 199.5, 916.9, 264.8, 867.2, 232.5, 861.1, 193.4, 817.5, 200.3,
-816.8, 199.5, 816.8, 199.5, 816.1, 198.8, 817.2, 199.7, 818.6, 198.6,
-819.3, 199.5, 857.7, 208.5, 857.7, 208.3, 896.1, 217.4, 896.2, 217.4,
-896.3, 217.5, 896.3, 217.7, 906.7, 241.2, 902.2, 261.5, 916.9, 264.8,
-896.3, 217.7, 896.4, 217.7, 896.5, 217.6, 896.6, 217.7, 912.8, 229.1,
-912.7, 229.3, 929.0, 240.6, 934.5, 244.9, 934.5, 244.9, 940.1, 249.1,
-943.0, 254.3, 941.7, 255.7, 941.3, 262.2, 941.3, 262.5, 939.2, 262.7,
-939.3, 263.2, 939.6, 265.2, 925.6, 266.1, 925.5, 269.8, 925.5, 269.9,
-925.2, 269.9, 925.0, 270.0, 922.6, 266.3, 921.0, 267.4, 916.9, 264.8,
-904.8, 242.3, 906.9, 241.2, 896.6, 217.7, 896.5, 217.6, 896.4, 217.7,
-896.3, 217.7, 638.0, 224.2, 633.7, 219.4, 633.7, 219.4, 629.3, 214.7,
-636.9, 207.0, 635.4, 205.6, 641.5, 196.5, 671.3, 221.4, 677.8, 213.5,
-714.1, 230.6, 713.9, 232.2, 675.4, 231.2, 638.0, 224.2, 714.1, 230.6,
-715.0, 231.0, 715.7, 231.6, 715.8, 231.4, 719.2, 235.0, 721.8, 239.3,
-722.0, 239.1, 714.5, 236.3, 704.8, 239.2, 704.8, 239.4, 690.8, 230.9,
-685.6, 239.6, 666.3, 239.8, 656.3, 228.9, 652.4, 224.8, 638.7, 224.9,
-638.4, 224.6, 638.4, 224.6, 638.0, 224.2, 675.4, 231.2, 713.9, 232.2,
-714.1, 230.6, 719.5, 282.8, 723.5, 283.6, 727.4, 284.5, 727.4, 284.4,
-744.5, 291.9, 765.0, 289.6, 764.8, 292.2, 770.3, 294.4, 771.1, 303.5,
-773.3, 302.8, 766.0, 305.3, 763.9, 299.3, 754.4, 295.7, 737.0, 289.2,
-736.7, 290.0, 719.5, 282.8, 725.3, 229.8, 741.4, 229.6, 741.4, 229.6,
-757.4, 229.3, 769.7, 237.1, 769.7, 237.1, 782.1, 244.9, 778.4, 241.6,
-776.7, 243.5, 771.3, 242.0, 748.3, 235.9, 740.9, 244.0, 725.3, 229.8,
-519.0, 181.6, 528.0, 190.6, 526.3, 193.5, 537.0, 199.6, 538.5, 201.6,
-538.5, 201.6, 540.0, 203.6, 532.3, 199.4, 530.7, 202.2, 521.4, 200.9,
-477.8, 171.7, 476.5, 173.6, 431.7, 146.3, 434.6, 169.1, 477.1, 160.4,
-519.0, 181.6, 431.7, 146.3, 425.1, 142.3, 425.7, 140.2, 418.6, 138.4,
-432.6, 135.3, 433.1, 136.8, 446.7, 132.3, 455.3, 131.1, 458.1, 133.7,
-463.7, 128.7, 464.0, 128.4, 464.3, 128.6, 464.8, 128.5, 471.2, 135.4,
-471.8, 134.9, 478.7, 141.4, 503.0, 150.3, 498.8, 161.5, 519.0, 181.6,
-477.1, 160.4, 434.6, 169.1, 431.7, 146.3, 662.2, 550.8, 669.9, 559.1,
-668.4, 560.5, 674.6, 570.2, 678.1, 576.1, 676.7, 578.5, 682.0, 581.7,
-681.3, 582.6, 684.2, 587.1, 685.3, 586.9, 687.4, 596.0, 690.6, 595.2,
-696.0, 603.6, 691.9, 616.1, 692.4, 616.3, 688.7, 629.0, 673.2, 615.5,
-681.1, 606.5, 673.4, 583.9, 669.5, 572.2, 669.5, 572.2, 665.5, 560.5,
-663.8, 555.6, 665.4, 554.2, 662.2, 550.8, 721.2, 708.8, 711.9, 701.9,
-712.2, 701.4, 702.6, 694.9, 693.5, 684.1, 688.8, 682.7, 688.3, 669.9,
-688.6, 678.5, 695.3, 678.2, 702.3, 686.5, 711.7, 697.7, 720.7, 697.3,
-721.2, 708.8, 661.0, 700.0, 661.9, 699.0, 662.6, 699.1, 662.7, 698.1,
-676.1, 684.5, 675.3, 683.7, 687.9, 669.3, 687.9, 669.4, 688.1, 669.6,
-688.3, 669.9, 688.8, 682.7, 693.5, 684.1, 702.6, 694.9, 703.6, 695.6,
-703.3, 696.1, 703.9, 697.2, 692.5, 699.2, 692.3, 698.0, 680.6, 698.7,
-675.1, 699.1, 675.1, 699.1, 669.6, 699.4, 665.3, 699.7, 665.1, 700.8,
-661.0, 700.0, 592.4, 572.5, 589.3, 586.8, 582.8, 599.4, 586.2, 601.1,
-580.0, 612.0, 575.6, 621.5, 580.6, 626.7, 579.9, 628.0, 579.9, 628.0,
-579.1, 629.3, 574.3, 612.5, 572.2, 613.1, 565.3, 596.8, 568.7, 582.3,
-581.8, 570.3, 592.4, 572.5, 565.3, 596.8, 560.0, 584.3, 558.1, 584.8,
-554.6, 571.8, 550.9, 560.4, 544.2, 551.1, 547.1, 549.0, 547.3, 547.2,
-546.7, 546.9, 547.5, 545.3, 549.5, 538.2, 549.5, 538.2, 551.5, 531.1,
-551.5, 531.2, 552.3, 531.5, 552.2, 531.6, 554.8, 533.5, 554.8, 533.5,
-557.4, 535.4, 576.0, 549.0, 579.0, 546.1, 594.5, 562.6, 593.4, 567.5,
-593.4, 567.5, 592.4, 572.5, 581.8, 570.3, 568.7, 582.3, 565.3, 596.8,
-605.0, 514.1, 599.8, 538.4, 599.8, 538.4, 594.5, 562.6, 579.0, 546.1,
-576.0, 549.0, 557.4, 535.4, 560.7, 520.3, 594.6, 506.5, 605.0, 514.1,
-557.4, 535.4, 554.8, 533.5, 554.8, 533.5, 552.2, 531.6, 556.4, 519.4,
-556.0, 519.3, 559.9, 507.0, 577.2, 514.0, 583.8, 515.9, 599.7, 508.2,
-602.6, 509.9, 602.6, 509.9, 605.6, 511.6, 605.8, 511.8, 605.3, 512.9,
-605.0, 514.1, 594.6, 506.5, 560.7, 520.3, 557.4, 535.4, 600.8, 728.6,
-593.8, 730.4, 588.7, 728.1, 586.8, 732.3, 583.7, 702.7, 583.7, 702.7,
-580.6, 673.2, 581.2, 674.9, 583.3, 674.2, 586.0, 675.3, 595.4, 701.2,
-600.4, 701.8, 600.8, 728.6, 586.0, 675.3, 602.3, 681.8, 602.2, 681.9,
-618.6, 688.3, 624.7, 696.0, 624.7, 696.0, 630.9, 703.8, 620.4, 712.7,
-621.9, 714.5, 613.0, 725.3, 612.1, 728.4, 606.9, 726.9, 600.8, 728.6,
-600.4, 701.8, 595.4, 701.2, 586.0, 675.3, 610.8, 800.2, 610.7, 815.3,
-603.2, 821.6, 610.6, 830.4, 610.6, 830.5, 608.9, 830.3, 607.3, 830.2,
-585.8, 828.9, 585.8, 828.9, 564.4, 827.7, 563.2, 824.2, 554.0, 824.7,
-544.5, 826.6, 544.5, 826.3, 544.5, 826.3, 544.4, 826.1, 577.5, 812.9,
-578.6, 798.2, 610.8, 800.2, 611.1, 756.9, 607.2, 748.1, 608.2, 747.5,
-603.4, 739.3, 609.7, 733.6, 609.7, 733.6, 616.0, 728.0, 614.4, 728.3,
-615.2, 732.7, 614.4, 737.3, 614.3, 737.8, 614.3, 737.8, 614.2, 738.3,
-612.7, 747.6, 613.5, 756.7, 611.1, 756.9, 607.3, 830.2, 608.9, 830.3,
-610.6, 830.5, 610.6, 830.4, 616.6, 837.5, 624.6, 834.2, 637.6, 831.9,
-634.0, 839.4, 634.0, 839.4, 630.3, 847.0, 630.3, 846.9, 628.5, 847.7,
-626.7, 848.5, 627.4, 851.2, 590.4, 857.9, 556.1, 872.2, 556.0, 871.9,
-556.0, 871.9, 556.0, 871.7, 554.8, 868.6, 556.7, 867.9, 557.4, 864.1,
-580.8, 845.2, 581.8, 846.3, 607.3, 830.2, 557.4, 864.1, 560.9, 845.9,
-569.6, 842.9, 564.4, 827.7, 585.8, 828.9, 585.8, 828.9, 607.3, 830.2,
-581.8, 846.3, 580.8, 845.2, 557.4, 864.1, 547.5, 499.4, 547.5, 499.8,
-547.7, 500.0, 547.5, 500.3, 536.3, 517.1, 536.3, 517.1, 525.2, 534.0,
-525.1, 533.3, 520.0, 533.8, 514.8, 533.6, 514.9, 533.6, 513.5, 529.6,
-512.1, 525.5, 518.9, 516.3, 521.8, 518.4, 531.4, 511.3, 539.5, 505.4,
-539.3, 505.1, 547.5, 499.4, 451.1, 356.2, 453.4, 338.8, 462.3, 334.2,
-455.6, 321.4, 456.1, 319.7, 457.2, 318.6, 456.6, 318.0, 458.1, 318.4,
-458.1, 318.4, 459.7, 318.9, 457.0, 337.8, 462.6, 349.1, 451.1, 356.2,
-429.2, 696.3, 435.7, 668.8, 435.7, 668.8, 442.2, 641.3, 444.6, 650.0,
-458.4, 650.7, 457.1, 655.9, 457.9, 669.3, 457.9, 669.3, 458.7, 682.6,
-462.2, 696.8, 457.6, 697.9, 456.6, 713.1, 453.4, 715.7, 446.3, 706.8,
-436.1, 700.5, 432.6, 698.4, 429.0, 698.0, 429.2